我正在开发一个用户用手指移动汽车的游戏。汽车被表示为向量(屏幕中的一点和旋转角度)。当用户开始拖动汽车时,他会生成一个新的点P。我正在尝试平滑汽车的移动,这样如果该点在+/- 10px的某个地方,它就不会改变角度,这是汽车的边缘(汽车表示为矩形)。下面是一张更好地解释的图片:

如何求M(x,y)点?
(请注意,角度α是汽车的旋转,而不是点O和P的角度)
发布于 2015-01-12 17:29:16
不确定我是否做对了,但是:
- so truncate to some angles for that常量double acc=5.0*M_PI/180.0;//截断到5度角步长double a=atan2(P.y-O.y,P.x-O.x);// P方向rad a=round(a/acc)*acc;//截断M.x=x0+delta*cos(a);M.y=y0+delta*sin(a);
-其中delta是速度*获取M作为新车位置的时间
- then use angle integration insteaddouble alpha=0.0;//汽车方向rad double omega=0.0;//汽车转速rad/s double epsilon=0.0;//汽车旋转加速度rad/s^2 //在计时器(update)中,间隔dt s double a=atan2(P.y-O.y,P.x-O.x);// P方向rad a-=α;// (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添加一些调节器
你只需要M,知道P,O,
,
- then exploit dot productD.x=cos(a);D.y=sin(a);M=O+(D*点(P-O,D));if (|M-P|<10px) ignore_turning;
-以防万一dot(A,B)=(A.x*B.x)+(A.y*B.y);
发布于 2015-01-13 00:16:18
OM垂直于PM,方向由a (alpha)定义,即OM= 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),
给m = x1.cos a + y1.sin a。
OM= (x1.cos a + y1.sin a).(cos a, sin a).
发布于 2015-01-12 03:53:55
给定O(x0,y0),α和P(x1,y1):
M.x = 1/2 ( (y0 - y1) / tan(alpha) + x0 + x1 )
M.y = 1/2 ( (x0 - x1) * tan(alpha) + y0 + y1 )您可能需要调整标志以匹配您的坐标系
https://stackoverflow.com/questions/27891003
复制相似问题