web-dev-qa-db-ja.com

余分な面積を犠牲にして2D凸包を単純化するアルゴリズム

それを解決するのに役立つ可能性がある次の問題に関連するアルゴリズムはありますか?

いくつかのポイントセットに凸包を作成しました。境界線(または面積)をできるだけ小さくして、単純化(ポイント数を減らす)したいと思います。新しい簡略化されたポリゴンが元のハルと交差しないようにする必要があります。

私が実装しようとしている基本的なアイデアは、このポイントの削除によって追加されたポリゴンの周囲の各ポイントについて計算することです。次に、最も安価なポイントを削除します(削除すると、境界線に最小値が追加されます)。

そのため、追加された境界線または面積の値が適切で、クレテリアを通過する間、ポイントを繰り返して削除し続けます。

ここに問題があります:

ポイントp1を削除するとき、前のポイントp0と次のポイントp2によって形成される新しいエッジを導入します。この新しいEdgeは、最適でないか、無効である可能性があります(元のハルと交差しています)。したがって、境界線を有効かつ可能な限り小さく保つために、エッジに沿ってポイントp0とp2を調整したいと思います。

これらの調整されたp0とp2の位置を見つけるにはどうすればよいですか?

enter image description here

更新:

私の現在の問題は、新しい(緑の)エッジの最適な勾配を見つけることだと思います。しかし、私は関連する提案やアルゴリズムを楽しみにしています。

1
Anton Petrov

ポリゴンに追加する三角形の領域を考えます。定義を簡単にするために、p0 Edge e0を定義する行とp2 Edge e2を定義する行を呼び出します。

e0 = p0 + u * s0 , where s0 is the slope of e0
e2 = p2 + v * s2 , where s2 is the slope of e2

area(p0p0'p1) = ||p0-p0'|| * distance(p1, e0) 

そして

area(p2p2'p1) = ||p2-p2'|| * distance(p1, e2)

p2'は、p0'p1を通る線とe2の交点によって与えられます。つまり、最適化する変数は1つだけ(e0からp0 'までの距離)で、上限(p2'はp2またはv >= 0よりもポリゴンに近づけることはできません)と下限( p0 'は、p0またはu >= 0)よりもポリゴンに近づけることはできません。

これでニースの二次最適化問題が得られると思います。

2
kutschkem

私の意見では、このようにポイントを移動するのではなく、ポイントを追加することだけを検討する方がおそらく簡単です。

点A、B、C、Dの場合、ABCDがAB'Dに含まれ、AB'Dの面積が最小になるような点B 'を見つけます。

B 'を見つけることは実際にはそれほど難しくありません。ABとCDによって定義される線の交点を見つけます。これはB'です。 ABCDをAB'Dに置き換えると、BB'Cの領域が凸包に追加されます。

次に、最初の直感に従って、最小面積を追加するB 'ポイントを繰り返し追加することにより、貪欲に最適化できます。 (または他の方法で最適化する)

1
kutschkem

私の提案、p0、p1、p2が与えられた場合、ここでp1を削除します:

v1 = p2 - p0
v2 = p1 - p0
v3 = project v2 over v1
v4 = v2 - v3
p0 = p0 + v4
p2 = p2 + v4

アイデアは、p0からp2への新しいセグメントがあり、その上になるまでp1に向かって移動することです。これにより、ポリゴンが少ないポイントで定義され、面積が広がり、元のポイントがすべて含まれるようになります。 もちろん、これは凸多角形でのみ機能します。これはあなたが持っているものです。

1
Theraot

何度も編集しましたが、これはいくつかのケースしか処理しないことに気づきました! -以下を参照してください

これがあなたのラインに最適なポジションです:

enter image description here

この場合、pの新しい位置2 周囲の面の延長線の交点、またはstellation頂点です。多くの場合、最適な凸包の面は、元の凸形状の面と一致します。エッジとして保持する元の面を6つ選択しています。これらのうち2つは、新しい頂点で交わるように拡張する必要があります。

実際、単純化しようとしている形状の場合、それらは保持するのに最適な面ではありません。辺の数を1つ減らすためのより良い方法があります。

enter image description here

ここで追加された三角形は、上記の例で追加された三角形よりもかなり小さくなっています。最適なソリューションを見つけることは、さまざまなオプションをすべて比較し、面積が最も少ないものを選択することです。面の数を5に減らすには、これが最適なソリューションです。

enter image description here

4つの面の場合、これが最適なソリューションです。

enter image description here

3つの面の場合:

enter image description here

常にnの面を選択して保持し、場合によっては外側のエッジとして延長し、面の最適な組み合わせを選択して、結果として得られる面積を最小にします。

このアプローチが最適でない場合があります。

たとえば、単純な凧があるとします。上記の私のスキームに従ってドロップできる可能性のあるサイドが2つしかないことは明らかですが、これらのオプションのどちらよりも優れた解決策があることは明らかです。

enter image description hereenter image description here

そして、長方形をどのように扱うでしょうか?上記の私のテクニックのように、実際に単純に破棄できる面はありません。それにもかかわらず、それを三角形で囲むことは可能です。

enter image description hereenter image description here

この答えは、部分的な解決に役立つ場合に備えてここに残します-多くの場合、それは良い結果をもたらします-しかし、完全な解決策としては満足できません。

0
Ben Whitmore