我有以下代码,我可以看到值之间存在连接。但是,我可以不弄清楚如何使用一些add subtract modelo haxx删除switch语句。真的会帮助一些方法让这个方法更顺畅。
标题变量为0,1,2或3。
public static int getRotation(Point currentPoint, Point nextPoint, int heading) {
int rotation = -1;
if(currentPoint.getX() < nextPoint.getX()) /* DRIVE WEST */ {
switch(heading) {
case 0: rotation = 1; break;
case 1: rotation = 0; break;
case 2: rotation = 3; break;
case 3: rotation = 2; break;
}
} else if(currentPoint.getX() > nextPoint.getX()) /* DRIVE EAST */ {
switch(heading) {
case 0: rotation = 3; break;
case 1: rotation = 2; break;
case 2: rotation = 1; break;
case 3: rotation = 0; break;
}
} else if(currentPoint.getY() < nextPoint.getY()) /* DRIVE NORTH */ {
switch(heading) {
case 0: rotation = 0; break;
case 1: rotation = 3; break;
case 2: rotation = 2; break;
case 3: rotation = 1; break;
}
} else if(currentPoint.getY() > nextPoint.getY()) /* DRIVE SOUTH */ {
switch(heading) {
case 0: rotation = 2; break;
case 1: rotation = 1; break;
case 2: rotation = 0; break;
case 3: rotation = 3; break;
}
}
return rotation;
}
编辑:我忘了提到nextPoint只能是+ -x或y与currentPoint相比。如果currentPoint是(0,0)newPoint必须是(-1,0),(1,0),(0,-1)或(0,1)。
答案 0 :(得分:3)
最好的方法是使用数学向量来指示当前的方向。
答案 1 :(得分:3)
你可以试试。
int eastWest = Double.compare(currentPoint.getX(), nextPoint.getX())
if (eastWest == 0) {
int northSouth = Double.compare(currentPoint.getX() , nextPoint.getX())
/* DRIVE NORTH (-1), SOUTH (+1) */
if (northSouth == 0)
rotation = -1;
else
rotation = (5 + northSouth - heading) % 4;
} else {
/* DRIVE WEST (-1), EAST (+1) */
rotation = heading ^ (2 + eastWest);
}
注意:我希望看到这些功能的一些对称性,每个方向看起来都有不同的组合,听起来不对。
答案 2 :(得分:2)
所有旋转值都是“0321”的旋转版本(北:0321,东:3210,南:2103,西:1032)。一个简单的解决方案是创建一个包含“03210321”的数组,并为每种情况使用不同的索引访问它。伪代码:
initialise array arr with 0,3,2,1,0,3,2,1
index = 0 for north, 1 for east, 2 for south, 3 for west
rotation = arr[index+heading];
编辑:我认为我们可以使用这个数学表达式而不是数组:
index = 0 for north, 1 for east, 2 for south, 3 for west
rotation = (8 - (index+heading)) % 4;
答案 3 :(得分:2)
它几乎不可读,但如果你想编写更少的代码,你可以用简单的数学得到结果:
public static int getRotation(Point currentPoint, Point nextPoint, int heading) {
int dx = (int) Math.signum(nextPoint.getX() - currentPoint.getX());
int dy = (int) Math.signum(nextPoint.getY() - currentPoint.getY());
return dx != 0 ? (4-heading+dx)%4 : dy != 0 ? (7-heading+dy)%4 : -1;
}
答案 4 :(得分:0)
当然你可以优化上述方法,但将来,在维护时,这种代码的和平将很难理解。
如果你没有更好的想法,请尝试创建4个地图,它将标题映射到旋转值。想想创造一些枚举来展示什么是神秘的1 2 3 4。