我有一个给定的方法 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();
}
所以要知道方向,这些变量之一不应该为 0,如果有多个变量不为 0,我需要返回 null
或抛出一个 异常
。
为此,我需要执行一些if
、elseif
,但我对此感到不舒服,我觉得可以有一个更简单的方法数学解。
例如,如果只有 x
不是 0
,那么我可以检查它是否为负数,如果是,则它是 X_LEFT
。
我想补充一点,X、Y、Z 可以是 -1、0 或 1。
最佳答案
看来你不只是想验证只有一个不为零,而是你实际上需要确定一个Direction
。值(value)。
由于x
的值(value)只能是-1
, 0
, 或 1
,如果您添加 1
你明白了 x
可以是0
, 1
, 或 2
,这将适合 2 位。如果您随后对 y
执行相同操作和 z
并移动它们的位,然后您可以将所有 3 个组合成一个 int
值(value)。
从技术上讲,您只需要移动 2 以防止位重叠,但为了清楚起见,我们将移动 y
通过 4 和 z
到 8 点,所以他们每个人都会在一个单独的 nibble 中.
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
}
这种位操作是否涵盖了您对“简单数学解决方案”的渴望?
关于java - 一种检查只有一个变量不为 0 的简短数学方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42857201/