确定3D点是否在轴对齐立方体内的最快方法?

时间:2014-10-27 03:30:06

标签: c++ performance 3d geometry

假设您有一个要测试的3D点,另外两个3D点代表一个立方体的最大值和最小值。

在最坏的情况下使用6个条件语句的显而易见的解决方案如下:

if (point.x < cubemin.x || point.y < cubemin.y || point.z < cubemin.z
 || point.x > cubemax.x || point.y > cubemax.y || point.z > cubemax.z)
    return false; //is not within cube
return true; //is within cube

条件语句是一些计算成本最高的指令。是否有任何方式来减少所需的检查次数?在这种情况下,表现至关重要。

2 个答案:

答案 0 :(得分:2)

在数学上,没有其他方法可以解决最多6次比较。

然而,在计算机体系结构方面,可以并行完成所有这些工作。 矢量计算机可以并行执行许多类似的操作(例如最大值和最小值的比较等)。

因此,这取决于您的程序将在哪个平台上实现,以及该平台是否提供了一些向量指令。

或者非常,如果您的工作非常重要,您可以尝试制作自己的ASIC CPU芯片。

答案 1 :(得分:2)

有减少测试次数的技巧(我不建议使用它......):

假设所有坐标都是无符号整数,则xmin <= x && x <= xmax可以缩减为x - xmin <= xmax - xmin

  1. 如果xmin <= x && x <= xmax,则会按预期返回true
  2. 如果是xmax < x,那么x - xmin > xmax - xmin,则会按预期返回false
  3. 如果x < xmin,则x - xmin回绕(提供MAX_UINT + 1 + x - xmin)和xmax - xmin < MAX_UINT + 1 + x - xmin,这样会按预期返回false