我正在尝试检测3d对象的轮廓边缘。我知道你必须首先确定一张脸看着一个位置的天气,然后找到正面和背面共用的边缘。
我已经能够找出正面和背面的东西,但我无法弄清楚如何在没有很多if语句的情况下共享边缘。我的顶点数据存储在每个多边形的x1,z1,y1,x2,z2,y2,x3,z3,y3中。
答案 0 :(得分:0)
如果您询问如何确定两条线段是否在同一条线上,则可以使用一点Euclidean几何体。我们将介绍几个定义:
点 A是实数的n元组(a1, a2, ..., an)
。在3D案例中,n=3
。
A点和实数t
的标量乘法定义为
tA = (t*a1, t*a2, ..., t*an)
有了这两个想法,我们可以很容易地代表一条线。对于两个点A
和B
,满足等式的点P
P = tA + (1-t)B
位于AB
行,其中t
是实数。
当0 <= t <= 1
时,P
位于A
和B
之间,P=A
位于t=1
之间P=B
t=0
Point
}}
现在将其置于编程透视图中,您可以创建两个类:Line
和Point
。使用上面给出的等式,很容易确定Line
是否位于给定Point
上。要确定两个线段是否位于同一条线上,只需使用定义一个Line
的两个Line
,并检查它们是否位于另一个{{1}}上。
答案 1 :(得分:0)
如果2个线段是同一条线
如果两个线段使用相同的点坐标或相同的点索引,则它们是相同的。测试它们是否在同一条线上是完全不同的问题,您无需为了找到轮廓而解决这个问题。
索引原语意味着
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>
的面索引等等上。