C++ 确定三维点是否位于轴对齐立方体内的最快方法?

C++ 确定三维点是否位于轴对齐立方体内的最快方法?,c++,performance,3d,geometry,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 with

假设您有一个要测试的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
if(点xcubemax.x | |点.y>cubemax.y | |点.z>cubemax.z)
返回false//不在多维数据集中
返回true//在立方体中

条件语句是需要执行的计算代价最高的指令之一。是否有任何方法可以减少所需的检查次数?在这种情况下,性能最为重要。

从数学上讲,没有其他方法可以解决最多6次比较的问题

然而,在计算机体系结构方面,可以并行地完成这一切。 向量计算机可以并行地做很多类似的事情(比如最大值和最小值的比较等)

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


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

有一个技巧可以减少测试次数(我不建议使用它……):


假设所有坐标都是无符号整数,那么“计算代价”部分中的
xm实际上是有一个分支,而不是有6个测试。我不知道如何减少测试的数量。@ooga你是说每个测试都不是新分支的等价物,或者不需要额外的分支预测?你不告诉数据类型,这是基本信息!你的观点更多的是在内部还是外部?你有没有试过用按位的或而不是逻辑的或?你可以用一些比较来交换加法或减法,但你不认为这样更好。近似值可能会节省一些时间,具体取决于数据类型。您是在单个点上执行此操作,还是在多个点上执行此操作?因为虽然一个点没有真正的优化,但如果有很多点,可以使用其他方法。事实上,这可以用比较来换取减法。计算的成本几乎相同。(两次比较+一个逻辑OR与两次减法+一次比较)