Arrays 计算多维数组和正方形交集体积的无壳方法

Arrays 计算多维数组和正方形交集体积的无壳方法,arrays,math,geometry,computational-geometry,Arrays,Math,Geometry,Computational Geometry,我有一个多维数组,在遍历它的每个元素时,我需要计算正方形、立方体或其他相应对象的体积,如果维度大于3,则每个元素的大小为2r。如果我在数组边界附近的元素中迭代,那么这个正方形/立方体的一部分会粘在数组之外——我需要数组和对象之间的交集的体积 这就是问题在2D中的表现-我需要计算红色区域 到目前为止,我知道两种方法: 案例和if语句。对于2D,我可以计算交叉点角点的坐标,但因为这不是严格意义上的2D问题,而是多维问题,输入时给出了维度的数量,案例和if语句以及后续的硬编码都是毫无疑问的 手动遍历

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

这就是问题在2D中的表现-我需要计算红色区域

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

  • 案例和if语句。对于2D,我可以计算交叉点角点的坐标,但因为这不是严格意义上的2D问题,而是多维问题,输入时给出了维度的数量,案例和if语句以及后续的硬编码都是毫无疑问的
  • 手动遍历正方形中的每个元素,并检查它是否属于数组。虽然这很容易做到,但它也非常慢,即使是在2D中,因为我在一个n维数组中迭代,在每次迭代中,我又在做大小为2r^n的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
    

    如果我正确理解了您的问题,您需要计算两个轴对齐的超矩形之间的交点体积

    第一个矩形(数组)由其下角的位置(
    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
    

    谢谢,这很好用,但是有没有类似的方法来做同样的事情,但是用半径为r的球体而不是矩形?很明显,它是一个超矩形(数组)和一个n-球体之间的交集。球体-矩形交集要复杂得多,因为有很多特殊情况。我建议问一个新问题——可能是关于。谢谢,这很有效,但是否也有类似的方法来做同样的事情,只是用半径为r的球体而不是矩形?很明显,它是一个超矩形(数组)和一个n-球体之间的交集。球体-矩形交集要复杂得多,因为有很多特殊情况。我建议为此提出一个新问题——可能是关于。