本人遇到一个问题,关于空间三维向量旋转角度问题, a(x1,y1,z1) 旋转到b(x2,y2,z2)怎样来确定他们的角度?
angle = arccos(dot(n1,n2))
由此得到的夹角值的范围是[0,PI]之间,由于我现在处理的是向量,它们之间的夹角的实际值域应该在[0,2PI]之间,请问如何计算得到两个向量的夹角在[0,2PI]之间?
别人提供的办法不合适
******************************************************
补充说明一下,在本人的blog当中的算法公式是:
theta = atan2 ( (a×b) *N, a*b )
这里面,N是a,b所在平面的单位法向量(这个方向也许和a×b相同,也许相反的)
也就是把a旋转theta到达b方向时候的转轴
当a和b是任意的空间向量,而N是未知的时候,一般取a×b作为旋转轴
那么这个时候,不需要上面的公式,只需要计算
theta = acos(a*b/|a|/|b|)
结果是0到Pi
而事实上,按照a×b作为转轴旋转的时候,角度只会是0到Pi之间的
×××××××××××××××××××××××××××××××××××××××××××××××××××××
定义:平面上的三点P1(x1,y1),P2(x2,y2),P3(x3,y3)的面积量:
|x1 x2 x3|
S(P1,P2,P3) = |y1 y2 y3| = (x1-x3)*(y2-y3) - (y1-y3)(x2-x3)
|1 1 1|
当P1P2P3逆时针时S为正的,当P1P2P3顺时针时S为负的。
所以你只要算S(N2,0,N1)的值,
如果大于或等于0,angle = arccos(dot(n1,n2)),
小于0,则angle = 2PI - arccos(dot(n1,n2))
××××××××××××××××××××××××××××××××××××××××××××××××××××××
请问有没有啥好办法?谢谢指教
angle = arccos(dot(n1,n2))
由此得到的夹角值的范围是[0,PI]之间,由于我现在处理的是向量,它们之间的夹角的实际值域应该在[0,2PI]之间,请问如何计算得到两个向量的夹角在[0,2PI]之间?
别人提供的办法不合适
******************************************************
补充说明一下,在本人的blog当中的算法公式是:
theta = atan2 ( (a×b) *N, a*b )
这里面,N是a,b所在平面的单位法向量(这个方向也许和a×b相同,也许相反的)
也就是把a旋转theta到达b方向时候的转轴
当a和b是任意的空间向量,而N是未知的时候,一般取a×b作为旋转轴
那么这个时候,不需要上面的公式,只需要计算
theta = acos(a*b/|a|/|b|)
结果是0到Pi
而事实上,按照a×b作为转轴旋转的时候,角度只会是0到Pi之间的
×××××××××××××××××××××××××××××××××××××××××××××××××××××
定义:平面上的三点P1(x1,y1),P2(x2,y2),P3(x3,y3)的面积量:
|x1 x2 x3|
S(P1,P2,P3) = |y1 y2 y3| = (x1-x3)*(y2-y3) - (y1-y3)(x2-x3)
|1 1 1|
当P1P2P3逆时针时S为正的,当P1P2P3顺时针时S为负的。
所以你只要算S(N2,0,N1)的值,
如果大于或等于0,angle = arccos(dot(n1,n2)),
小于0,则angle = 2PI - arccos(dot(n1,n2))
××××××××××××××××××××××××××××××××××××××××××××××××××××××
请问有没有啥好办法?谢谢指教
解决方案 »
- vs2008删除资源出错的问题
- MCIWndCreate窗口闪烁求助
- 在线等,垂直画图问题
- 一个奇怪的mainframe-view问题
- 用MFC的对话框,上面放了两个按钮和一个MS的图片控制件.我现在可以让图片控制显示一个图片.如果让程序按第一个按钮显示第二个图片,
- (急::在线等待!!)怎么在TreeView视图中动态添加结点??
- 编辑时的参数列表问题!请教.
- socket客户端 用 send(连续发送多个消息时,服务器只能收到第一个消息。如何实现连续接收消息?
- 如何获得本地IP??
- 32bit位图
- 为什么在RELEASE模式下编译不行呢?
- error C2664: 'dberrhandle' : cannot convert parameter 1 from 'int (void *,int,int,int,const char *,const char *)' to 'int (__std
(1)、如果a.b>=0 角度在0~pi/2之间;
(2)、如果a.b<0 角度在pi/2~pi之间;
2、(a×b).N<0 a×b与N 反向:
(1)、如果a.b>=0 角度在3pi/2~2pi之间;
(2)、如果a.b<0 角度在pi~3pi/2之间;
不过还是有疑问
一楼的朋友:n1Xn2(叉乘)如何来确定正负?它们相乘是个向量。
二楼的朋友:平面的法向量怎么来确定求出?我认为平面的法向量是自己定义,如果从沿着法向量的方向看去a逆时针旋转theta角度到b,theta的范围是0~2pi,这种情况下,N和a×b反向( 我就是要解决这个问题)。现在按您说的,如果N和a×b反向,则只能确定pi~2pi的范围,还是不能完成0~2pi计算。
我还是不明白法向量是怎么确定,难道N可以在a到b旋转的过程中改变方向?
请指教,thanks!