如何计算多个重叠的平行六面体的总体积?
How to calculate the total volume of multiple overlapping parallelepipeds?
我们在 space 中有许多平行六面体,所有边都与轴平行。每个平行六面体由6个整数值表征,其两个顶点的坐标
(x1; y1; z1); (x2; y2; z2) with x1 < x2; y1 < y2 and z1 < z2;
我必须求出两个或多个平行六面体同时占据的总体积。
让我们先看看所有长方体的体积求和,同时仅考虑一次重叠区域。
您可以用一个由所有长方体的起点和终点组成的新网格覆盖您的 space。然后,您根据该网格有效地将所有长方体切成 sub-cuboids,如下图所示(对于矩形):
例如,图中右下角的矩形由六个non-intersectingsub-rectangles组成,它们的体积可以单独计算。
所以:
- 对于每个轴,构建一个包含长方体起点和终点的数组。对数组进行排序。
- 创建一个three-dimensional数组,其长度对应于每个轴的坐标数组的长度。这个数组保存了新网格中的一个长方体是否被占用的信息。
- 现在遍历长方体并将构成长方体的网格中的所有 sub-cuboids 标记为已占用。
- 迭代标记数组并对所有标记的长方体的体积求和。
当你想获得重叠的体积 sub-cuboids 时,你可以构建一个长方体交叉点列表并对其进行处理,或者你可以使标记数组成为计数数组并仅对 sub-volumes 计数至少为 2.
上述方法适用于任意坐标值,甚至 floating-point 数字。如果你的长方体被限制在一个小范围内的整数,你可以不用新网格而只使用自然整数网格作为 "voxels".
我们在 space 中有许多平行六面体,所有边都与轴平行。每个平行六面体由6个整数值表征,其两个顶点的坐标
(x1; y1; z1); (x2; y2; z2) with x1 < x2; y1 < y2 and z1 < z2;
我必须求出两个或多个平行六面体同时占据的总体积。
让我们先看看所有长方体的体积求和,同时仅考虑一次重叠区域。
您可以用一个由所有长方体的起点和终点组成的新网格覆盖您的 space。然后,您根据该网格有效地将所有长方体切成 sub-cuboids,如下图所示(对于矩形):
例如,图中右下角的矩形由六个non-intersectingsub-rectangles组成,它们的体积可以单独计算。
所以:
- 对于每个轴,构建一个包含长方体起点和终点的数组。对数组进行排序。
- 创建一个three-dimensional数组,其长度对应于每个轴的坐标数组的长度。这个数组保存了新网格中的一个长方体是否被占用的信息。
- 现在遍历长方体并将构成长方体的网格中的所有 sub-cuboids 标记为已占用。
- 迭代标记数组并对所有标记的长方体的体积求和。
当你想获得重叠的体积 sub-cuboids 时,你可以构建一个长方体交叉点列表并对其进行处理,或者你可以使标记数组成为计数数组并仅对 sub-volumes 计数至少为 2.
上述方法适用于任意坐标值,甚至 floating-point 数字。如果你的长方体被限制在一个小范围内的整数,你可以不用新网格而只使用自然整数网格作为 "voxels".