将网格表示更改为点表和三角形面表。STL要求所有三角形在其顶点处连接,因此不切割边,这意味着相邻三角形总是共享一条完整的边。
double pnt[points][3];
int tri[triangles][3];
应该是所有不同点的pnt列表(索引排序以提高高点计数的速度)。应该包含三角形中使用的 3 个点的tri索引。对它们进行排序(asc 或 desc)以提高匹配速度。
现在,如果任何三角形tri[i] 共享相同的边,tri[j]那么这两个是相邻的三角形。
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加载到此类结构中,请执行以下操作:
清除pnt[],tri[]列表/表格
处理 STL 的每个三角形
对于三角形的每个点
看看它是否在,pnt[]如果是的话,将它的索引用于 new triangle。如果不添加 new并将其索引用于pointnew 。当所有 3 点完成后添加新的.pnttriangletriangletri
提高pnt[]性能
pnt[]例如,为按任何坐标排序添加索引排序,x并提高检查是否point已经存在于pnt.
因此,在通过二进制搜索添加到具有最大(xi,yi,zi)点pnt[]的查找索引时,然后扫描所有点直到交叉,这样您就不需要检查所有点。xxi>=pnt[i0][0]pntxxixi<pnt[i1][0]
如果这太慢(通常如果点数大于 40000),您可以通过分段索引排序来提高性能(将索引排序划分为有限大小的分段页面,如 8192 点)
提高tri[]性能
您还可以对tri[]by进行排序,tri[i][0]以便您可以使用类似于pnt[].