明らかに、より大きな多角形の制約に対してボロノイ図を生成する必要があります。あなたはそれを多角形と呼んでいますが、あなたの例の図にはスプラインベースのエッジがあることに気付きました. それは今は忘れましょう。
あなたがしたいことは、かなり等しい長さのエッジを持つ(あなたによって生成されたか、別のソースから生成されたかにかかわらず)包含ポリゴンから始めることを確実にすることです。分散係数を使用すると、これがより自然に見えます。私はおそらく10〜20%の分散に行きます。
ほぼ同じ長さのライン セグメントで囲まれたポリゴンを含むようになったので、ボロノイ図の生成を開始するための基礎ができました。コンテナーの各エッジについて:
- エッジの法線を決定します (そのセグメントの中心から内側に突き出た垂直線)。
- 新しいボロノイ ノードの中心を配置するスライディング スケールとしてエッジ法線を使用します。エッジ自体からの距離は、平均的なボロノイ セルの「直径」がすべて円である場合、その値によって決定されます。あなたの例では、おそらく30ピクセルのように見えます(または、ワールド単位で同等のものは何でも)。ここでも、分散係数を適用して、すべてのセルの中心がソースの端から等距離に配置されないようにする必要があります。
- 新しく配置したセンターのボロノイ セルを生成します。
- ボロノイ セル ソース ポイントをリストに保存します。
各ポイントを段階的に生成すると、アルゴリズムが凹型コンテナーの各凸型「構成領域」を放射状に分割することがわかり始めます。
何のためのリストなのか疑問に思うかもしれません。明らかに、まだ完了していません。必要なボロノイ テッセレーション全体の一部しか生成していません。凹面空間のこれらの「境界」セルを作成したら、境界セルが既に存在するよりも境界の近くに新しいセルを生成したくない場合は、その領域内にのみそれらを配置する必要があります。境界セルのソース ポイントのリストを維持することにより、作成するその他のポイントがその領域内にあることを確認できます。これは、バッファ ゾーンを確保するために内部ミンコフスキー和を計算することに少し似ています。これで、この派生した凹面の残りのセルをランダム化して完成させることができます。
(警告: この前のステップには注意が必要です。「通路」領域が狭すぎる場合、この派生空間の境界が重なり合い、単純ではない多角形ができて、あなたの努力にもかかわらず間違った場所にポイント. 解決策は、エッジからの最大配置距離が最小通路幅の半分を超えないようにすることです...または、ミンコフスキーの合計を含む他の幾何学的手段を1つの可能性として使用します、縮退した派生ポリゴンに巻き込まれないようにします。マルチポリゴン、つまりフラグメントで終了する可能性は十分にあります。)
私はまだこの方法を自分で適用したことはありませんが、解決すべきバグは確かにありますが、一般的な考え方で正しい方向に進むことができると思います。