パス

2016-03-15 6 views
12

にフィットして下さいバウンディングボックスは、我々はこのパスを持っていると言う:パス

enter image description here

我々は内部に収まるボックスの境界を見つけるにはどうすればよいですか?

はい私は、パスが任意に複雑な可能性があり、閉じてはいけないことを知っています。この問題を解決する方法の提案についてはまだ興味があります。

+0

何が難しいですか?境界ボックスは、x座標とy座標の最大値と最小値の間にあります。 – Ben

+0

@Benシェイプ内で最大と最小の座標をどうやって見つけるのが問題だと思います...丸い角のようなものは難しくなります。 –

+1

バブルの途中でボックスを検索すると、下の三角形の内側から開始した場合とは異なる結果になるため、アルゴリズムの開始座標を指定する必要があります。これは、より多くのコンパイルパスではさらに真実です。 – ensisNoctis

答えて

3

私は簡単な答えで行くと思います。一番下の外に出ることは、最大の内部矩形のサイズには影響しませんので、省略することができます。それが省略されると、の2つのようなものになり、それらはRadiusXRadiusYのプロパティがゼロ以外のものになります。あなたの質問は、一般的にその境界線を重複することなく内部RectangleGeometryの内側に収まる最大の矩形を見つける方法に帰着私に

<Path Fill="Black"> 
    <Path.Data> 
     <CombinedGeometry GeometryCombineMode="Xor"> 
      <CombinedGeometry.Geometry1> 
       <RectangleGeometry Rect="10,10,100,50" RadiusX="5" RadiusY="5" /> 
      </CombinedGeometry.Geometry1> 
      <CombinedGeometry.Geometry2> 
       <RectangleGeometry Rect="15,15,90,40" RadiusX="5" RadiusY="5"/> 
      </CombinedGeometry.Geometry2> 
     </CombinedGeometry> 
    </Path.Data> 
</Path> 

:私が作った

近似は、以下のXAMLで与えられます。これを行うには、RadiusXRadiusYの値を扱わなければなりません。私はRadiusX = RadiusYことを前提としています今のところ、物事を単純化するために

!= 0とあなたがRadiusXの場合に興味を持つことが起こるならば!= RadiusY我々はそれを得るとき!= 0その後、我々はその橋を渡ることができます。

xとyの半径が等しい場合、湾曲したコーナーは円形を使用してトレースされます。この円は、内部のスペースを短縮し、半径の値が画像の幅と高さに比べて小さいため、湾曲したコーナーの45度の角度に当てはまる境界の四角形を探している可能性があるためです。

これを達成するには、1つのコーナーで失う幅と高さを把握するだけです。我々は円を話しているので、45度の角度を考慮すると、損失は両方向で同じになります。 ( - SQRT(2)/ 2 1)

これは決定することによって誘導された単一のコーナー方向について

損失= R:いくつかの簡単な三角法を用いて、IはRの半径の値を与えられる以下の損失量を思い付い非丸めバージョンの角から丸み円の45度の辺までの距離。この長さは、Pythagoreanの定理を使って円の半径の長さと「欠落」部分を決定し、既知の半径を差し引いて、この「欠落」部分の斜辺の長さを決定することによって、ちょうど集められますR(1 - sqrt(2))に等しい。

この距離が収集されたら、先ほどリストした式であるR(1 - sqrt(2)/ 2)に出てきた二等辺三角形の脚のサイズを再び三角法で計算しました。

最後に、x = x_o、y = y_o、width = w_o、height = h_o、R = RadiusX = RadiusY! -
Y = y_o + R(1 - SQRT(2)/ 2)

X = x_o + R(SQRT(2)/ 2 1):= 0我々は内接矩形の以下になるだろう幅= w_o - 2R(1 - SQRT(2)/ 2)
高さ= h_o - 2R(1 - SQRT(2)/ 2)

Iは、次のXAMLでこれをテストした:

<Path Stroke="Black"> 
    <Path.Data> 
     <RectangleGeometry Rect="10,10,100,50" RadiusX="5" RadiusY="5"/> 
    </Path.Data> 
</Path> 
<Path Stroke="Orange"> 
    <Path.Data> 
     <RectangleGeometry Rect="11.47,11.47,97.07,47.07" RadiusX="0" RadiusY="0"/> 
    </Path.Data> 
</Path> 

これは、重複する各矩形ジオメトリの実際のストロークを考慮していませんが、内部は重複しませんそれは私があなたが探しているものと仮定しているものです。

私はここにかなりの数の仮定と単純化があることを知っていますが、これらのすべてでも非常に長い投稿ですので、これがあなたが探しているものに十分適していることを期待しています。