我正在开发一种用户用手指移动汽车的游戏。汽车表示为矢量(屏幕中的一个点和旋转角度)。当用户开始拖动汽车时,他会产生一个新点P.我试图平滑汽车的移动,因此如果该点位于+/- 10px(汽车的余量)的某个位置,它将不会改变其角度(汽车表示为矩形)。这是一张图片,可以更好地解释:
如何找到M(x,y)点?
(请注意,角度α是汽车的旋转,而不是点O和P的角度)
答案 0 :(得分:0)
不确定我是否做得对,但是:
您希望消除小角度差异以避免振荡
因此截断到某个角度
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作为新车位置的时间
你想让汽车更逼真
然后使用角度整合
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);
你也应该将积分用于职位......
你只需要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 )
您可能需要调整符号以匹配您的坐标系