与えられたポイント座標のセットから境界座標を見つけますか?


18

座標のセットが与えられた場合、境界座標をどのように見つけますか。
座標のセット <== 図1
上記のセットの座標を考えると、赤い境界線上の座標を取得するにはどうすればよいですか。境界は、面積を最大化するような方法で、頂点の入力座標によって形成されるポリゴンです。

私は、都市の「x」マイル以内の物件を検索するアプリを開発しています。私が持っているのは:

  1. すべてのプロパティの座標。
  2. 各都市の座標セット(各郵便番号に1つの座標があります。ほとんどの都市には複数の郵便番号があるため、すべての都市には座標セットがあります)

最大面積を求めている理由は、以下のようなポリゴンを思い付かないようにするためです。

曲がったポリゴン <== 図2

必要なのは、境界の座標のセットを思いつくアルゴリズムです。図1の境界座標を思いつくことができるアルゴリズム。



4
いいえ、これは、凹凸包ではない、重複しない
ニクラス・アベン

1
特定の既存のソフトウェア環境でコード、理論的参照、またはソリューションを探していますか?
ウルフオドラード

1
@Khajaいいえ、面積を最大化するのではなく、ポイントを含むすべての多角形の中で面積を最小化します。(面積を最大化する唯一の方法は、包含ポリゴンとして全世界を使用することです。)
whuber

1
@whuberええ、今、私はあなたの意味がわかりました、最小面積の凸多角形が欲しいです。私の最終的な目標は、近接検索を行うことです。私たちは仕事に私たちの近接検索が望む方法:指定された都市(凸包)では、私たちは「×」マイル以内(各家庭の座標を持っている)の家を探している場合、それは私にすべて与えるべきのどちらかである内側を凸包 または 「x」マイル未満の直交距離にある
Khaja Minhajuddin

回答:


21

この問題を解決する多くのアルゴリズムがあります(ウィキペディア「Convex_hull_algorithms」):

  • ギフト包装、別名Jarvis march — O(nh):最も単純なアルゴリズムの1つ。O(nh)時間の複雑さを持ちます。ここで、nはセット内のポイントの数、hはハル内のポイントの数です。最悪の場合、複雑度はO(n2)です。
  • Grahamスキャン— O(n log n):わずかに洗練されていますが、はるかに効率的なアルゴリズムです。ポイントが既に座標の1つまたは固定ベクトルへの角度でソートされている場合、アルゴリズムはO(n)時間かかります。[ 擬似コード ]
  • QuickHull:クイックソートアルゴリズムと同様に、O(n log n)の予想される時間の複雑さがありますが、最悪の場合、O(nh)= O(n2)に縮退する可能性があります。[ イラスト付きの説明 ]
  • 分割統治— O(n log n):このアルゴリズムは、3次元の場合にも適用できます。
  • モノトーンチェーン— O(n log n): Grahamスキャンのバリアントで、座標によって辞書式にポイントを並べ替えます。入力が既にソートされている場合、アルゴリズムはO(n)時間かかります。
  • 増分凸包アルゴリズム— O(n log n)
  • Marriage-before-conquest — O(n log h):最適な出力依存アルゴリズム。
  • Chanのアルゴリズム— O(n log h):単純な最適出力依存アルゴリズム。

これらの@underdarkをリストしてくれてありがとう...あなたが選んだものはどれですか?
マリン




1

アルゴリズムでこれを実行できるようにする場合(実行できるパッケージではなく)、データを三角測量する必要があると思います。または、基本的に各ポイントから他のすべてのポイントまでの線を定義します。次に、(たとえば)最も高いY値を持つポイントから開始し、外部の角度/方位角が最小の接続線に沿って、外側のルートをトレースします。

最初に交差する線を捨てることで、トレースを高速化できます。外部境界には交差点がありません。

btw-FMEはこれをConvexHullAccumulatorまたはConvexHullReplacerトランスフォーマーでも行います!


1

コードに実装されている既存のアルゴリズムを確認する場合は、NetTopologySuiteにこれを実行するアルゴリズムがあります

ConvexHull.csをご覧ください

ちなみに、NTSと他の多くのライブラリはDotSpatialと呼ばれるクールなプロジェクトにまとめられています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.