对于基于磁贴的游戏,我需要根据给定的点偏移(两点之间的差异)计算方向。例如,假设我站在点(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 :(得分: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类或扩展库中的现有类。