翻转两个三角形的边缘

时间:2012-07-23 13:41:43

标签: algorithm geometry flip edge

我有一个带索引的数组。其中三个指数组成一个三角形。现在我拿一个三角形并搜索另一个带有共享边缘的三角形。这些三角形现在构成对角线分割的四边形。如何(在代码中)我可以翻转这个对角线边缘/三角形,以便它连接相反的对角线?我正在寻找的东西在Blender,Maya,3ds max等3D程序中经常被称为“翻边”。

quadrangle edge flip

我坚持这个。有任何想法吗?感谢。

2 个答案:

答案 0 :(得分:4)

这取决于你如何实现你的结构。例如,如果您有这样的结构:

struct Vertex
{
    double position[3];
};

struct Triangle
{
    unsigned int vertices[3];
};

Vertex nodes[N_NODES];
Triangle triangles[N_TRIANGLES];

其中,verticesnodes的索引,然后给出两个三角形:

Triangle t1, t2;

如果你有

t1.vertices[i1] = t2.vertices[j1];
t1.vertices[i2] = t2.vertices[j2];

表示t1.vertices[i1] --- t1.vertices[i2]t2.vertices[j1] --- t1.vertices[j2]的共享边缘,假设i3j3t1t2的第3个版本分别如图所示:

enter image description here

然后你可以改变一些索引来做翻转。最直接的方式是:

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 :(得分:0)

如果你的顶点在一个数组中,我假设你通过一些固定的行长识别不同的行,并根据某些模式制作三角形。我建议只更改此模式如何将三个顶点分配在一起。如果有任何

,你必须照顾不成对的三角形