3d 合并相邻面和共平面

3d 合并相邻面和共平面,3d,geometry,cgal,3d,Geometry,Cgal,我正试图通过合并3D OBJ文件中的相邻面和共面来简化3D网格,OBJ文件包括网格的三角剖分,我希望减少边的数量,而不降低网格的质量。有什么算法能帮我解决这个问题吗 输入: 预期产出: 每条边由2个点定义,由于所有面都是三角形,因此每条边与2个相邻三角形共用。如果考虑这两个三角形,则总共有4个点:边的两个端点(两个三角形共用)和两个三角形的两个端点 你可以做的是在所有边上循环,检查这4个点是否共面。如果是,边缘是无用的,您可以删除它 要检查4个点是否共面,请执行以下操作: 从4个点中选取3个点

我正试图通过合并3D OBJ文件中的相邻面和共面来简化3D网格,OBJ文件包括网格的三角剖分,我希望减少边的数量,而不降低网格的质量。有什么算法能帮我解决这个问题吗

输入: 预期产出:

每条边由2个点定义,由于所有面都是三角形,因此每条边与2个相邻三角形共用。如果考虑这两个三角形,则总共有4个点:边的两个端点(两个三角形共用)和两个三角形的两个端点

你可以做的是在所有边上循环,检查这4个点是否共面。如果是,边缘是无用的,您可以删除它

要检查4个点是否共面,请执行以下操作:

  • 从4个点中选取3个点,计算由这3个点定义的平面方程(平面方程的形式为ax+by+cz+d=0)

  • 检查第四点是否满足平面方程


如果你想让某些东西开箱即用,并且你的点是完全共面的,那么你可以构建一个Nef_多面体,并将其倒回到曲面网格中。中间没有布尔运算就可以工作。< /P> 如果您想要更有效的东西,或者如果您的点不一定完全共面,您必须在网格的边上迭代以识别冗余边。然后,可以定义由这些边连接的面的连接组件。对于同一连接组件中的所有面,必须首先确定组件是否简单连接(即拓扑上是磁盘)。如果没有,则需要添加一些额外的边,以将孔连接到该面的外部边界(这就是为什么迭代调用
join\u face()
通常不起作用)。如果组件只是简单连接,则您知道可以删除所有边。通过从组件的边界边缘开始并围绕目标循环,可以在该面的边界上行走,从而定义

边界边缘的循环。

您遇到的问题是什么?只需检查面的相邻面是否具有相等法线并合并即可。您可以使用来合并共面面。