任意の数の頂点で構成されるポリラインがある場合、このポリラインの境界の周りをトレースするための効率的なアルゴリズムは何ですか?
考慮すべき4つの状況があります。
それぞれの例(すべて閉じています):
視覚的に:
この場合、形状の凹みを保持したいので、凸型ハリングアルゴリズムは実際には適切ではありません。
結果:
明確にするために、蝶ネクタイの形状を交差させてはならず、単純な面積計算でこの形状の面積が得られるはずです(つまり、2つの三角形は論理的に同じ方向に巻かれます)。
このアルゴリズムは機能する必要があるだけでなく(これが最優先事項です)、数秒で数十万のポリラインで実行するのに十分な速度である必要があります。
さらに、アルゴリズムは4つのケースの任意の組み合わせを処理できる必要があります。
これはおそらくあなたの問題を解決するかもしれないアルゴリズムの大まかな概要です:
ステップ1は、エッジの各ペアに対して交差テストを行うことにより、単純ですが、あまり効率的ではない方法で実装できます(実行時間をO(#Edges²)にします)。より洗練された実装では、 スイープラインアプローチ を利用できます。スイープラインを既存の頂点の座標に移動するだけでなく、交点や平行線などにも注意し、それに応じて既存のラインを分割するように注意する必要があります。この手順を実行すると、線が交差したり重なったりすることはなくなります。
ステップ2は、従来の「凸包」アルゴリズムの単純な変更です。グラフの外側の頂点から開始し、ある頂点から次の隣接する頂点に移動して、「最小角度」で接続エッジを選択します。手順1で、データ構造の平面グラフが渡されることを確認してください。これにより、特定の頂点に接続されているすべてのエッジをすばやく選択できます。
お役に立てれば。