Ben*_*eri 3 java variables vector
我有一个给定的方法Direction calculateDirection(Vector3 from, Vector3 to)
,其中Vector3包含X,Y,Z.
该方法的目的是计算直线方向,它不能是对角线,它只能是X_LEFT或X_RIGHT,或Z_LEFT,或Z_RIGHT或TOP或DOWN.
所以我开始得到补偿:
Direction calculateDirection(Vector3 from, Vector3 to) {
int x = from.getX() - to.getX();
int y = from.getY() - to.getY();
int z = from.getZ() - to.getZ();
}
Run Code Online (Sandbox Code Playgroud)
所以要知道方向,其中一个变量不应该是0,如果有多个变量不是0,我需要返回null或抛出一个exception.
要做到这一点,我需要执行一些if,elseif但我对此感到不舒服,我觉得可以有一个更简单的数学解决方案.
例如,如果x不是0那么我可以检查它是否为负,如果是,那么它X_LEFT.
我想补充一点,X,Y,Z可以是-1,0或1.
看来你不仅要验证只有一个不是零,而且你实际上需要确定一个Direction值.
由于价值x只能是-1,0或者1,如果你增加1你得到的x可能0,1或者2,这将适合2位.如果您为y和z移动它们并执行相同操作,则可以将所有3组合成单个int值.
从技术上讲,你只需要移动2来防止比特重叠,但为了清楚起见,我们将移动y4和z8,所以它们每个都在一个单独的半字节中.
switch ((x + 1) | ((y + 1) << 4) | ((z + 1) << 8)) {
case 0x110: return Direction.X_LEFT; // x == -1, y == 0, z == 0
case 0x112: return Direction.X_RIGHT; // x == 1, y == 0, z == 0
case 0x101: return Direction.DOWN; // x == 0, y == -1, z == 0
case 0x121: return Direction.TOP; // x == 0, y == 1, z == 0
case 0x011: return Direction.Z_LEFT; // x == 0, y == 0, z == -1
case 0x211: return Direction.Z_RIGHT; // x == 0, y == 0, z == 1
default: return null; // other invalid combination
}
Run Code Online (Sandbox Code Playgroud)
这种位操作是否满足您对"简单数学解决方案"的需求?
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |