これはとても良い質問です。少し前に、同じアルゴリズムをc#に実装しました。アルゴリズムは、2つのポリゴンの共通の輪郭を構築します(つまり、穴のないユニオンを構築します)。ここにあります。
手順1.ポリゴンを説明するグラフを作成します。
入力:最初のポリゴン(nポイント)、2番目のポリゴン(mポイント)。出力:グラフ。頂点-交点のポリゴンポイント。
交差点を見つける必要があります。両方のポリゴン[O(n * m)]のすべてのポリゴンの辺を反復処理し、交差を見つけます。
ステップ2.作成されたグラフを確認します
グラフの作成時に交点が見つからなかった場合は、次のいずれかの条件があります。
- Polygon1にはpolygon2が含まれています-polygon1を返します
- Polygon2にはpolygon1が含まれています-polygon2を返します
- Polygon1とpolygon2は交差しません。戻り値polygon1ANDpolygon2。
手順3.左下の頂点を見つけます。
最小のx座標とy座標(minx、miny)を見つけます。次に、(minx、miny)とポリゴンのポイントの間の最小距離を見つけます。この点が左下の点になります。
ステップ4.共通の輪郭を作成します。
左下の点からグラフをトラバースし始め、グラフに戻るまで続けます。最初に、すべてのエッジを未訪問としてマークします。すべての反復で、次のポイントを選択し、訪問済みとしてマークする必要があります。
次の点を選択するには、反時計回りに最大内角を持つエッジを選択します。
2つのベクトルを計算します。現在のエッジのvector1と、次にアクセスされていない各エッジのvector2です(図を参照)。
私が計算するベクトルの場合:
- スカラー積(ドット積)。ベクトル間の角度に関連する値を返します。
- ベクトル積(外積)。新しいベクトルを返します。このベクトルのz座標が正の場合、内積は反時計回りに直角になります。それ以外の場合(z座標は負)、ベクトル間の取得角度を360-内積からの角度として計算します。
その結果、最大角度のエッジ(および対応する次の頂点)が得られます。
渡された各頂点を結果リストに追加します。結果リストはユニオンポリゴンです。
備考
- このアルゴリズムを使用すると、複数のポリゴンをマージして、ポリゴンのペアを繰り返し適用できます。
- 多くのベジェ曲線と線で構成されるパスがある場合は、最初にこのパスを平坦化する必要があります。