- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
unity3d之计算两向量旋转角
unity3d之计算两向量的旋转角
? ? ? ? 向量的点乘和叉乘都是很有用的数学工具,不过他们也有局限性。关键是向量点乘可以得到两个向量之间的夹角, 而不是旋转角,这个角度是没有方向的,范围是[0-pi], 而这往往不是我们想要的, 实际问题中我们常常要计算从向量p1沿逆时针方向转到与向量p2方向一致的确切角度,我把这个角度定义为旋转角。 旋转角的计算既需要夹角,还需要两个向量的叉乘, 以确定p1和p2的角度方向关系。
关于叉乘符号与向量的角度方向关系,请参考《算法导论》,我只给出结论:
?????? p1 * p2 = x1y2? - x2 y1?= -p2 * p1
? ? ? If p1 * p2 is positive, then p1 is?clockwise from p2 with respect to the origin (0, 0); if this cross product is negative, then p1 is counterclockwise ? ? ? from p2.
?另外考虑的是共线(collinear )的问题, arcsine很难处理这个问题, 不过arecosine却能够明确的区分0和pi,因此作为特殊情况提前得出结论。
?代码如下:文章出处
#i nclude stdio.h#i nclude math.hdouble getRotateAngle(double x1, double y1, double x2, double y2);int main(int argc, char **argv){double x1, x2, y1, y2;double dist, dot, degree, angle;freopen(angle.in, r, stdin);while(scanf(%lf%lf%lf%lf, x1, y1, x2, y2) == 4) {printf(the rotate angle from p1 to p2 is %.3lf\n,?getRotateAngle(x1, y1, x2, y2));}}/** 两个向量之间的旋转角* 首先明确几个数学概念:* 1. 极轴沿逆时针转动的方向是正方向* 2. 两个向量之间的夹角theta, 是指(A^B)/(|A|*|B|) = cos(theta),0=theta=180 度, 而且没有方向之分* 3. 两个向量的旋转角,是指从向量p1开始,逆时针旋转,转到向量p2时,所转过的角度, 范围是 0 ~ 360度* 计算向量p1到p2的旋转角,算法如下:* 首先通过点乘和arccosine的得到两个向量之间的夹角* 然后判断通过差乘来判断两个向量之间的位置关系* 如果p2在p1的顺时针方向, 返回arccose的角度值, 范围0 ~ 180.0(根据右手定理,可以构成正的面积)* 否则返回 360.0 - arecose的值, 返回180到360(根据右手定理,面积为负)*/?double getRotateAngle(double x1, double y1, double x2, double y2){const double epsilon = 1.0e-6;const double nyPI = acos(-1.0);double dist, dot, degree, angle;// normalizedist = sqrt( x1 * x1 + y1 * y1 );x1 /= dist;y1 /= dist;dist = sqrt( x2 * x2 + y2 * y2 );x2 /= dist;y2 /= dist;// dot productdot = x1 * x2 + y1 * y2;if ( fabs(dot-1.0) = epsilon )?angle = 0.0;else if ( fabs(dot+1.0) = epsilon )?angle = nyPI;else {double cross;angle = acos(dot);//cross productcross = x1 * y2 - x2 * y1;// vector p2 is clockwise from vector p1?// with respect to the origin (0.0)if (cross 0 ) {?angle = 2 * nyPI - angle;}?}degree = angle * 180.0 / nyPI;return degree;}
本文有关于两向量的旋
文档评论(0)