由于问题的数学性质,我在另一个论坛上发布了这个: forum post
我有一个.ifc文件,其中导出的原始数据根据链接说明用一组坐标及其相应的索引描述xy平面中的墙:
我有一个txt,其中数据被分成xyz空间中的坐标,然后是索引和其他一些数据。
我希望有人能帮助我理解如何将索引链接到相应的坐标。有164个坐标对和324个索引对,所以对我来说每个索引只涉及1个坐标对是没有意义的。
目标是在索引和坐标之间建立关系,使得这种类型的数据可以输出壁厚,在这种情况下为“10”。我认为(根据上面的链接)通过采用描述的第一个三角形,它应该用3D描述墙的边缘,因此给我们一个边作为墙中最短的部分,即厚度。
我在上述论坛帖子中收到了答案,我应该这样做 “...根据X,Y和Z [而不是(X,Y,Z)三元组)展开每个坐标,然后使用每个索引三元组来获得单个坐标的实际坐标而不是一个坐标三倍。 所以例如你有X [],Y []和Z []并且你有一个索引(a,b,c)然后你找到X [a],Y [b]和Z [c]而不是Point(a) ,b,c)......“
我不太明白这个解释,并希望得到任何帮助或进一步解释,以实现我的目标。
谢谢
答案 0 :(得分:2)
让我们从坐标(IfcCartesianPointList3D)开始:每一个都是一个三元组,产生一个带(x,y,z)坐标的点。
然后,IfcTriangulatedFaceSet使用索引来构造三角形。它有2种索引模式:直接和间接通过PnIndex。索引模式由PnIndex(属性号5)的数组的存在确定。请注意,我直接和间接地称这些变体 - 在IFC文档中没有提到它们。
未设置PnIndex。让我们看一个(简单和构造的)示例:
#100=IFCCARTESIANPOINTLIST(((0,0,0),(1,0,0),(1,1,0),(0,1,0)));
#101=IFCTRIANGULATEDFACESET(
/*reference to the points*/ #100,
/*no normals*/ $,
/*no indication if closed or open*/ $,
/*coordinate indices*/ ((1,2,3),(1,3,4)),
/*no PnIndex*/ ());
这描述了位于x-y平面内的正方形。属性CoordIndex中的每个条目都是一个三元组,它将一个基于索引的索引提供给IfcCartesianPointList中的一个点。这意味着有两个三角形由以下几点构成:
让我们在上一个例子中进一步构建:
#100=IFCCARTESIANPOINTLIST(((0,0,0),(1,0,0),(1,1,0),(0,1,0)));
#101=IFCTRIANGULATEDFACESET(
/*reference to the points*/ #100,
/*no normals*/ $,
/*no indication if closed or open*/ $,
/*coordinate indices*/ ((1,2,3),(1,3,4)),
/*PnIndex*/ (2,3,4,1));
这次有PnIndex设置。它增加了一个间接级别来访问这些点。 CoordIndex的三元组指向PnIndex(从1开始)。然后,在PnIndex中找到的值用于访问IfcCartesianPointList。
因此对于CoordIndex中的第一个三角形:(1,2,3)。这些指向PnIndex中的2,3和4。这些从点列表得到以下几点:(1,0,0)(1,1,0)(0,1,0)
重复第二个三角形(1,3,4)的procudure,我们从PnIndex得到值2,4,1和以下几点:(1,0,0)(0,1,0)(0,0) ,0)
这又是一个正方形,但这次采用了不同的三角剖分。
现在,如果您想知道墙壁厚度,则需要根据生成的几何图形计算范围。如果您的墙与坐标系轴对齐,这很容易(获得最小和最大X,Y和Z之间的差异)。如果不是,您可能需要转换点或进一步研究3D范围计算(我的知识就此结束)。
答案 1 :(得分:0)
在三角测量中,它大致是num of triangles = 2 * num of vertices
。
墙(例如矩形)可以用两个共享边缘的三角形和边缘的两个顶点来描述。
不是用三角形描述整个模型三角形,每个都有三个顶点,或逐个边缘,它更便宜,避免重复顶点数据,为每个顶点设置索引并通过其顶点的三个索引设置一个三角形。这通常称为"索引渲染"。