给定以原点为中心的轴对齐立方体图和3D空间中的任意点,检查点所在面的直接方法包括抓取具有最大幅度的坐标并选择与该部件对应的面。
天真的代码如下:
if (fabs(point.x) >= fabs(point.y) && fabs(point.x) >= fabs(point.z)) {
if (point.x >= 0) {face=0;} else {face=1;}
}
if (fabs(point.y) >= fabs(point.x) && fabs(point.y) >= fabs(point.z)) {
if (point.y >= 0) {face=2;} else {face=3;}
}
if (fabs(point.z) >= fabs(point.x) && fabs(point.z) >= fabs(point.y)) {
if (point.z >= 0) {face=4;} else {face=5;}
}
有没有办法在C中实现同样被认为更好的东西?
无分支代码会更优化吗?
任何内联汇编标准都可以选择用于此目的。
如有必要,所有\>=
运算符都可以转换为\>
运算符。
答案 0 :(得分:2)
可能看起来不多,但前三个if
语句消除了对fabs
的所有调用以及替换已发布代码中的内部if
语句。最终if/else
最多需要两个比较/分支来确定答案。
if ( point.x < 0 ) {
x = -point.x;
fx = 1;
} else {
x = point.x;
fx = 0;
}
if ( point.y < 0 ) {
y = -point.y;
fy = 3;
} else {
y = point.y;
fy = 2;
}
if ( point.z < 0 ) {
z = -point.z;
fz = 5;
} else {
z = point.z;
fz = 4;
}
if ( x >= y ) {
if ( x >= z ) { face = fx; } else { face = fz; }
} else {
if ( y >= z ) { face = fy; } else { face = fz; }
}