在c++中检查长方体是否尽可能快地重叠(无迭代)



我有一个长方体类,其中长方体坐标作为数组集提供:

Cuboid3D cube_a      ({1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f}, // x coordinates
{2.0f, 4.0f, 3.0f, 7.0f, 2.0f, 9.0f, 5.0f, 2.0f}, // y coordinates
{1.0f, 3.0f, 6.0f, 9.0f, 4.0f, 3.0f, 1.0f, 7.0f}); // z coordinates
Cuboid3D cube_b      ({3.0f, 4.0f, 5.0f, 2.0f, 1.0f, 2.0f, 3.0f, 2.0f}, // x coordinates
{1.0f, 3.0f, 5.0f, 2.0f, 1.0f, 2.0f, 3.0f, 4.0f}, // y coordinates
{1.0f, 3.0f, 6.0f, 9.0f, 4.0f, 3.0f, 1.0f, 7.0f}); // z coordinates

如果立方体在任何点上相交,我需要找到最快的方法来获得真/假结果。问题是如何在不迭代的情况下实现这一点,即如何比较点——如何在不重复的情况下从数组中获得max-min。我需要这个尽快工作,因为它会被使用很多次。

它应该类似于检查"长方体"是否相同的方法:

bool
Rectangle3D::operator==(const Rectangle3D& other) const
{
if (!std::equal(_x_coords.begin(), _x_coords.end(), other._x_coords.begin(), other._x_coords.end(),
[&] (const auto &rhs, const auto &lhs) {return std::fabs(rhs - lhs) < 1.0e-13;})) return false;
if (!std::equal(_y_coords.begin(), _y_coords.end(), other._y_coords.begin(), other._y_coords.end(),
[&] (const auto &rhs, const auto &lhs) {return std::fabs(rhs - lhs) < 1.0e-13;})) return false;
if (!std::equal(_z_coords.begin(), _z_coords.end(), other._z_coords.begin(), other._z_coords.end(),
[&] (const auto &rhs, const auto &lhs) {return std::fabs(rhs - lhs) < 1.0e-13;})) return false;
return true;
}

所以,以类似的方式,如何检查——或者开始检查——我的形状是否在任何给定点相交,并且一旦相交,立即给出结果?

您希望获得最小值和最大值。此操作至少需要O(n(时间。只有当您对数据有特定的先决条件时,这一点才能更改。所以你知道,例如,最小值只能是2个顶点中的一个。或者在某种意义上对数据进行了排序。

从我读到的内容来看,你没有这样的东西。你只得到两个任意的长方体。所以你必须至少看一次每个坐标,才能找到一个最小值或最大值。根据您所做的操作,您可以存储这些值,并查看是否可以重用它们。例如,如果你必须将一个长方体与许多其他长方体进行比较。

通常,每个长方体有24个值,要找到例如minX,必须迭代8个值。在我的短测试中,我需要92纳秒(即使在较弱的硬件上,我也怀疑这需要超过一微秒的时间(。因此,问问自己实际的运行时需求是什么。你真的需要优化纳秒吗?对我来说,这真的闻起来像是过早的优化。

从问题的复杂性来看,我会首先把重点放在实际解决任务上。这并非微不足道,可以通过多种方式实现。如果你真的需要的话,以后再考虑这些小的优化

我能找到一些关于长方体重叠检查的链接:
https://gamedev.stackexchange.com/questions/130408/what-is-the-fastest-algorithm-to-check-if-two-cubes-intersect-where-the-cubes-a

https://gamedevelopment.tutsplus.com/tutorials/collision-detection-using-the-separating-axis-theorem--gamedev-169

你需要做的第一件事是验证你的"长方体"是否真的是长方体:我已经在图形工具(geogebra(中绘制了你的第一个"长方体",但这对我来说不是一个有效的长方体(如果我弄错了,请给我四个点,谁做一个矩形,其他四个点应该再做一个长方形(。

我看到有一些讨论,你是否想处理轴平行的长方体。我会用这个来定义你的长方体,假设你做以下事情:

  • 在空间中取一点,使其成为长方体的中心
  • 取三个浮点数,它们定义了长方体的大小
  • (此部分可能是可选的(如果您将长方体定义为不平行于轴,请定义两个浮点数(从0到2*Pi(,它们定义相对于轴的角度

这将为您提供一个更好的长方体定义,而不是八个随机数,您可以从那里开始(例如,通过比较中心坐标和大小(来计算可能的交点。

最新更新