从一点到另一点以相同的角度移动?

时间:2013-04-28 20:50:22

标签: java android trigonometry angle

我需要能够将我的播放器x和y像素在与点相同的方向上移动。这很难解释,但这就是我想要做的事情:

enter image description here

角度1和2必须相同。点1在(100,100)处保持不变,但是点2不断变化,角度也必须如此。我试过这个:

moveRectangle.setX(touchEvent.getX());
moveRectangle.setY(touchEvent.getY());
float theta = (float) Math.toDegrees(Math.atan2(touchEvent.getY() - 100,touchEvent.getY() - 100));
float velX = (float) (getSpeed() * Math.cos(theta));
float velY = (float) (getSpeed() * Math.sin(theta));
player.move(velX, velY);

当用户将手指放在moveRectangle(Point 2)上并移动它时,上面的代码会一直运行。但上面的代码不起作用。玩家只是朝两个方向之一移动。 player.move只是添加了velX和velY的速度。那么如何才能获得两个角度并将玩家向正确的方向移动?感谢。

3 个答案:

答案 0 :(得分:2)

使用笛卡尔方法(向量)与极坐标方法(角度和幅度)来解决这个问题会更容易吗?因此,如果玩家位于p0点并且“手指”位于p1点,那么玩家应该移动v的方向由向量p1-p0给出。然后,您可以按照玩家的速度缩放生成的矢量v,并将玩家的速度添加到他的位置。您可以在逐帧的基础上轻松完成此操作。

答案 1 :(得分:1)

你需要知道X轴和Y轴的速度吗?你可以在不使用三角法的情况下完成它(只需使用Pythagorean theorem)。

final float deltaX = touchEvent.getX() - player.x; // player.x is point1.x
final float deltaY = touchEvent.getY() - player.y; // player.y is point1.y
final float length = Maths.sqrt((deltaX)^2 + (deltaY)^2);
final float itterations = length / getSpeed();
final float velX = deltaX / itterations;
final float velY = deltaY / itterations;
player.move(velX, velY);

或者你需要一个玩家在循环中移动的代码?

答案 2 :(得分:0)

删除Math.toDegrees()

来自Math.sin() / cos() Javadoc:

参数:

  • a - 角度,以弧度表示。

返回:

  • 论证的正弦。