本人遇到一个问题,关于空间三维向量旋转角度问题, 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))  
×××××××××××××××××××××××××××××××××××××××××××××××××××××× 
请问有没有啥好办法?谢谢指教

解决方案 »

  1.   

    arccos(dot(n1,n2)) 就可以,你只要再判断一下 n1 * n2(叉积)的正负就可以判断这个角在0-PI还是PI-2PI
      

  2.   

    1、(a×b).N>0   a×b与N(平面法向量) 同向:
       (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之间;
      

  3.   

    谢谢大家的建议
    不过还是有疑问
    一楼的朋友:n1Xn2(叉乘)如何来确定正负?它们相乘是个向量。
    二楼的朋友:平面的法向量怎么来确定求出?我认为平面的法向量是自己定义,如果从沿着法向量的方向看去a逆时针旋转theta角度到b,theta的范围是0~2pi,这种情况下,N和a×b反向( 我就是要解决这个问题)。现在按您说的,如果N和a×b反向,则只能确定pi~2pi的范围,还是不能完成0~2pi计算。
    我还是不明白法向量是怎么确定,难道N可以在a到b旋转的过程中改变方向?
    请指教,thanks!
      

  4.   

    sorry , I have got the point, thanks very much!