代码之家  ›  专栏  ›  技术社区  ›  user973224

翻转两个三角形的边

  •  1
  • user973224  · 技术社区  · 12 年前

    我有一个带索引的数组。其中三个指数构成一个三角形。现在我取一个三角形,搜索另一个具有共享边的三角形。这些三角形现在组成了一个对角线分割的四边形。(在代码中)我如何翻转这个对角线/三角形,使其连接相反的对角线?在Blender、Maya、3ds max等3D程序中,我要找的通常被称为“翻转边缘”。

    quadrangle edge flip

    我受够了。有什么想法吗?

    2 回复  |  直到 5 年前
        1
  •  5
  •   Shahbaz Martin York    12 年前

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

    struct Vertex
    {
        double position[3];
    };
    
    struct Triangle
    {
        unsigned int vertices[3];
    };
    
    Vertex nodes[N_NODES];
    Triangle triangles[N_TRIANGLES];
    

    其中, vertices 是的索引 nodes ,则给定两个三角形:

    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] ,并假设 i3 j3 是的第三个真理 t1 t2 如该图像所示:

    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个非共享顶点和一个共享顶点组成。

        2
  •  0
  •   Jan Hruby    12 年前

    如果你的顶点在一个数组中,我假设你通过一些固定的行长度识别不同的行,并根据一些模式制作三角形。我建议只是改变这种模式,如何将三个顶点指定在一起。你必须注意没有配对的三角形,如果有