2010-08-29 104 views
6

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

当然,它可以被优化或缩短。任何帮助?谢谢。

+0

这是否甚至编译?当x和y都为0时,它不会返回一个值。 – 2010-08-29 12:37:49

+0

它看起来很好,因为它(模仿Matti找到的'else')。您可以将“return”语句分解出来,但这通常是在字节码级别上可能不是一个的优化,而编译器应该能够为您做的一个优化。你可以计算条件'y <0' and 'y> 0'的计算结果,但再次,一个体面的编译器应该能够为你做到这一点。您可以更改某个方向的表示方式(例如,一对N/S轴和W/E轴分别为-1,0或1的数字)使此方法更简单,但似乎没有必要。 – 2010-08-29 12:40:26

+0

@Matti Virkkunen啊你是对的(改变)。失败的复制粘贴... – someguy 2010-08-29 12:44:30

回答

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

+0

几乎正确。但x或y可以大于1或小于-1 – mhshams 2010-08-29 12:43:40

+0

@mohammad shamsi对于'Math.sgn'返回的值是-1,0或1以外的值是什么? – 2010-08-29 12:47:28

+0

@帕斯卡尔:我最初忘了使用'sgn',这可能是什么促使了他的评论。然后我发现Java似乎没有'sgn'整数。咩。 – 2010-08-29 12:48:24

0
  • 定义二维数组来保存所有状态。基于它们的值(X> 0或x < 0或x == 0)

  • 返回的数组的特定索引

  • 转换x和y为0,1或2。

0

这就像你可以得到的那样简短和干净,如果你用这种方式表示八个基本方向,就是单独的枚举值。你在8个不同的返回值之间选择,所以具有8片叶子的决策树是你能做的最好的。

如果您将方向分为两个组件(N-S和E-W),但您不知道更多关于您的方向的内容,我们无法知道这是否值得您付出麻烦。

0

你可以接收和返回你的方向作为点或类似的东西(无论如何,一个(x,y)元组)。所以,如果你在P0 =站立(10,4),并希望移动到P1 =(8,6),其结果将是(伪代码):

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

可以计算的常态整数,如果你除以它的绝对值。所以对于一个点你计算两个成员的规范。请记住(-1,1)比3更有表现力,并且可以以更简单的方式进行操作。

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

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; 
    }