java - 一种检查只有一个变量不为 0 的简短数学方法

标签 java variables vector

我有一个给定的方法 Direction calculateDirection(Vector3 from, Vector3 to) 其中 Vector3 包含 X、Y、Z

该方法的目的是计算一条直线方向,不能是对角线,只能是X_LEFT或者X_RIGHT,或者Z_LEFT,或 Z_RIGHTTOPDOWN

所以我开始获取偏移量:

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 或抛出一个 异常

为此,我需要执行一些ifelseif,但我对此感到不舒服,我觉得可以有一个更简单的方法数学解。

例如,如果只有 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/

相关文章:

java - 在实体对象中将 native SQL 与默认 Hibernate 行为混合?

Java Web Start 应用程序获得不受限制的访问权限,但仍请求许可

c++ - 在分区算法中不交换 vector 元素。

c++ - 利用 vector 的元素存储在堆中的事实?

java - MongoDB 查询无效

java - 使用 neo4j-jdbc 驱动程序与 Java 连接 neo4j

javascript - 使用 Javascript 访问 ASP session 变量

PHP 永久变量,但可变?

javascript - 表达式中使用了未声明、未初始化的变量 : what to think?

c++ - vector 的两个特征之间的差异