我有一个STL文件,包含一个三角形的3个点的坐标这些三角形代表一个三维曲面stl文件可能有1000多个三角形来表示复杂的几何体。
对于我的应用程序,我需要知道stl文件中每个三角形条目的相邻三角形。也就是说,对于每个三角形,我必须选择3对点(x,y,z)并将它们与集合中其他三角形中的一对点进行比较
实现这一目标的最佳和最有效的算法是什么?我可以用hashtree吗,hashmap?

最佳答案

将网格表示更改为“点表”和“三角形面表”。STL要求所有的三角形都在各自的顶点上连接起来,这样就不会切割边,这意味着相邻的三角形总是共享一条完整的边。

double pnt[points][3];
int    tri[triangles][3];

pnt应该是所有不同点的列表(索引排序以提高高点计数的速度)。tri应该包含三角形中使用的3个点的索引。对它们进行排序(asc或desc)以提高匹配速度。
现在,如果任何一个三角形共享同一条边,就像是相邻的三角形。
if ((tri[i][0]==tri[j][0])&&(tri[i][1]==tri[j][1])
  ||(tri[i][0]==tri[j][1])&&(tri[i][1]==tri[j][2])) triangles i,j are neighbors

添加所有组合…
如果您只需要相邻的点,那么找到包含该点的所有三角形,并且这些三角形中使用的所有其他点都是相邻的
要将stl加载到此类结构,请执行以下操作:
清除列表/表格
处理stl的每个三角形
对于三角形的每个点
看看它是否在tri[i]中,如果是,则将其索引用于新的tri[j]。如果没有,则将newpnt[],tri[]添加到pnt[]中,并将其索引用于newtriangle当所有3个点都完成时,将新的point添加到pnt
改善triangle性能
为按任意坐标排序的triangle添加索引排序,例如tri,并提高检查pnt[]中是否已存在pnt[]的性能。
因此,在将x添加到point中时,通过二进制搜索找到pnt最大的点(即(xi,yi,zi)的点)的索引,然后扫描pnt[]中的所有点,直到xxi>=pnt[i0][0]交叉,这样就不需要检查所有点。
如果速度太慢(通常如果点数大于40000),可以通过分段索引排序(将索引排序分成8192点等有限大小的分段页)来提高性能
改善pnt性能
您还可以按xxi进行排序,以便可以使用类似于xi<pnt[i1][0]的二进制搜索。

09-10 06:44