unity3d之计算两向量旋转角.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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.h double 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; // normalize dist = sqrt( x1 * x1 + y1 * y1 ); x1 /= dist; y1 /= dist; dist = sqrt( x2 * x2 + y2 * y2 ); x2 /= dist; y2 /= dist; // dot product dot = 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 product cross = 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)

ktj823 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档