私は次のことを行うためのアルゴリズムを探しています:
入力は2Dポイントの配列です(P0 … PN -1)。配列の長さNは変化します(3≤N<∞)任意のM≤Nに対して、頂点がP0 …PM -1
の順序
である凸多角形が存在する場合と存在しない場合があります。
エッジは必ずしもアレイ内の隣接するペアではないことに注意してください。
この凸多角形が存在するような最大Mを見つけるための最も効率的なアルゴリズムは何ですか?
私の現在のアルゴリズムは非常に非効率的です。M = 3、M = 4、M = 5などでテストし、船体を計算してから、すべてのP0 … P M-1が船体の頂点であることをテストします。そうでない場合は、ループから抜けてM-を返します。 1.1。
例1:[(-2,2), (2,2), (-2,-2), (-1,1)]
結果:3(最初の3つのポイントは三角形を形成しますが、P 3 =(-1,1)
を追加するとポリゴンが非凸になるため)
例2:[(-2,2), (2,2), (-2,-2), (1,-1)]
結果:4(配列内の4つのポイントすべてから凸四角形を作成できるため)
例3の更新[(-3,3), (3,3), (2,-1), (-3,-3), (3,-3), (-2,1)]
:
結果:4。
この例は、提供されたすべての点の凸包を取得して、そのサブセットである接頭辞を見つけるだけでは不十分である理由を示しています。(3,-3)
最初の5つのポイントで構成される凸多角形の一部にすることはできません。これは、前のポイント(2,-1)
が船体上に存在しなくなるためです。しかし、それは(3,-3)
6つのポイントすべての船体にあり、そうではないにもかかわらず、拒否されなければならないということ(2,-1)
です。
無効な入力の例:
[(-1,-1), (0,0)]
(ポイントが少なすぎる)[(-1,-1), (0,0), (1,1), (1, -1)]
(最初の3つのポイントは同一線上にあります。アルゴリズムがこれを処理できるとは思いません。)