我如何告诉java它更接近350->;355->;360->;05度,而不是一路
我正在创建一个赛车游戏,在这个游戏中,我在创建AI时遇到了一些问题。我需要做的是将AI从X,Y位置移动到另一个X,Y位置的“检查点”。AI驾驶轨迹将通过在将要前往的地图周围放置不同的不可见检查点来创建 我可以通过计算从我到检查点的X,Y的差值得到检查点的方向,然后使用tan(Deg)=Y/X,它给出了我从当前位置必须走的方向我如何告诉java它更接近350->;355->;360->;05度,而不是一路,java,math,geometry,degrees,Java,Math,Geometry,Degrees,我正在创建一个赛车游戏,在这个游戏中,我在创建AI时遇到了一些问题。我需要做的是将AI从X,Y位置移动到另一个X,Y位置的“检查点”。AI驾驶轨迹将通过在将要前往的地图周围放置不同的不可见检查点来创建 我可以通过计算从我到检查点的X,Y的差值得到检查点的方向,然后使用tan(Deg)=Y/X,它给出了我从当前位置必须走的方向 distanceToMoveX = checkpoint1X - this.getX(); distanceToMoveY = checkpoint1Y - this.ge
distanceToMoveX = checkpoint1X - this.getX();
distanceToMoveY = checkpoint1Y - this.getY();
newDirection = ((double)distanceToMoveY / distanceToMoveX) * 100;
所以现在我有了一个方向,我必须从我现在的位置出发,我也有了一个方向,我现在正在前进。我现在想做的是让我的AI意识到,如果我现在的方向是350,我想去10,它就更接近右转了。因为现在是这样,我只能让它一直向右或向左转动。您可以使用(0;360)范围以外的度数,因此您可以将f.e.从360转到365,并且它可以按预期工作。如果你想稍后比较两个角度,只需说角度%360,我想你可以在某个地方计算实际角度和下一个角度之间的差值,比如
turn=newDirection-actualDirection
执行10-350=-340
会告诉你AI需要旋转-340°
然而,(10-350+360)%360=20
告诉你的AI需要旋转+20°。添加360是为了确保角度为正,因此模将按预期工作(因为-340%360=-340)
你真正想要的是,转弯角度永远不要超过180°。因此,在0和360之间减少之前再添加180,然后删除它们,这将使结果在[-180180]中移动,同时保持模块360°(因此角度相同):
turn=(新方向-实际方向+540)%360-180
然后,如果您不想一次完成,您可以按自己的意愿将此转弯打断,例如,像您似乎已经在做的那样,每次5度。这就是选择方向所需的(这是一个硬编码值的示例):
private int-correctedDirectionCalculation(int-calculation){
收益计算>=0?计算:计算+360;
}
公共无效选择方向(){
int targetDirection=5;
int currentDirection=360;
int goingRightDistance=修正的方向计算(targetDirection-currentDirection);
int goingLeftDistance=修正的方向计算(currentDirection-targetDirection);
System.out.println(goingLeftDistance
至于渲染时Y轴上的反转值,我想您只需要反转Y值来修复它(乘以-1)
private int correctedDirectionCalculation(int calculation){
return calculation >= 0 ? calculation : calculation + 360;
}
public void chooseDirection() {
int targetDirection = 5;
int currentDirection = 360;
int goingRightDistance = correctedDirectionCalculation(targetDirection - currentDirection);
int goingLeftDistance = correctedDirectionCalculation(currentDirection - targetDirection);
System.out.println(goingLeftDistance < goingRightDistance ? "Go Left!" : "Go Right!");
}