使用给定的一个向量和一个点在直角三角形中找到点

时间:2015-01-11 19:12:44

标签: graphics geometry trigonometry

我正在开发一种用户用手指移动汽车的游戏。汽车表示为矢量(屏幕中的一个点和旋转角度)。当用户开始拖动汽车时,他会产生一个新点P.我试图平滑汽车的移动,因此如果该点位于+/- 10px(汽车的余量)的某个位置,它将不会改变其角度(汽车表示为矩形)。这是一张图片,可以更好地解释: enter image description here

如何找到M(x,y)点?

(请注意,角度α是汽车的旋转,而不是点O和P的角度)

3 个答案:

答案 0 :(得分:0)

不确定我是否做得对,但是:

  1. 您希望消除小角度差异以避免振荡

    • 因此截断到某个角度

      const double acc=5.0*M_PI/180.0; // truncate to 5 deg angle steps
      double a=atan2(P.y-O.y,P.x-O.x); // P direction [rad]
      a=round(a/acc)*acc;                // truncate
      M.x=x0+delta*cos(a);
      M.y=y0+delta*sin(a);
      
    • 其中delta是速度*将M作为新车位置的时间

  2. 你想让汽车更逼真

    • 然后使用角度整合

      double alpha=0.0; // car direction [rad]
      double omega=0.0; // car rotation speed [rad/s]
      double epsilon=0.0; // car rotation acceleration [rad/s^2]
      // in timer (update) with interval dt [s]
      double a=atan2(P.y-O.y,P.x-O.x); // P direction [rad]
      a-=alpha; // get the difference and handle overflows
      while (a<-M_PI) a+=2.0*M_PI;
      while (a>+M_PI) a-=2.0*M_PI;
      epsilon=(some_rotation_speed_constant)*a/M_PI;
      omega+=epsilon*dt;
      alpha+=omega*dt;
      M.x=x0+delta*cos(alpha);
      M.y=y0+delta*sin(alpha);
      
    • 你也应该将积分用于职位......

    • 如果您不想手动操作,也可以为转向轮P,PI或PID添加一些调节器
  3. 你只需要M并知道P,O和车辆方向角度

    • 然后利用点积

      D.x=cos(a);
      D.y=sin(a);
      M=O+(D*dot(P-O,D));
      if (|M-P|<10px) ignore_turning;
      
    • 以防dot(A,B)=(A.x*B.x)+(A.y*B.y);

答案 1 :(得分:0)

OM PM 垂直,并且在a(alpha)定义的方向上,即 OM {{1} }。

让我们取消点积:

= m.(cos a, sin a)

给予m.(cos a, sin a).(x1 - m.cos a, y1 - m.sin a) = 0 = m.(x1.cos a + y1.sin a - m)

<强> OM m = x1.cos a + y1.sin a

答案 2 :(得分:-1)

给定O(x0,y0),alpha和P(x1,y1):

M.x = 1/2 ( (y0 - y1) / tan(alpha) + x0 + x1 )
M.y = 1/2 ( (x0 - x1) * tan(alpha) + y0 + y1 )

您可能需要调整符号以匹配您的坐标系