对于我的基于瓷砖的游戏,我需要根据给定点偏移(两个点之间的差异)来计算方向。例如,假设我站在点(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;
        }
    }
}

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

有帮助吗?

解决方案

我认为最容易理解的方法是制作一个静态数组,其中包含所有情况的值。

// 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 功能?)

其他提示

我的答案是条件:)。

   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;
    }
  • 定义一个2D阵列以保持所有状态。

  • 将X和y转换为基于其值(x> 0或x <0或x == 0)的0、1或2

  • 返回数组的特定索引。

如果您以这种方式代表八个主要方向,这将尽可能简短而干净,就像单独的枚举值一样。您正在选择八个不同的返回值之间,因此,拥有八片叶子的决策树是您能做的最好的。

如果您将方向分为两个组件(NS和EW),您可能会得到一些更整洁的东西,但没有更多地了解您的内容 有了方向,我们不知道这是否值得。

您可以接收并返回指导作为点或类似的方向(无论如何,(x,y)元组)。因此,如果您站在p0 =(10,4)中,并想移动到p1 =(8,6),则结果将是(以伪代码为单位):

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

如果将整数的规范除以其绝对值,则可以计算整数的规范。因此,您可以计算两个成员的规范。请记住,(-1,1)比3更具表现力,您可以以更轻松的方式进行操作。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top