1

単純な非凸多角形の一連の点があるという問題があります (用語が正しいことを願っています)。しかし、ポイントは必ずしも順番通りではありません (つまり、時計回りまたは反時計回り)。Flash の描画 API で塗りつぶし領域を正しく描画するには、これらのポイントを端に沿って順番に進行させる必要があります (最終的に始点に接続するため)。

デカルト座標のリストを時計回りまたは反時計回りに並べ替えて、「ペンを持ち上げる」ことなくポイントからポイントへとシェイプを描画できる方法はありますか?

多角形の 4 点をソートするという投稿を 1 つ見ましたが、4 点だけの特殊なケースだったと思います。私の図形には最低 6 つのポイントがあります。リストでは、各エントリが少なくとも 1 つの隣接エントリ (前のポイントまたは次のポイント) に (時計回りまたは反時計回りの順序で) 隣接していることが保証されます。例: A, B, D, C... または B, A, D, C... ですが A, C, B, D... ではありません (A, B, C のいずれかになるように並べ替える必要があります、D または D、C、B、A)。この投稿を見つけましたが、回答がないようです:ポイント リストをポリゴンに並べ替える

CPU のパフォーマンスが問題です。しかし、「遅い」解決策でさえ、実装と理解が簡単であれば (次のプログラマーにとって)、効果的なキャッシュメカニズムを考え出すことができれば問題ないかもしれません。

私がしなければならないことの例を示すために写真を添付し​​たいと思いますが、まだ評判ポイントが 10 ありません。とにかく、このポリゴンのリストで 3 番目の例の頂点を並べ替える手段があれば、それは完璧です: http://upload.wikimedia.org/wikipedia/commons/1/1f/Assorted_polygons.svg

私は本当にすべての助けに感謝します、ありがとう!

編集:確かに座標系の中心点を保証できます-それは画面の中心になります。すべてのポイントは 0 と画面の幅/高さの間になります (原点は明らかに幅/高さ / 2 です)。ポリゴンの内部に原点が含まれているとは限りません。まれな例外ですが、説明する必要があります。

ところで、私のセグメントが必ずしも順番どおりではない理由は、それらが Conrec: http://paulbourke.net/papers/conrec/を使用して生成されているためです(それらは等高線です)。以下を使用して、Conrec によって生成された等高線セグメントを注文します。 Conrec を使用して等高線の連続点の配列を組み立てる方法 問題のケースは、地図上の外側の等高線です。それらはマップの端と交差します (つまり、閉じた多角形を形成しません)。この場合、線の始点 (マップの端) に再接続するか、兄弟線がマップに入るまで (最終的に元の位置に戻るまで繰り返します)、マップの境界の端に沿って描画します。点)。次に、領域を描画して、塗りつぶし API を機能させることができます。この情報がお役に立てば幸いです。最善の方法は、ポリゴン頂点の順序付きリストを生成することだと思いましたが、おそらく別のアプローチが必要です。

4

4 に答える 4

1

私はO(n^2)アルゴリズムを考えています:
ポイントが描画される順序で (うまくいけば) あるので、各エッジのエンドポイントを知っています。
開始点を選択し、別のエッジと交差するまで続けます。
次に、そのスポットをマークし、さらに別のエッジまたはエンドポイントに到達するまで、新しいエッジを続行します。エッジを変更するポイントに到達するたびに、それをリストします。スタート地点に着いたら終了です。

于 2011-04-04T01:59:58.200 に答える
0

まあ、あなたはそれを気に入らないでしょうが、それは不可能です. デモンストレーション ポリゴンのすべての線を削除することを検討している場合、それらを別の方法で接続しても有効な非凸ポリゴンが残る可能性があります。それが、非凸ポリゴンの厄介な点です。

于 2011-04-04T01:56:34.760 に答える
0

おそらく、多角形凸面である (つまり、凹面でない) ということです。そうでなければ、あなたがしていることは実際には不可能だと思います(「ドットを結合」して多角形を形成する方法は複数ある可能性があります)。

その場合に私が考えることができる 1 つのテクニック: まず、リストの最初の 2 つの項目が、与えられた規則によってエッジを形成する必要があります。次に、リスト順に表示される頂点を追加してみます。いずれの場合も、結果が凹状にしかならない場合は、結果リストから前の要素を削除して、今のところ無視してください。ソース リストを確認した後、まだスキップした頂点がある場合は、それらのスキップした頂点について続行します。

編集:わかりました、ウィキペディアの例を見ただけで、凸でないことを意味します。残念ながらありえないと思います。

于 2011-04-04T01:59:03.730 に答える
0

問題が一意に解けないことを示す簡単な例は、点 a=(0,0)、b=(2,0)、c=(1,1)、d=(1,2) です。各順序 (a,b,c,d,a)、(a,b,d,c,a) (a,c,b,d,a) は単純な多角形です。

于 2011-04-05T13:02:31.297 に答える