ポリゴンに同じサイズのエリアを生成する


8

n与えられたポリゴンで同じサイズのエリアを見つける疑似コードロジックを探しています。一致した領域の間または領域の外側にスペースがあってはなりません。エリアの最初の有効な一致が返されます。

[2,2, 3,1, 5,1, 5,4, 4,5, 2,3]入力として次のポリゴンを想定:

ここに画像の説明を入力してください

...そして3パラメータとして有効な出力は次のようになります[ [2,2, 3,2, 3,3, 4,3, 4,5, 2,3], [2,2, 3,1, 5,1, 4,2, 4,3, 3,3, 3,2], [4,5, 4,2, 5,1, 5,4] ]

ここに画像の説明を入力してください

パラメータ付きの別の有効な出力3[ [3,4, 3,3, 4,3, 4,2, 3,2, 3,1, 2,2, 2,3], [4,3, 4,2, 3,2, 3,1, 5,1, 5,3], [3,4, 3,3, 5,3, 5,4, 4,5] ]次のとおりです。

ここに画像の説明を入力してください

エリアは同じ中心点を共有する必要がないことに注意してください。1つ以上の領域が、ポリゴン内の他の領域の間にちょうど入る場合があります。

次に、サンプル入出力の別の例を示します。

[1,3, 1,1, 7,1, 7,2, 8,2, 8,3, 5,6, 4,6]入力として次のポリゴンを想定:

ここに画像の説明を入力してください

..そして5パラメータとしての有効な出力は次のようになります[ [1,3, 1,1, 3,1, 3,2, 4,3, 3,4, 3,3], [3,2, 3,1, 7,1, 7,2, 6,2, 6,3, 5,3, 5,2], [6,2, 8,2, 8,3, 6,5, 5,5, 5,4, 6,4], [1,3, 3,3, 3,4, 5,5, 6,4, 6,5, 7,5, 6,6, 5,6], [3,4, 4,3, 3,2, 5,2, 5,3, 6,3, 6,4, 5,4, 4,5] ]

ここに画像の説明を入力してください

次の仮定が行われます。

  • すべての境界線の方向は45で割り切れる

  • 整数座標はすべてのポリゴンに使用されます

  • 入力ポリゴンの整数領域は常に n

  • 全てのポリゴンのいずれかであってもよい凸面または凹面のもの

  • 解決可能、つまりnエリアが指定されたポリゴンに適切に収まることを意味します


1
あなたの研究を共有することはすべての人を助けます。何を試したか、なぜそれがニーズを満たさなかったかを教えてください。これは、時間をかけて自分自身を助けようとしたことを示しており、明白な答えを繰り返すことから私たちを救い、そして何よりも、それはあなたがより具体的で適切な答えを得るのに役立ちます。また、How to Ask
gnat

あなたは、「等分布」ではなく「等サイズ」の領域を意味していると思いますか?
Doc Brown

@DocBrown正解です。私はここで何か問題が発生することを知っていました。私は間違いなく同じサイズを意味しました。修正済み
セルゲイルキン

あなたの例のように、入力ポリゴンは常に凸形ですか?
Doc Brown、

@DocBrownどの形式も実際に機能します。どこかで見たもので、それが主要な形式だと思ったので、私はこの形式を選択しましたが、修正したいです。
セルゲイルキン

回答:


6

解決できません。それができないことに気づくまで、私はいくつかの方法を試しました。

エリア4の形状を想定します。エリア4は、それぞれエリア2の2つの部分に分割する必要があります。

四角

左端の三角形と正方形は形状1の一部である必要がありますが、別の三角形が必要です。取得できる唯一の場所は右側の正方形ですが、残りは2つの領域に分割されます。


2
もちろん一般的には解決できませんが、OPは、解決できるそれぞれの場合の問題を解決するアルゴリズムに興味があると思います。そうでなければ、解決できないことを出力します;-)賛成票も与えてください。
Doc Brown、

良いキャッチ。私はそれについて考えませんでした。エリアが他のエリアによってインターセプトされないパス座標で構成されている限り、エリアが有効であるという仮定を追加することもできます。その結果[ [0,1, 2,1, 2,2, 3,2, 2,3, 2,2 1,2], [2,2, 2,0, 3,0, 3,2] ] 、関数がすべてのバリアントを反復し、見つからなかった場合に例外がスローされるという事実を受け入れます。試合。どう思いますか?
Sergey Lukin、2016

簡単にするために、ポリゴンとエリアの数の解決可能なバリエーションのみが入力として渡されるという仮定を追加しました。私の編集を参照してください。ありがとう
セルゲイルキン

6

Doc Browns(そうでなければ優れた)の回答に対する私のコメントで述べたように、四角形から三角形への分割の選択の問題があり、アルゴリズムのデバイス化が少し難しくなります。また、あなたがそれを連続的にする必要はありませんが、私の提案のいくつかが示すように、並行してそれを行うことができます。

最初はいくつかのヒューリスティックなアプローチをとりました。

ボロノイ: 形状でNポイント(非整数座標)を選択し、ボロノイマップを作成します。ポイントがそれらの領域に対して互いに引き付けられ、反発するようにします(引き付けが大きすぎる、反発が小さすぎる)。

