首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在给定一个向量和一个点的直角三角形中找点

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

Stack Overflow用户
提问于 2015-01-12 03:12:44
回答 3查看 150关注 0票数 1

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

如何求M(x,y)点?

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

EN

回答 3

Stack Overflow用户

发布于 2015-01-12 17:29:16

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

  1. 您想要消除小角度差异以避免振荡

代码语言:javascript
复制
- 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作为新车位置的时间

  1. 你想让车更逼真吗?

代码语言:javascript
复制
- then use angle integration instead

double 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,

  1. ,a,

代码语言:javascript
复制
- then exploit dot product

D.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);

票数 0
EN

Stack Overflow用户

发布于 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).

票数 0
EN

Stack Overflow用户

发布于 2015-01-12 03:53:55

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

代码语言:javascript
复制
M.x = 1/2 ( (y0 - y1) / tan(alpha) + x0 + x1 )
M.y = 1/2 ( (x0 - x1) * tan(alpha) + y0 + y1 )

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27891003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档