【问题标题】:Flip edge of two triangles翻转两个三角形的边
【发布时间】:2012-07-23 13:41:43
【问题描述】:

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

我被这个困住了。有什么想法吗?

【问题讨论】:

    标签: algorithm geometry flip vertices


    【解决方案1】:

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

    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] 的共享边,假设i3j3 分别是t1t2 的第三个verices,如图所示:

    然后您只需更改一些索引即可进行翻转。最直接的方法是:

    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】:

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

      【讨论】:

        猜你喜欢
        • 2023-01-30
        • 2017-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多