Doxygen Source Code Documentation
thd_read_vecmat.c File Reference
#include "mrilib.h"
Go to the source code of this file.
Functions | |
THD_dvecmat | THD_read_dvecmat (char *fname, int invert) |
Function Documentation
|
Definition at line 8 of file thd_read_vecmat.c. References THD_3dim_dataset::dblk, DMAT_INV, DMATVEC, DSET_delete, ENTRY, ATR_float::fl, free, ISVALID_DSET, LOAD_DFVEC3, LOAD_DIAG_DMAT, LOAD_DMAT, THD_dvecmat::mm, NEGATE_DFVEC3, ATR_float::nfl, RETURN, THD_find_float_atr(), THD_open_one_dataset(), THD_rotcom_to_matvec(), and THD_dvecmat::vv. Referenced by main().
00009 { 00010 THD_dvecmat dvm ; 00011 THD_dmat33 tmat ; 00012 THD_dfvec3 tvec ; 00013 FILE * fp ; 00014 double dd[12] ; 00015 int nn ; 00016 00017 ENTRY("THD_read_dvecmat") ; 00018 00019 LOAD_DIAG_DMAT(tmat,0.0,0.0,0.0) ; /* initialize to all 0s */ 00020 LOAD_DFVEC3(tvec,0.0,0.0,0.0) ; 00021 00022 if( fname == NULL || fname[0] == '\0' ){ 00023 dvm.vv = tvec ; dvm.mm = tmat ; RETURN(dvm) ; 00024 } 00025 00026 /*-- filename is "dataset::attribute" --*/ 00027 00028 if( strstr(fname,"::") != NULL ){ /*== read from dataset header ==*/ 00029 char * dname = strdup(fname) ; 00030 char * cc = strstr(dname,"::") ; 00031 THD_3dim_dataset * dset ; 00032 ATR_float * atr ; 00033 00034 *cc = '\0' ; cc += 2 ; /* dname = dataset name ; cc = attribute name */ 00035 00036 dset = THD_open_one_dataset( dname ) ; 00037 if( !ISVALID_DSET(dset) ){ 00038 fprintf(stderr, 00039 "*** THD_read_dvecmat: can't open dataset %s\n", 00040 dname) ; 00041 dvm.vv = tvec ; dvm.mm = tmat ; free(dname) ; RETURN(dvm) ; 00042 } 00043 00044 atr = THD_find_float_atr( dset->dblk , cc ) ; 00045 if( atr == NULL ){ 00046 fprintf(stderr, 00047 "*** THD_read_dvecmat: can't find attribute %s in dataset %s\n", 00048 cc,dname) ; 00049 dvm.vv = tvec ; dvm.mm = tmat ; free(dname) ; RETURN(dvm) ; 00050 } 00051 00052 switch( atr->nfl ){ 00053 00054 default: 00055 fprintf(stderr, 00056 "*** THD_read_dvecmat: can't read matrix+vector from dataset %s, attribute %s\n", 00057 dname,cc) ; 00058 dvm.vv = tvec ; dvm.mm = tmat ; free(dname) ; RETURN(dvm) ; 00059 break ; /* unreachable */ 00060 00061 case 12: LOAD_DMAT(tmat,atr->fl[0],atr->fl[1],atr->fl[2], 00062 atr->fl[4],atr->fl[5],atr->fl[6], 00063 atr->fl[8],atr->fl[9],atr->fl[10] ) ; 00064 LOAD_DFVEC3(tvec,atr->fl[3],atr->fl[7],atr->fl[11]) ; 00065 break ; 00066 00067 case 9: LOAD_DMAT(tmat,atr->fl[0],atr->fl[1],atr->fl[2], 00068 atr->fl[3],atr->fl[4],atr->fl[5], 00069 atr->fl[6],atr->fl[7],atr->fl[8] ) ; 00070 LOAD_DFVEC3(tvec,0,0,0) ; 00071 break ; 00072 } 00073 00074 free(dname) ; DSET_delete(dset) ; 00075 00076 /*-- 14 Feb 2001: filename is "-rotate a b c -[ab]shift x y z" string --*/ 00077 00078 } else if( strstr(fname,"-rotate") != NULL ){ /*== compute directly ==*/ 00079 00080 dvm = THD_rotcom_to_matvec( NULL , fname ) ; /* thd_rotangles.c */ 00081 tvec = dvm.vv ; tmat = dvm.mm ; 00082 00083 /*-- just a normal filename --*/ 00084 00085 } else { /*== read numbers from file ==*/ 00086 00087 fp = fopen( fname , "r" ) ; 00088 if( fp == NULL ){ 00089 fprintf(stderr, 00090 "*** THD_read_dvecmat: can't open file %s\n", 00091 fname) ; 00092 dvm.vv = tvec ; dvm.mm = tmat ; RETURN(dvm) ; 00093 } 00094 00095 nn = fscanf(fp,"%lf %lf %lf %lf" /* try to get 12 numbers */ 00096 "%lf %lf %lf %lf" 00097 "%lf %lf %lf %lf" , 00098 dd+0,dd+1,dd+2 ,dd+3, 00099 dd+4,dd+5,dd+6 ,dd+7, 00100 dd+8,dd+9,dd+10,dd+11 ) ; 00101 00102 switch( nn ){ /* how many did we actually read? */ 00103 00104 default: 00105 fprintf(stderr, 00106 "*** THD_read_dvecmat: can't read matrix+vector from file %s\n", 00107 fname) ; 00108 dvm.vv = tvec ; dvm.mm = tmat ; RETURN(dvm) ; 00109 break ; /* unreachable */ 00110 00111 case 12: LOAD_DMAT(tmat,dd[0],dd[1],dd[2], /* 12 ==> matrix+vector */ 00112 dd[4],dd[5],dd[6], 00113 dd[8],dd[9],dd[10] ) ; 00114 LOAD_DFVEC3(tvec,dd[3],dd[7],dd[11]) ; 00115 break ; 00116 00117 case 9: LOAD_DMAT(tmat,dd[0],dd[1],dd[2], /* 9 ==> matrix only */ 00118 dd[3],dd[4],dd[5], 00119 dd[6],dd[7],dd[8] ) ; 00120 LOAD_DFVEC3(tvec,0,0,0) ; 00121 break ; 00122 } 00123 } 00124 00125 /*-- invert the transformation we just read? --*/ 00126 /*-- [y] = [R][x] + [v] is transformation, so --*/ 00127 /*-- [x] = inv[R] - inv[R][v] is inverse transformation --*/ 00128 00129 if( invert ){ 00130 THD_dmat33 imat ; THD_dfvec3 ivec ; 00131 imat = DMAT_INV(tmat) ; /* matrix inverse */ 00132 ivec = DMATVEC(imat,tvec) ; /* multiply inverse into vector */ 00133 tmat = imat ; 00134 tvec = ivec ; NEGATE_DFVEC3(tvec) ; /* negate vector */ 00135 } 00136 00137 /*-- store results and get outta here, dude! --*/ 00138 00139 dvm.vv = tvec ; dvm.mm = tmat ; RETURN(dvm) ; 00140 } |