EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 1880|回复: 20
打印 上一主题 下一主题

[计算机图形学] 计算两向量的旋转角

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12396

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-9 14:25:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
向量的点乘和叉乘都是很有用的数学工具,不过他们也有局限性。关键是向量点乘可以得到两个向量之间的夹角, 而不是旋转角,这个角度是没有方向的,范围是[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,因此作为特殊情况提前得出结论。

ps.因为主要是openGL要用, 所以返回的是角度值

/************************************************************************/
/* author  : [email=Navy@hust]Navy@hust[/email]
* file    : angle.c
* date     : 5/12/2007
* desc     : vector rotate angle calculation
/************************************************************************/
#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;
}转自:http://www.cadcaecam.com/forum.php?mod=viewthread&tid=80511&extra=page%3D3
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12396

社区QQ达人

推荐
 楼主| 发表于 2014-5-21 14:00:24 | 只看该作者
路过  一样顶
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言

4

主题

851

帖子

1307

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1307
推荐
发表于 2014-3-26 16:18:12 | 只看该作者
路过!!! 不发表意见……

13

主题

730

帖子

1691

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1691
推荐
发表于 2014-3-5 16:42:12 | 只看该作者
(*^__^*) 嘻嘻……

8

主题

702

帖子

1224

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1224
4F
发表于 2014-3-4 14:25:50 | 只看该作者
顶...... 楼下跟上.....

23

主题

538

帖子

1101

积分

BIM项目负责人

Rank: 5Rank: 5Rank: 5Rank: 5Rank: 5

积分
1101
8F
发表于 2014-3-5 16:48:55 | 只看该作者
顶...... 楼下跟上.....

4

主题

851

帖子

1307

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1307
11F
发表于 2014-4-1 10:38:58 | 只看该作者
路过!!!
不发表意见……

6

主题

853

帖子

1347

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1347
12F
发表于 2014-4-1 10:41:29 | 只看该作者
顶......
楼下跟上.....

18

主题

1060

帖子

1652

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1652

特殊贡献勋章

14F
发表于 2014-4-1 10:47:56 | 只看该作者
顶......
楼下跟上.....
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-9-28 10:18

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表