题
对于我的基于瓷砖的游戏,我需要根据给定点偏移(两个点之间的差异)来计算方向。例如,假设我站在点(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点类或扩展库中的现有操作类。
不隶属于 StackOverflow