私はDelaunay三角測量からボロノイグラフを計算しようとしていますが、私は三角形分割データを頂点の集合の形にしています(赤丸グラフ)と三角(グラフ上の青線)上:アルゴリズム設計 - 頂点を共有する三角形のセットを見つけるより良い方法
私はすべての三角形の外心を取得することにより)(簡単に赤の線の交点をボロノイグラフverticiesを計算することができますよ。
ただし、赤いポリゴンごとに 'セル'情報を取得する必要があります。これを行うには、赤い頂点ごとに同じ頂点を共有する三角形のセットを見つける必要があります。それがすべてを検索だと、もちろん、非常に非効率的である
foreach (Vertex3 vertex in DelaunayVertices)
{
VoronoiCell cell = new VoronoiCell();
cell.Vertex = vertex;
//seach all triangles for the ones that match this.
foreach (Face3 face in DelaunayTriangles)
{
if (face.Vertices.Where(v => v.Equals(vertex)).Any())
{
//shares vertices, add it's circumcenter as an edge vertex of the cell
cell.EdgeVertices.Add(face.Circumcenter);
}
}
}
:
だから私のコードは、この(C#の)次のようになります。丸で囲まれた頂点のために、私は緑の三角形を必要とするので、 。しかし、顔やバーチャルのコレクションは完全にソートされていません(ソートの仕方やソートの方法がわかりません)。ちょうど混乱させるために、球の表面に3次元の頂点があります。
私はそれは、隣接します持っている各三角形について、隣接する頂点または面を見つけなければならない唯一のことは、以下のオレンジ色の三角形のためので、私は3つの緑の三角形を知っている:私は考えている
このグラフをトラバースするほうが効率的かもしれませんが、私は、ポイントを共有するセットを生成するアルゴリズムへのアプローチを考え出すのに苦労しています。
私は、ドメイン固有の性質のために、あなたに受け入れられる答えを思いつくことが難しい隠された要件/制約があることを恐れます。つまり、各頂点がキーであり、その値がその頂点を使用するすべての三角形のリストである辞書を維持することをお勧めします。三角形を列挙し、その三角形の頂点に対応する3つのリストのそれぞれにその三角形を追加して、辞書に移入することができます。データ構造が作成されると、与えられた頂点の三角形を検索するのはO(n)です(nは見つかった三角形の数です)。 –
それは良い計画のように思えますが、何か似たようなことをする必要があります。私はそれを実装し、それがどのように実行されるかを見て行きます。 – Joe