程序:
1) 指定两个 垂直方向来确定立方体的方向。为方便起见,我将分别选择它们作为 X 轴和 Z 轴。 X 为相交平面的法线,Y、Z 为平面内的二维坐标轴。
2) 找到包围网格的最小轴向长方体 (AABB)。我敢肯定这很容易。在这种情况下,这会给你 6 个数字,[X1, X2, Y1, Y2, Z1, Z2]。
3) 假设您选择具有维度 S 的立方体;令 H = S / 2。从 X X = X1 + H 开始,构造一个具有法线 (1, 0, 0) 和中心 (X, 0, 0) 的平面。
4) 与网格相交。有关 C++ 中的数学和实现的详细信息,请参见此处:http://www.geometrictools.com/Documentation/ClipMesh.pdf
5) 取交点产生的边。 将它们连接起来,方法是找到具有共同端点的对,并将它们插入到一些双向链表中。这样就可以将它们排序到路径中。
6) 找到这个形状的最小封闭矩形,给出 [Y1, Y2, Z1, Z2]
7) 从 Z = Z1 + H 开始,创建一条从 (X, Y1, Z) 到 (X, Y2, Z) 的线。将这条线与所有
路径中的边缘以获取点。沿着链接列表走,以避免重复测试。
8) 按 Y 坐标对点进行排序。插入排序即可:https://en.wikipedia.org/wiki/Insertion_sort
9) 对于相邻的对点,Y 坐标为 A 和 B,从 Y = A + H 开始,在 (X, Y, Z) 处放置一个大小为 S 的立方体,其中 X和 Z 来自前面的步骤。
10) 从第 (9) 步开始重复对每一对点(如图所示),同时每次将 Y 递增 S,直到 Y > B - H。
11) 从步骤 (7) 开始重复,每次将 Z 增加 S,直到 Z > Z2 - H。
12) 从步骤 (3) 开始重复,每次将 X 增加 S,直到 X > X2 - H。
你就完成了。免责声明:这可能不是一种有效的方式,但它可能是最简单和最简单的实现方式。