web-dev-qa-db-ja.com

元の詳細なポリゴンを含む簡略化された(または滑らかな)ポリゴン

非常に大きな頂点のセットによって定義される詳細な2Dポリゴン(地理的領域を表す)があります。結果のポリゴンのareaという制約の下で、ポリゴンを単純化および平滑化する(頂点の数を減らす)アルゴリズムを探しています。詳細なポリゴンのすべての頂点が含まれている必要があります。

コンテキストとして、1つの複雑なポリゴンのエッジの例を次に示します。

enter image description here

私の研究:

  • 頂点の数を減らすRamer–Douglas–Peuckerアルゴリズムを見つけましたが、結果のポリゴンには元のポリゴンのすべての頂点が含まれるわけではありません。この記事を参照してください ウィキペディアのRamer-Douglas-Peucker

  • ポリゴンを拡張することを検討しました(これは外向きのポリゴンオフセットとも呼ばれます)。私はこれらの質問を見つけました: ポリゴンの拡張(凸面のみ) および ポリゴンの膨張 。しかし、これによってポリゴンの詳細が大幅に減少するとは思いません。

あなたが私に与えることができるアドバイスをありがとう!

34
mbrenig

編集

2013年の時点で、以下のほとんどのリンクは機能しなくなりました。しかし、私は 引用された論文、アルゴリズムが含まれ、この(非常に遅い)サーバーでまだ利用可能 を見つけました。


Here あなたはあなたの問題を正確に扱っているプロジェクトを見つけることができます。これは主にポイントで「埋められた」領域で機能しますが、「境界」タイプの定義で機能するように設定できます。

領域の計算には、k最近傍法を使用します。

サンプル:

enter image description here

Here 紙のコピーをリクエストできます。

どうやら彼らは 計算を要求するためのオンラインサービス を提供する予定でしたが、私はそれをテストしませんでした、そしておそらくそれはそうではありません ' t実行中。

HTH!

18
Dr. belisarius

私は非常によく似た問題を抱えていました。ポリゴンを膨らませて単純化する必要がありました。

凹点を削除する(ポリゴンサイズが大きくなる)か、凸エッジ(2つの凸ポイントの間)を削除して隣接するエッジを延長するという単純なアルゴリズムを実行しました。いずれにせよ、これら2つの可能性のいずれかを実行すると、ポリゴン上の1つのポイントが削除されます。

面積の変動が最小になるポイントまたはエッジを削除することにしました。簡略化に問題がなくなるまで(たとえば、200ポイント以下)、このプロセスを繰り返すことができます。

2つの主な問題は、高速アルゴリズムを取得すること(頂点/エッジ除去の変動を2回計算することを回避し、ソートされた可能性を維持することによって)とプロセスに自己交差を挿入することを回避することでした(実行と説明は非常に簡単ではありませんが、計算の複雑さは限られています)。

実際、よく調べてみると、エッジ除去に適応したVisvalingamのアイデアと似ています。

2
Renaud

それは興味深い問題です!私はこのようなことを試したことがありませんが、これが私の頭の上のアイデアです...それが意味をなさないか、うまくいかない場合はお詫びします:)

  1. 凸包を計算します。大きすぎる/不正確である可能性があります
  2. 船体をN個のスライスに分割します。たとえば、船体の各頂点を中央に結合します。
  3. オブジェクトと各スライスの交差を計算します
  4. 交差点ごとに再帰的に繰り返します(交差点の船体の計算など)

再帰の各レベルは、より良い近似を与えるはずです....満足のいくレベルに達したら、そのレベルのすべての船体をマージして、最終的なポリゴンを取得します。

それは仕事をすることができるように聞こえますか?

1
Romain

Visvalingamのアルゴリズム この目的に適合させることができると思います-面積を減らす三角形の削除をスキップすることによって。

1

あなたが何をしようとしているのかはある程度わかりませんが、2つの非常に良い答えがあるようです。 1つはRamer–Douglas–Peucker(DP)で、もう1つはアルファ形状(凹包、非凸包などとも呼ばれます)の計算です。アルファ形状について説明している最近の論文を見つけて、以下にリンクしました。

個人的には、ポリゴン拡張を使用したDPが最適だと思います。頂点の数が大幅に減らないと思う理由がわかりません。 DPを使用すると、係数を指定して、入力内容に関係なく、最終的に三角形になるまで、任意の要素を作成できます。この要素を選ぶのは難しいかもしれませんが、あなたの場合はそれが最善の方法だと思います。削除したい詳細の最大ビットのサイズに基づいて係数を決定できるはずです。これは、直接テストするか、ソースデータから計算することで実行できます。

http://www.it.uu.se/edu/course/homepage/projektTDB/ht13/project10/Project-10-report.pdf

0
Greg Breland