この問題には多くの有効な解決策があります。それらの1つは説明と少し似ていますが、「ランダムな」位置でポリゴンをスライスする代わりに、計算量を最小限に抑えるように意図的にそれを行うことができます。
基本的なアルゴリズムは次のとおりです。 その入力は、任意の平面スイープ方向、非ゼロ領域のポリゴンP、ゼロとポリゴンの領域の間のターゲット領域a、および非負のしきい値t(領域単位)で構成されます。その目的は、分割することであるPを右側領域との間の差と目標領域ように、二つの部分、線の左側に線および他の右への1つに掃引方向にライン垂直でないありますtより大きい。
してみましょうLは掃引方向に対して垂直な任意の指向ラインも。f(L)を、Lの右側にあるPの面積からaを引いたものと定義します。これらの用語では、タスクはfのゼロを見つけることです。のでfは微分可能性は低いですが、どちらかの連続使用である二分法、割線法、または-私のfavorite- -Brentの方法。すべてがシンプルで、収束が保証されています。引数の収束許容誤差にtを使用します。
それでおしまい。これをコーディングすることについて考えてみましょう。ルートの発見は日常的であり、汎用のコードチャンクを使用することができます。そのため、GISの作業はfのコーディングになります。そのためには
1. Splitting the polygon by a line.
2. Computing the area of the piece(s) to the right of the line.
両方の操作は、ほぼすべてのベクターベースのGISで実装されています。そうでない場合は、線の右側の半平面を表す非常に大きな長方形で線を置き換えることができます。ステップ1は
1'. Clip the polygon to the rectangle.
これは本当に基本的な操作です。
ルート検索を開始するには、fのゼロが存在することが保証されている区間を見つける必要があります。これは簡単です。ポリゴンのエンベロープ(「境界ボックス」)をラインスイープの方向に投影します。投影は、必要な間隔です。
この質問には長い歴史があります。ArcView 3.xにこのアルゴリズムを実装したのはずっと昔で、古いESRIユーザーフォーラムで何度も説明しました。グーグル
huber split polygonサイト:forums.esri.com
ディスカッション、コードへのリンク、拡張機能およびバリエーション(ポリゴンを可能な限りコンパクトな所望のサイズの部分に分割するなど)およびラスターデータのアルゴリズム。
ここに、米国本土の州がどのように見えるか(等面積投影法で)、各州の下部3分の1に影が付けられています。明らかに、掃引方向は垂直でした。