1

由于问题的数学性质,我也将其发布在另一个论坛上: 论坛帖子

我有一个 .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)..."

我不太明白这个解释,为了实现我的目标,我将不胜感激任何帮助或进一步的解释。

谢谢

4

2 回答 2

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*/                      ());

这描述了一个位于 xy 平面上的正方形。属性 CoordIndex 中的每个条目都是一个三元组,它给出了 IfcCartesianPointList 中一个点的从 1 开始的索引。这意味着有两个三角形由以下点构成:

  1. (0,0,0) (1,0,0) (1,1,0)
  2. (0,0,0) (1,1,0) (0,1,0)

间接索引

让我们在前面的示例上进一步构建:

#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) 的过程,我们从 PnIndex 和以下点获得值 2, 4, 1: (1,0,0) (0,1,0) (0,0,0)

它又是一个正方形,但这次使用了不同的三角剖分。

现在,如果您想知道您的壁厚,您需要根据生成的几何图形计算范围。如果你的墙与坐标系轴对齐,这很容易(得到最小和最大 X、Y 和 Z 之间的差异)。如果不是,您可能需要转换点或进一步研究 3D 范围计算(我的知识到此为止)。

于 2018-05-17T09:26:53.170 回答
0

在三角测量中,它大致是num of triangles = 2 * num of vertices.

墙壁(例如矩形)可以由共享一条边和该边的两个顶点的两个三角形来描述。

不是逐个三角形地描述整个模型三角形,每个三角形都有其三个顶点,或者逐个边,它更便宜,避免重复顶点数据,为每个顶点设置一个索引并通过其顶点的三个索引设置一个三角形。这通常称为“索引渲染”。

于 2018-04-18T16:17:12.317 回答