地図を持っています。マップレイヤーの最上部には、ポリゴン A と円 B があり、互いに交差しています。どのアルゴリズムでも交点 C の面積を計算できますか?
2 に答える
円の近似値 (多数の側面を持つ多角形...) を求めると仮定すると、多角形クリッピングの結果を計算するためのアルゴリズムがたくさんあります (簡単なリストについては、こちらを参照してください)。
簡単な実装は次のようになります。
- 多角形 A の点のどのセットが多角形 B 内にあるかを決定する (逆も同様)
- その内側と外側の境界を横切る線分の交点を決定し、
- 収集されたポイントのセットから新しいポリゴンを構築します。その新しいポリゴンの面積を計算するには、それを三角形のコレクションに分解し、それらの面積を合計します。
そのすべての作業をやりたくない場合は、JS Clipperを試してください。それはおそらくあなたの人生を楽にするでしょう。
円の恣意的な適切な近似でやりたくない場合は、多角形の線分と円の境界との交点を見つけ始めてから、各セクションを区分的に統合する必要があると思います。
これは近似なしで行うことができます:
- 多角形と円の交点を見つける
- 交差領域の境界を構成します - 一連の線分と弧ができます
- グリーンの公式を使用して地域の面積を計算します: http://en.wikipedia.org/wiki/Green%27s_theorem#Area_Calculation -
Integral[border](x*dy-y*dx)
すべての線分について、この積分を計算するのは自明x0*y1-y0*x1
です。
円弧の場合は、もう少し冗長です。最終結果は ですCx*(y1-y0) - Cy*(x1-x0) ) + R^2*(t1-t0)
。ここで、(Cx,Cy)
は円の中心、(x0,y0)
は円弧の始点、 は(x1,y1)
円弧の終点、 は円弧のt0
開始角度、 は円弧のt1
終了角度です。
誰でも導出を検証できるようにするために、以下に示します (確かに、ジオメトリから導出できますが、私は数式を使用して導出しました)。
Integral[arc](x*dy-y*dx)
Integral[t=t0..t1]( (Cx+R*cos t)*R*cos t - (Cy+R*sin t)*(-R*sin t) )dt
Integral[t=t0..t1]( (Cx+R*cos t)*R*cos t + (Cy+R*sin t)*R*sin t )dt
Integral[t=t0..t1]( Cx*R*cos t + R^2*cos^2 t + Cy*R*sin t + R^2*sin^2 t )dt
Integral[t=t0..t1]( Cx*R*cos t + Cy*R*sin t + R^2*sin^2 t + R^2*cos^2 t )dt
Integral[t=t0..t1]( Cx*R*cos t + Cy*R*sin t + R^2 )dt
Integral[t=t0..t1]( Cx*R*cos t + Cy*R*sin t )dt + R^2*(t1-t0)
Integral[t=t0..t1]( Cx*R*d(sin t) - Cy*R*d(cos t) ) + R^2*(t1-t0)
Cx*R*(sin t1-sin t0) - Cy*R*(cos t1-cos t0) ) + R^2*(t1-t0)
Cx*(y1-y0) - Cy*(x1-x0) ) + R^2*(t1-t0)