快速选择立方体贴图的正确面?

时间:2015-03-11 23:51:56

标签: c assembly 3d

给定以原点为中心的轴对齐立方体图和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中实现同样被认为更好的东西?
无分支代码会更优化吗?

任何内联汇编标准都可以选择用于此目的。
如有必要,所有\>=运算符都可以转换为\>运算符。

1 个答案:

答案 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; }
}