インデックス付きの配列があります。これらのインデックスのうち3つは三角形を構成します。次に、1つの三角形を取り、エッジが共有されている別の三角形を検索します。これらの三角形は、現在、対角線上に分割された三角形を構成しています。どうすれば(コードで)この対角線の端/三角形を反転させて、反対の対角線を接続できますか?私が探しているのは、Blender、Maya、3dsmaxなどの3Dプログラムでは「フリップエッジ」と呼ばれることがよくあります。
私はこれで立ち往生しています。何か案は?
これは、構造をどのように実装したかによって異なります。たとえば、そのような構造がある場合:
struct Vertex
{
double position[3];
};
struct Triangle
{
unsigned int vertices[3];
};
Vertex nodes[N_NODES];
Triangle triangles[N_TRIANGLES];
ここで、vertices
はへのインデックスであり、 nodes
2つの三角形が与えられます。
Triangle t1, t2;
あなたが持っている場合
t1.vertices[i1] = t2.vertices[j1];
t1.vertices[i2] = t2.vertices[j2];
つまりt1.vertices[i1] --- t1.vertices[i2]
、は、との共有エッジであり、とは、この画像に示されているように、それぞれとの3番目の頂点であるt2.vertices[j1] --- t1.vertices[j2]
と想定しi3
ています。j3
t1
t2
次に、いくつかのインデックスを変更するだけでフリップを実行できます。最も簡単な方法は次のとおりです。
unsigned int t1_v[3], t2_v[3];
t1_v[0] = t1.vertices[i1]; // shared
t1_v[1] = t1.vertices[i2]; // shared
t1_v[2] = t1.vertices[i3]; // not shared
t2_v[0] = t2.vertices[j1]; // shared (unnecessary)
t2_v[1] = t2.vertices[j2]; // shared (unnecessary)
t2_v[2] = t2.vertices[j3]; // not shared
t1.vertices[0] = t1_v[0]; // previously shared
t1.vertices[1] = t1_v[2]; // previously not shared
t1.vertices[2] = t2_v[2]; // previously not shared
t2.vertices[0] = t2_v[0]; // previously shared
t2.vertices[1] = t2_v[2]; // previously not shared
t2.vertices[2] = t1_v[2]; // previously not shared
新しい三角形はそれぞれ、2つの非共有頂点と1つの共有頂点で構成されていることに注意してください。
1つの配列に頂点がある場合、固定された行の長さで異なる行を認識し、パターンに基づいて三角形を作成すると仮定します。このパターンを変更して、3つの頂点を一緒に割り当てる方法を提案します。ペアになっていない三角形がある場合は注意する必要があります