将网格表示更改为点表和三角形面表。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并将其索引用于point
new 。当所有 3 点完成后添加新的.pnt
triangle
triangle
tri
提高pnt[]
性能
pnt[]
例如,为按任何坐标排序添加索引排序,x
并提高检查是否point
已经存在于pnt
.
因此,在通过二进制搜索添加到具有最大(xi,yi,zi)
点pnt[]
的查找索引时,然后扫描所有点直到交叉,这样您就不需要检查所有点。x
xi>=pnt[i0][0]
pnt
x
xi
xi<pnt[i1][0]
如果这太慢(通常如果点数大于 40000),您可以通过分段索引排序来提高性能(将索引排序划分为有限大小的分段页面,如 8192 点)
提高tri[]
性能
您还可以对tri[]
by进行排序,tri[i][0]
以便您可以使用类似于pnt[]
.