大きなA / Nに役立ち、極大値に陥りやすい。

Circleメソッド: 目標は、問題のある領域を削除してから、別のメソッドを引き続き使用することです。

内部のポイント(非整数)と半径rを選択します。内部から円を引いたものは、k個の切断されたサブ領域を作成します。サブリージョンのサイズがA / nの場合は、削除します。また、いずれかが2 * A / nの場合は、簡単に分割して削除することもできます。半径を少し下げて続行します(おそらくバイナリ検索を使用します)。

問題のあるポイントの増加: Doc Brownが言及する方法の使用を開始しますが、ほとんどのエッジには2つの選択肢があるため、グラフをスキップし、境界線上の各領域を拡張して、新しい問題のあるポイントをできるだけ少なくします(問題のあるポイント=三角形のみ)。 1つのエッジを残りの形状と共有する)。たとえば、含める新しい近傍を選択するときは、凸の順に追加します(凹=負の凸)

リボンの成長: ほぼ凸状または凸状の領域。外縁上の点を選択し、適切な長さになるまで単位幅のリボンを外縁に沿わせ、新しい切断点を作成しないようにします。必要に応じて、最後の三角形をスキップして、幅がわずかに大きくなるようにします。最後の領域が適切なサイズになるまで、最後のリボンが終了したところから次のリボンをたどります。

ゲームライクまたはオーガニック: Nの「国」を作成します。それらをランダムなスポットに置きます。それらを有機的に成長させましょう。彼らが出会ったとき、最小の現在の面積を持つものが最も強く、三角形に勝ちます。おそらく極大になりやすいですか?


3

一般的な戦略は、エリアA / nの最初の部分をポリゴンP0(Aは合計エリア)から削除して、エリアAA / nの新しいポリゴンP1を残すことです。次に、これを繰り返してポリゴンP2、次にP3を作成します。n回の繰り返しの後、解が得られます。各ステップで、残りのパーツがまだ接続されたポリゴンを形成しているような新しいピースを見つけることができない可能性があることに注意してください。この場合、1つのステップに戻って別のピースを見つけるか、結果なしでアルゴリズムを停止する必要があります。 。

このようなサイズA / nのピースを作成するには、まずポリゴンを「グリッドピース」に分割します。ポリゴンの内側のグリッドスクエアはこのようなピースを形成し、ポリゴンの境界線がスクエアを2つに分割する三角形のハーフスクエアを形成します。このためにポイントインポリゴンテストを利用し、ポリゴンのバウンディングボックス内のすべての半分の正方形を反復処理し、それらの中点が指定されたポリゴン内にあるかどうかをテストできます(正方形の両方の半分が含まれている場合は、代わりに完全な正方形)。次に、平面グラフを作成します、各ピースは頂点を定義します(「面積」または「重み」は1または1/2です)。そのグラフのエッジは、隣接するピースによって与えられます。これにより、幾何学的な問題がグラフの問題に減ります。グラフの問題では、総重みA / nの頂点を持つ接続されたサブグラフを探していて、残りのグラフはまだ接続されています。

後者の問題は、バックトラッキングによって解決される可能性がありますアプローチ。接続を解除せずにグラフから削除できる1つの頂点から始めます。必要に応じて、頂点をランダムに選択するか、すべての頂点のリストをランダムに1回シャッフルして、次の手順で再利用できます。次に、最初の頂点に接続されている2番目の頂点を見つけます。これは、その接続性を壊すことなく残りのグラフから削除することもできます。複数の可能性がある場合は、ランダムに1つ選択してください。正方形を表す頂点の場合、いずれかの方法で正方形を2つの三角形に分割する(これにより重み1/2の新しい頂点が作成される)グラフ操作を許可することもできます。これは、1つの頂点を元のグラフからサブグラフに移動するよりも少し複雑ですが、それほど難しくはないはずです。

サブグラフが総重量A / nに達するか、別の頂点が見つからなくなるまで、これを繰り返します。その場合は、1つのレベルを「バックトラック」して、最初に別の頂点を試してください。

これを最適化するにはいくつかの方法があります。たとえば、グラフの高速接続テストを選択する必要があります。このサブ問題のアルゴリズムがたくさんあると思いますか、Googleを使用するか、ここから始めてください。1つの頂点が削除されたときに、接続されたグラフがまだ接続されているかどうかをすばやく確認できるアルゴリズムを探す価値があるかもしれません。

お役に立てれば。


これはまさに私が必要としたものに聞こえます。私はこの戦略を理論的に描きましたが、これまでのところすべての理にかなっています。今こそそれを実践するときです。何か見せたいときは報告します。どうもありがとうございます!
Sergey Lukin、2016

このアプローチには少し問題があると思います。正方形ごとに、三角形の選択肢が2つあります。それらのすべてを実際にチェックして、1つが存在する場合の解決策を保証するには、2 ^ nのすべての選択に対してそれを行う必要があると思います。
NiklasJ 2016

@NiklasJ:正解です。これを考慮に入れて改善された回答をご覧ください。
Doc Brown

@SergeyLukin:NiklasJのコメントを考慮するために、答えを少し変更しました。
Doc Brown、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.