根据点偏移计算方向

时间:2010-08-29 12:32:48

标签: java math direction

对于基于磁贴的游戏,我需要根据给定的点偏移(两点之间的差异)计算方向。例如,假设我站在点(10,4)并且我想要移动到点(8,6)。我移动的方向是西北方向。计算这个的最佳方法是什么?

这是我在Java中的基本实现。

public int direction(int x, int y) {
    if (x > 0) {
        if (y > 0) {
            return 0; // NE
        } else if (y < 0) {
            return 1; // SE
        } else {
            return 2; // E
        }
    } else if (x < 0) {
        if (y > 0) {
            return 3; // NW
        } else if (y < 0) {
            return 4; // SW
        } else {
            return 5; // W
        }
    } else {
        if (y > 0) {
            return 6; // N
        } else if (y < 0) {
            return 7; // S
        } else {
            return -1;
        }
    }
}

当然可以优化或缩短它。有帮助吗?感谢。

5 个答案:

答案 0 :(得分:4)

我认为最容易理解的方法是创建一个包含所有情况值的静态数组。

// Won't say anything about how much these values make sense
static final int[][] directions = {
    {3,  6, 0},
    {5, -1, 2}, // -1 for "no direction", feel free to replace
    {4,  7, 1}
};

public int direction(int x, int y) {
    x = (x < 0) ? 0 : ((x > 0) ? 2 : 1);
    y = (y < 0) ? 0 : ((y > 0) ? 2 : 1);

    return directions[y][x];
}

编辑: 现在它是正确的(为什么这么多语言缺少正确的sgn功能?)

答案 1 :(得分:1)

我的答案如果条件:)。

   public int direction(int x, int y) {
        //0 NE, 1 SE, 2 E, 3 NW, 4 SW, 5 W, 6 N, 7 S, 8 (Same place / Not a direction)  
        int direction = 0;

        if(x < 0){
            direction = 3;
        }else if(x == 0){
            direction = 6;
        }

        if(y < 0){
            direction = direction + 1;
        }else if(y == 0){
            direction = direction + 2;
        }
            return direction;
    }

答案 2 :(得分:0)

  • 定义一个2D数组以保存所有状态。

  • 根据价值(x> 0或x <0或x == 0)将x和y转换为0,1或2

  • 返回数组的特定索引。

答案 3 :(得分:0)

如果您以这种方式表示八个基本方向,那么这就像您可以得到的那样短而干净,作为单独的枚举值。您可以在八个不同的返回值之间进行选择,因此您可以选择具有八个叶子的决策树。

如果你将方向划分为两个组件(NS和EW),你可能会得到一些更整洁的东西,但是如果不知道你用方向做什么,我们无法知道这是否值得麻烦。

答案 4 :(得分:0)

你可以接收并返回你的方向点或类似的东西(无论如何,(x,y)元组)。所以,如果你站在p0 =(10,4)并想要转到p1 =(8,6),结果将是(在伪代码中):

norm(p1 - p0) = norm((-2,2)) = (-1,1)

如果将整数除以其绝对值,则可以计算整数的范数。因此,您可以计算两个成员的标准。请记住,(-1,1)比3更具表现力,你可以用它更容易操作。

如果您需要特定的操作,可以创建自己的Java Point类或扩展库中的现有类。