如何确定两条3D边是否相同?

时间:2013-02-17 23:08:03

标签: c++ edge-detection

我正在尝试检测3d对象的轮廓边缘。我知道你必须首先确定一张脸看着一个位置的天气,然后找到正面和背面共用的边缘。

我已经能够找出正面和背面的东西,但我无法弄清楚如何在没有很多if语句的情况下共享边缘。我的顶点数据存储在每个多边形的x1,z1,y1,x2,z2,y2,x3,z3,y3中。

2 个答案:

答案 0 :(得分:0)

如果您询问如何确定两条线段是否在同一条线上,则可以使用一点Euclidean几何体。我们将介绍几个定义:

A是实数的n元组(a1, a2, ..., an)。在3D案例中,n=3

A点和实数t的标量乘法定义为

tA = (t*a1, t*a2, ..., t*an)

有了这两个想法,我们可以很容易地代表一条线。对于两个点AB,满足等式的点P

P = tA + (1-t)B

位于AB行,其中t是实数。

0 <= t <= 1时,P位于AB之间,P=A位于t=1之间P=B t=0 Point }}

现在将其置于编程透视图中,您可以创建两个类:LinePoint。使用上面给出的等式,很容易确定Line是否位于给定Point上。要确定两个线段是否位于同一条线上,只需使用定义一个Line的两个Line,并检查它们是否位于另一个{{1}}上。

答案 1 :(得分:0)

  

如果2个线段是同一条线

如果两个线段使用相同的点坐标或相同的点索引,则它们是相同的。测试它们是否在同一条线上是完全不同的问题,您无需为了找到轮廓而解决这个问题。

  1. 使用索引基元。
  2. 在加载模型时预先计算边缘和所需拓扑表的列表。
  3. 如果您正在尝试绘制阴影,请使用阴影贴图 - 它们更易于理解。
  4. 索引原语意味着 1.将所有点存储在数组中(std::vector<vector3> points;或类似的地方,其中vector3是存储xyz坐标的数据类型),并且每个点都是唯一的。
    2.面和边是指使用整数点索引的点。

    即。

    struct Vec3{
        float x, y, z;
    };
    
    typedef unsigned int Index;
    
    struct Face{
        enum{vertsPerFace=3};
        Index verts[vertsPerFace];
    };
    
    struct Edge{
        enum{vertsPerEdge=2};
        Index verts[vertsPerEdge];
    };
    

    加载模型时,您可以使用std::set std::map或类似结构构建点列表并将所有面转换为索引基元。索引完原语后,可以构建关联表(使用std :: map)将边缘映射到面列表std::multimap<std::pair<Index, Index>, FaceIndex>,将边缘映射到使用这些边std::map<std::pair<VertexIndex, VertexIndex>, FaceIndex>的面索引等等上。