AABB的分区

时间:2014-03-11 15:01:24

标签: c++ algorithm partitioning aabb

我有一个问题,我需要将AABB划分为多个小型AABB。我需要在每个较小的AABB中找到最小和最大点。

enter image description here

如果我们以这个长方体为例,我们可以看到它分为64个较小的长方体。我需要计算所有这些较小的长方体的最小和最大点,其中长方体(64)的数量可以由最终用户指定。

我已使用以下代码进行了基本尝试:

// Half the length of each side of the AABB.
float h = side * 0.5f;

// The length of each side of the inner AABBs.
float l = side / NUMBER_OF_PARTITIONS;

// Calculate the minimum point on the parent AABB.
Vector3 minPointAABB(
    origin.getX() - h,
    origin.getY() - h,
    origin.getZ() - h
);

// Calculate all inner AABBs which completely fill the parent AABB.
for (int i = 0; i < NUMBER_OF_PARTITIONS; i++)
{
    // This is not correct! Given a parent AABB of min (-10, 0, 0) and max (0, 10, 10) I need to
    // calculate the following positions as minimum points of InnerAABB (with 8 inner AABBs).
    // (-10, 0, 0), (-5, 0, 0), (-10, 5, 0), (-5, 5, 0), (-10, 0, 5), (-5, 0, 5), 
    // (-10, 5, 5), (-5, 5, 5)

    Vector3 minInnerAABB(
        minPointAABB.getX() + i * l,
        minPointAABB.getY() + i * l,
        minPointAABB.getZ() + i * l
    );

    // We can calculate the maximum point of the AABB from the minimum point 
    // by the summuation of each coordinate in the minimum point with the length of each side.
    Vector3 maxInnerAABB(
        minInnerAABB.getX() + l,
        minInnerAABB.getY() + l,
        minInnerAABB.getZ() + l
    );

    // Add the inner AABB points to a container for later use.
}

非常感谢!

1 个答案:

答案 0 :(得分:0)

我认为您的问题是您没有足够的子框。分区数是指每个维度的分区,对吧?因此,2个分区产生8个子框,3个分区产生27个子框,依此类推。

然后你必须有三个嵌套循环,每个维度一个:

for (int k = 0; k < NUMBER_OF_PARTITIONS; k++)
    for (int j = 0; j < NUMBER_OF_PARTITIONS; j++)
        for (int i = 0; i < NUMBER_OF_PARTITIONS; i++)
        {
            Vector3 minInnerAABB(
                minPointAABB.getX() + i * l,
                minPointAABB.getY() + j * l,
                minPointAABB.getZ() + k * l
            );

            Vector3 maxInnerAABB(
                minInnerAABB.getX() + l,
                minInnerAABB.getY() + l,
                minInnerAABB.getZ() + l
            );

            // Add the inner AABB points to a container for later use.
        }
    }
}

或者,您可以在partitios的多维数据集上放置一个巨大的循环,并通过循环内的除法和余数操作对索引进行排序,这对于三维来说有点混乱。

通过根据原始框的边长计算每个维度的三个独立子框长度,使代码更通用也是一个好主意。