【问题标题】:Move in the same angle from point to point?以相同的角度从一个点移动到另一个点?
【发布时间】:2013-04-29 05:12:43
【问题描述】:

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

角度 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(点 2)上并移动它时,上面的代码会不断运行。但是上面的代码不起作用。玩家只是朝两个方向之一移动。 player.move 只是添加了 velX 和 velY 速度。那么如何获得这两个角度并将玩家移动到正确的方向呢?谢谢。

【问题讨论】:

    标签: java android trigonometry angle


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您只需要知道 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);
      

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

      【讨论】:

      • 我怎么没想到呢?这正是我所需要的,谢谢。
      • 但有一个问题,当我以 45 度的增量移动时,它会停止。 (直线上升,下降等......)
      • @user2005938,你能显示代码吗?有些问题可能是停止检查。
      • 没关系,如果没有速度,我在播放器类中有一段代码会停止运动。
      【解决方案3】:

      删除Math.toDegrees()

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

      参数:

      • a - 一个角度,以弧度为单位。

      返回:

      • 参数的正弦值。

      【讨论】:

        猜你喜欢
        • 2017-11-25
        • 2018-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多