2011-07-04 9 views
7

を記述する場合のアルゴリズムを見つけるには?ポイントのセットが、私はN点の集合が凸多角形か</p> <p>そのための良いアルゴリズムがある場合、私は思っていたを記述するかどうかを確認したいと思い凸enveloppe


1.Convexハルアルゴリズム::セットは彼の凸包に等しい場合、それは凸

です。ここ

は、私が考えるいくつかのアプローチです。そのようなアルゴリズムの複雑さは、O(n * LN(N))である。しかし、私はそれが車輪に蝶を壊すような感じだった。


角度で3.Looking:

それから私は、2つの連続ベクトルの角度が180°を超えないかどうかをチェックする考え。 私のポイントは注文されていないので、3つの連続ポイントのすべての組み合わせをチェックする必要があり、それはO(n3)の複雑さのようになります(それ以上に良い方法があるはずです)

例えば右から左にが、結果は常に予想1ではありません。私は左から右に取るならば、この場合には、私は凸形状を見つけるたとえば

このためので

enter image description here

解決策ポイントを選択するには良いアルゴリズムが必要な場合があります。


3.重心を見て:

私は形がないの凸状である場合、すべての3 consecutivesポイントのbaricenterは形状の内側にあるかどうかをチェックすると、私に教えてくれると思います。このソリューションの

enter image description here

私は問題なく左から右にポイントを選択することができる:ここ

私は(Gは、各三角形のbaricenterである)を意味するものです。 Gが形状にあるかどうかをチェックする複雑さがO(N)である場合、全体の複雑さはO(N2)のようになるであろう。

あなたはこの問題を解決するか、私はGrahams Scanにウィキペディアから始まることを考えていた事前

+5

方法1の簡単な提案:実際に凸包を構築するのではなく、アルゴリズムを実行してすぐに終了するか、またはポイントを破棄すれば終了します。 – user786653

+0

私はthat.thanksを見てみるつもりです –

+2

私のコメントの編集ウィンドウを逃した。 'アルゴリズム' = [Grahamsスキャン](http://en.wikipedia.org/wiki/Graham_scan)(これは、あなたの方法2がbtwを示唆するものを多かれ少なかれ実行します)。また、これは漸近的な実行時間を改善しないことを知っていますが、問題を並列化するのが非常に簡単です。 – user786653

答えて

3

入力が単純​​なポリゴンの場合は、線形時間で行うことができますが、それはあまり明らかではありません。あなたは、以下のウェブページについて読むことができ、この問題への間違った解決策の長い歴史があります:

http://cgm.cs.mcgill.ca/~athens/cs601/

今日は、広く、この問題を解決するための最も簡単な/最良の方法はMelkmanのを使用することであることが認められていますアルゴリズム:あなたは、単純な多角形を持っていない場合は、ただの普通の凸包の問題を取り、ポイントを接続することができるので、その後、最悪の場合には、それは(通常の凸包ほど難しいです

http://softsurfer.com/Archive/algorithm_0203/algorithm_0203.htm#Melkman%20Algorithm

任意のナンセンスポリゴンを得るために任意に)。

+0

ありがとうたくさん私はこのアルゴリズムを慎重に見ているgonaです –

1

感謝を考えています解決策を改善するための良いアルゴリズムに私に助言してくださいすることができ:

います極点をポイントとするソートポイント[1]までのすべてを含むその後、

は:

for i = 3 to N: 
    if ccw(points[i-2], points[i-1], points[i]) < 0: # Note this inequality might need checking 
     return NotConvex 
return Convex 

ソートと凸部のチェックの両方が並列によく自分自身を貸すし、必要に応じてさらにスピードアップのためにマージすることができます。

関連する問題