Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
rotmat.c
Go to the documentation of this file.00001 #define V2PI 6.2831853071795864
00002 #define VPI  3.1415926535897932
00003 #define VHPI 1.5707963267948966
00004 #define VEPS 0.00001
00005 
00006 
00007 
00008 static THD_dmat33 RCREND_axis_rotmatrix( double th, double a,double b,double c )
00009 {
00010   THD_dmat33 ips,ims,ss,id , rr ;
00011   double na,nb,nc, nn , tp ;
00012 
00013   LOAD_DIAG_DMAT(id,1,1,1) ;             
00014   nn = sqrt(a*a + b*b + c*c) ;           
00015   tp = 0.5 * (th-floor(th/V2PI)*V2PI) ;  
00016 
00017   
00018 
00019   if( nn < VEPS || fabs(tp) < VEPS || fabs(tp-VPI) < VEPS ) return id ;
00020 
00021   
00022 
00023   if( fabs(tp-VHPI) < VEPS ){
00024     na = a/nn ; nb = b/nn ; nc = c/nn ;
00025     LOAD_DMAT(rr , na*na-nb*nb-nc*nc, 2.0*na*nb        , 2.0*na*nc        ,
00026                    2.0*na*nb        , nb*nb-na*na-nc*nc, 2.0*nb*nc        ,
00027                    2.0*na*nc        , 2.0*nb*nc        , nc*nc-na*na-nb*nb ) ;
00028     return rr ;
00029   }
00030 
00031   
00032 
00033 
00034 
00035   ss.mat[0][0] = ss.mat[1][1] = ss.mat[2][2] = 0.0 ;
00036   nn = tan(tp)/nn ;
00037   na = a*nn ; ss.mat[1][2] =  na ; ss.mat[2][1] = -na ;
00038   nb = b*nn ; ss.mat[0][2] = -nb ; ss.mat[2][0] =  nb ;
00039   nc = c*nn ; ss.mat[0][1] =  nc ; ss.mat[1][0] = -nc ;
00040   ims = SUB_DMAT(id,ss) ;
00041   ips = ADD_DMAT(id,ss) ; ss = DMAT_INV(ips) ;
00042   rr  = DMAT_MUL(ims,ss) ;
00043 
00044   return rr ;
00045 }