计算多维数组和正方形交集体积的无大小写方法

Caseless way of calculating volume of an intersection between an array and a square in multiple dimensions

我有一个多维数组,在遍历它的每个元素时,如果维度大于 3,我需要计算正方形、立方体或其他相应对象的体积,在每个元素中,大小为 2r .如果我遍历数组边界附近的元素,square/cube 的一部分将粘在数组之外 - 我需要数组和对象之间的交集的体积。

这是问题在 2D 中的样子 - 我需要计算红色区域。

到目前为止我知道两种方法:

  1. 案例和 if 语句。对于 2D,我可以计算交点角的坐标,但由于这不是严格意义上的 2D 问题,而是多维问题,其中维数在输入、案例和 if 语句以及随后的硬编码中给出没问题。
  2. 手动遍历正方形中的每个元素并检查它是否属于数组。虽然这很容易做到,但它也非常慢,即使在 2D 中也是如此,因为我正在迭代 n 维数组,并且在每次迭代中,我再次执行 n 次循环,大小为 2r^n。半径越大,执行越慢。

有什么方法可以让我快速计算出这些路口的体积吗?

如果我对你的问题理解正确,你想计算两个轴对齐的超矩形之间的交集体积。

第一个矩形(您的数组)由其下角的位置(arrayLower,一个 nD 向量)及其大小(arraySize,又是一个 nD 向量)定义。第二个矩形由其中心(p,一个 nD 向量)和每个方向 r 个单位的范围定义。

对于给定的维度 d,这可以以非常结构化的方式完成,因为您只需要乘以每个维度的范围:

volume = 1
for each d:
    lower = max(p[d] - r, arrayLower[d])
    upper = min(p[d] + r, arrayLower[d] + arraySize[d])
    if(lower > upper)
        volume = 0   //no intersection
    else
        volume *= upper - lower