Doxygen Source Code Documentation
thd_rotangles.c File Reference
#include "mrilib.h"
#include "thd_shear3d.h"
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "thd.h"
Go to the source code of this file.
Functions | |
void | mangle_angle (THD_3dim_dataset *, float, char, float *, int *) |
void | THD_rotangle_user_to_dset (THD_3dim_dataset *dset, float th1_in, char ax1_code, float th2_in, char ax2_code, float th3_in, char ax3_code, float *th1_out, int *ax1_out, float *th2_out, int *ax2_out, float *th3_out, int *ax3_out) |
int | THD_axcode (THD_3dim_dataset *dset, char ori) |
int | THD_handedness (THD_3dim_dataset *dset) |
THD_dvecmat | THD_rotcom_to_matvec (THD_3dim_dataset *dset, char *rotcom) |
THD_dmat33 | DBLE_mat_to_dicomm (THD_3dim_dataset *dset) |
THD_mat33 | SNGL_mat_to_dicomm (THD_3dim_dataset *dset) |
Function Documentation
|
Definition at line 308 of file thd_rotangles.c. References THD_3dim_dataset::daxes, LOAD_ZERO_DMAT, THD_dmat33::mat, ORI_A2P_TYPE, ORI_I2S_TYPE, ORI_L2R_TYPE, ORI_P2A_TYPE, ORI_R2L_TYPE, ORI_S2I_TYPE, THD_FATAL_ERROR, THD_dataxes::xxorient, THD_dataxes::yyorient, and THD_dataxes::zzorient. Referenced by main().
00309 { 00310 THD_dmat33 tod ; 00311 00312 LOAD_ZERO_DMAT(tod) ; 00313 00314 switch( dset->daxes->xxorient ){ 00315 case ORI_R2L_TYPE: tod.mat[0][0] = 1.0 ; break ; 00316 case ORI_L2R_TYPE: tod.mat[0][0] = -1.0 ; break ; 00317 case ORI_P2A_TYPE: tod.mat[1][0] = -1.0 ; break ; 00318 case ORI_A2P_TYPE: tod.mat[1][0] = 1.0 ; break ; 00319 case ORI_I2S_TYPE: tod.mat[2][0] = 1.0 ; break ; 00320 case ORI_S2I_TYPE: tod.mat[2][0] = -1.0 ; break ; 00321 00322 default: THD_FATAL_ERROR("illegal xxorient code") ; 00323 } 00324 00325 switch( dset->daxes->yyorient ){ 00326 case ORI_R2L_TYPE: tod.mat[0][1] = 1.0 ; break ; 00327 case ORI_L2R_TYPE: tod.mat[0][1] = -1.0 ; break ; 00328 case ORI_P2A_TYPE: tod.mat[1][1] = -1.0 ; break ; 00329 case ORI_A2P_TYPE: tod.mat[1][1] = 1.0 ; break ; 00330 case ORI_I2S_TYPE: tod.mat[2][1] = 1.0 ; break ; 00331 case ORI_S2I_TYPE: tod.mat[2][1] = -1.0 ; break ; 00332 00333 default: THD_FATAL_ERROR("illegal yyorient code") ; 00334 } 00335 00336 switch( dset->daxes->zzorient ){ 00337 case ORI_R2L_TYPE: tod.mat[0][2] = 1.0 ; break ; 00338 case ORI_L2R_TYPE: tod.mat[0][2] = -1.0 ; break ; 00339 case ORI_P2A_TYPE: tod.mat[1][2] = -1.0 ; break ; 00340 case ORI_A2P_TYPE: tod.mat[1][2] = 1.0 ; break ; 00341 case ORI_I2S_TYPE: tod.mat[2][2] = 1.0 ; break ; 00342 case ORI_S2I_TYPE: tod.mat[2][2] = -1.0 ; break ; 00343 00344 default: THD_FATAL_ERROR("illegal zxorient code") ; 00345 } 00346 00347 return tod ; 00348 } |
|
Definition at line 57 of file thd_rotangles.c. References abs, and THD_axcode(). Referenced by THD_rotangle_user_to_dset().
00059 { 00060 int neg=0 , ax1 ; 00061 float th1=thin ; 00062 00063 switch( ax ){ 00064 default: 00065 if( th1 == 0.0 ){ *thout = 0.0 ; *axout = 0 ; } 00066 else { fprintf(stderr,"*** Illegal ax in mangle_angle\n") ; } 00067 return ; 00068 00069 case '\0': case 'x': case 'X': ax1 = 0 ; break ; 00070 case 'y': case 'Y': ax1 = 1 ; break ; 00071 case 'z': case 'Z': ax1 = 2 ; break ; 00072 00073 case 'A': case 'P': 00074 case 'R': case 'L': 00075 case 'I': case 'S': ax1 = THD_axcode(dset,ax) ; 00076 neg = (ax1 < 0) ; 00077 ax1 = abs(ax1) - 1 ; break ; 00078 } 00079 if( neg ) th1 = -th1 ; 00080 00081 *thout = th1 ; *axout = ax1 ; return ; 00082 } |
|
Definition at line 355 of file thd_rotangles.c. References THD_3dim_dataset::daxes, LOAD_ZERO_MAT, THD_mat33::mat, ORI_A2P_TYPE, ORI_I2S_TYPE, ORI_L2R_TYPE, ORI_P2A_TYPE, ORI_R2L_TYPE, ORI_S2I_TYPE, THD_FATAL_ERROR, THD_dataxes::xxorient, THD_dataxes::yyorient, and THD_dataxes::zzorient. Referenced by THD_init_session().
00356 { 00357 THD_mat33 tod ; 00358 00359 LOAD_ZERO_MAT(tod) ; 00360 00361 switch( dset->daxes->xxorient ){ 00362 case ORI_R2L_TYPE: tod.mat[0][0] = 1.0 ; break ; 00363 case ORI_L2R_TYPE: tod.mat[0][0] = -1.0 ; break ; 00364 case ORI_P2A_TYPE: tod.mat[1][0] = -1.0 ; break ; 00365 case ORI_A2P_TYPE: tod.mat[1][0] = 1.0 ; break ; 00366 case ORI_I2S_TYPE: tod.mat[2][0] = 1.0 ; break ; 00367 case ORI_S2I_TYPE: tod.mat[2][0] = -1.0 ; break ; 00368 00369 default: THD_FATAL_ERROR("illegal xxorient code") ; 00370 } 00371 00372 switch( dset->daxes->yyorient ){ 00373 case ORI_R2L_TYPE: tod.mat[0][1] = 1.0 ; break ; 00374 case ORI_L2R_TYPE: tod.mat[0][1] = -1.0 ; break ; 00375 case ORI_P2A_TYPE: tod.mat[1][1] = -1.0 ; break ; 00376 case ORI_A2P_TYPE: tod.mat[1][1] = 1.0 ; break ; 00377 case ORI_I2S_TYPE: tod.mat[2][1] = 1.0 ; break ; 00378 case ORI_S2I_TYPE: tod.mat[2][1] = -1.0 ; break ; 00379 00380 default: THD_FATAL_ERROR("illegal yyorient code") ; 00381 } 00382 00383 switch( dset->daxes->zzorient ){ 00384 case ORI_R2L_TYPE: tod.mat[0][2] = 1.0 ; break ; 00385 case ORI_L2R_TYPE: tod.mat[0][2] = -1.0 ; break ; 00386 case ORI_P2A_TYPE: tod.mat[1][2] = -1.0 ; break ; 00387 case ORI_A2P_TYPE: tod.mat[1][2] = 1.0 ; break ; 00388 case ORI_I2S_TYPE: tod.mat[2][2] = 1.0 ; break ; 00389 case ORI_S2I_TYPE: tod.mat[2][2] = -1.0 ; break ; 00390 00391 default: THD_FATAL_ERROR("illegal zxorient code") ; 00392 } 00393 00394 return tod ; 00395 } |
|
Definition at line 93 of file thd_rotangles.c. References THD_3dim_dataset::daxes, ENTRY, ISVALID_DSET, ORI_A2P_TYPE, ORI_I2S_TYPE, ORI_R2L_TYPE, RETURN, THD_dataxes::xxorient, THD_dataxes::yyorient, and THD_dataxes::zzorient. Referenced by main(), mangle_angle(), NUD_finalize_dset_CB(), RT_registration_3D_setup(), THD_rotcom_to_matvec(), and VOLREG_main().
00094 { 00095 int xxor , yyor , zzor ; 00096 00097 ENTRY("THD_axcode") ; 00098 00099 if( ISVALID_DSET(dset) ){ 00100 xxor = dset->daxes->xxorient ; 00101 yyor = dset->daxes->yyorient ; 00102 zzor = dset->daxes->zzorient ; 00103 } else { 00104 xxor = ORI_R2L_TYPE ; /* 13 Feb 2001: Dicom order */ 00105 yyor = ORI_A2P_TYPE ; 00106 zzor = ORI_I2S_TYPE ; 00107 } 00108 ori = toupper(ori) ; 00109 if( ori == ORIENT_tinystr[xxor][0] ) RETURN( 1) ; 00110 if( ori == ORIENT_tinystr[xxor][1] ) RETURN(-1) ; 00111 if( ori == ORIENT_tinystr[yyor][0] ) RETURN( 2) ; 00112 if( ori == ORIENT_tinystr[yyor][1] ) RETURN(-2) ; 00113 if( ori == ORIENT_tinystr[zzor][0] ) RETURN( 3) ; 00114 if( ori == ORIENT_tinystr[zzor][1] ) RETURN(-3) ; 00115 RETURN(-99) ; 00116 } |
|
Definition at line 124 of file thd_rotangles.c. References THD_3dim_dataset::daxes, ENTRY, ISVALID_DSET, LOAD_ZERO_MAT, THD_mat33::mat, MAT_DET, q, RETURN, THD_dataxes::xxorient, THD_dataxes::yyorient, and THD_dataxes::zzorient. Referenced by main(), NUD_finalize_dset_CB(), RT_registration_3D_setup(), THD_rotangle_user_to_dset(), and VOLREG_main().
00125 { 00126 THD_dataxes *dax ; 00127 THD_mat33 q ; 00128 int col ; 00129 float val ; 00130 00131 ENTRY("THD_handedness") ; 00132 00133 if( !ISVALID_DSET(dset) ) RETURN(1) ; 00134 00135 LOAD_ZERO_MAT(q) ; 00136 dax = dset->daxes ; 00137 00138 col = 0 ; 00139 switch( dax->xxorient ){ 00140 case 0: q.mat[0][col] = 1.0 ; break ; 00141 case 1: q.mat[0][col] = -1.0 ; break ; 00142 case 2: q.mat[1][col] = -1.0 ; break ; 00143 case 3: q.mat[1][col] = 1.0 ; break ; 00144 case 4: q.mat[2][col] = 1.0 ; break ; 00145 case 5: q.mat[2][col] = -1.0 ; break ; 00146 } 00147 00148 col = 1 ; 00149 switch( dax->yyorient ){ 00150 case 0: q.mat[0][col] = 1.0 ; break ; 00151 case 1: q.mat[0][col] = -1.0 ; break ; 00152 case 2: q.mat[1][col] = -1.0 ; break ; 00153 case 3: q.mat[1][col] = 1.0 ; break ; 00154 case 4: q.mat[2][col] = 1.0 ; break ; 00155 case 5: q.mat[2][col] = -1.0 ; break ; 00156 } 00157 00158 col = 2 ; 00159 switch( dax->zzorient ){ 00160 case 0: q.mat[0][col] = 1.0 ; break ; 00161 case 1: q.mat[0][col] = -1.0 ; break ; 00162 case 2: q.mat[1][col] = -1.0 ; break ; 00163 case 3: q.mat[1][col] = 1.0 ; break ; 00164 case 4: q.mat[2][col] = 1.0 ; break ; 00165 case 5: q.mat[2][col] = -1.0 ; break ; 00166 } 00167 00168 val = MAT_DET(q) ; 00169 if( val > 0.0 ) RETURN( 1) ; /* right handed */ 00170 else RETURN(-1) ; /* left handed */ 00171 } |
|
Definition at line 32 of file thd_rotangles.c. References ENTRY, mangle_angle(), and THD_handedness(). Referenced by main(), and THD_rotcom_to_matvec().
00039 { 00040 ENTRY("THD_rotangle_user_to_dset") ; 00041 00042 mangle_angle( dset, th1_in, ax1_code, th1_out, ax1_out ) ; 00043 mangle_angle( dset, th2_in, ax2_code, th2_out, ax2_out ) ; 00044 mangle_angle( dset, th3_in, ax3_code, th3_out, ax3_out ) ; 00045 00046 if( THD_handedness(dset) < 0 ){ 00047 *th1_out = -(*th1_out) ; 00048 *th2_out = -(*th2_out) ; 00049 *th3_out = -(*th3_out) ; 00050 } 00051 00052 EXRETURN ; 00053 } |
|
Definition at line 179 of file thd_rotangles.c. References DMATVEC, ENTRY, LOAD_DFVEC3, LOAD_DIAG_DMAT, THD_dvecmat::mm, RETURN, rot_to_matrix(), THD_axcode(), THD_rotangle_user_to_dset(), and THD_dvecmat::vv. Referenced by main(), and THD_read_dvecmat().
00180 { 00181 THD_dvecmat out ; 00182 int nn , rpos=0 , nrc ; 00183 char *buf ; 00184 00185 ENTRY("THD_rotcom_to_matvec") ; 00186 00187 LOAD_DIAG_DMAT(out.mm,1,1,1) ; /* identity matrix */ 00188 LOAD_DFVEC3(out.vv,0,0,0) ; /* and zero shift */ 00189 00190 if( rotcom == NULL || rotcom[0] == '\0' ) RETURN(out) ; 00191 00192 /*-- compute rotation matrix --*/ 00193 00194 nrc = strlen(rotcom) ; 00195 buf = strstr(rotcom,"-rotate") ; 00196 if( buf != NULL && (buf-rotcom)+10 < nrc ){ 00197 float th1,th2,th3 , dh1,dh2,dh3 ; 00198 char cp1,cp2,cp3 ; 00199 int ax1,ax2,ax3 ; 00200 00201 nn = sscanf( buf+7, "%f%c %f%c %f%c", 00202 &th1,&cp1, &th2,&cp2, &th3,&cp3 ); 00203 if( nn < 6 ) RETURN(out) ; 00204 if( isspace(cp1) ) cp1 = 'x' ; /* should not happen */ 00205 if( isspace(cp2) ) cp2 = 'y' ; 00206 if( isspace(cp3) ) cp3 = 'z' ; 00207 00208 THD_rotangle_user_to_dset( dset , th1,cp1 , th2,cp2 , th3,cp3 , 00209 &dh1,&ax1 , &dh2,&ax2 , &dh3,&ax3 ) ; 00210 00211 out.mm = rot_to_matrix( ax1 , -(PI/180.0)*dh1, 00212 ax2 , -(PI/180.0)*dh2, 00213 ax3 , -(PI/180.0)*dh3 ) ; 00214 } 00215 00216 /*-- compute shift --*/ 00217 00218 buf = strstr(rotcom,"-ashift") ; 00219 if( buf == NULL ) buf = strstr(rotcom,"-bshift") ; 00220 00221 if( buf != NULL && (buf-rotcom)+10 < nrc ){ 00222 int bs = (buf[1] == 'b') ; /* save the BS for later */ 00223 float dx,dy,dz , qdx=0,qdy=0,qdz=0 ; 00224 char cdx,cdy,cdz ; 00225 int adx,ady,adz ; 00226 00227 nn = sscanf( buf+7, "%f%c %f%c %f%c", 00228 &dx,&cdx, &dy,&cdy, &dz,&cdz ); 00229 if( nn < 6 ) RETURN(out) ; 00230 00231 adx = THD_axcode(dset,cdx) ; 00232 if( adx > -99 || dx != 0.0 ){ 00233 switch( adx ){ 00234 case 1: qdx = -dx ; break ; 00235 default: 00236 case -1: qdx = dx ; break ; 00237 case 2: qdy = -dx ; break ; 00238 case -2: qdy = dx ; break ; 00239 case 3: qdz = -dx ; break ; 00240 case -3: qdz = dx ; break ; 00241 } 00242 } 00243 00244 ady = THD_axcode(dset,cdy) ; 00245 if( ady > -99 || dy != 0.0 ){ 00246 switch( ady ){ 00247 case 1: qdx = -dy ; break ; 00248 case -1: qdx = dy ; break ; 00249 case 2: qdy = -dy ; break ; 00250 default: 00251 case -2: qdy = dy ; break ; 00252 case 3: qdz = -dy ; break ; 00253 case -3: qdz = dy ; break ; 00254 } 00255 } 00256 00257 adz = THD_axcode(dset,cdz) ; 00258 if( adz > -99 || dz != 0.0 ){ 00259 switch( adz ){ 00260 case 1: qdx = -dz ; break ; 00261 case -1: qdx = dz ; break ; 00262 case 2: qdy = -dz ; break ; 00263 case -2: qdy = dz ; break ; 00264 case 3: qdz = -dz ; break ; 00265 default: 00266 case -3: qdz = dz ; break ; 00267 } 00268 } 00269 00270 LOAD_DFVEC3( out.vv , qdx,qdy,qdz ) ; 00271 if( bs ){ 00272 THD_dfvec3 qv = DMATVEC( out.mm , out.vv ) ; 00273 out.vv = qv ; 00274 } 00275 } 00276 00277 RETURN(out) ; 00278 } |