Doxygen Source Code Documentation
thd_warps.c File Reference
#include "mrilib.h"
#include "thd.h"
Go to the source code of this file.
Defines | |
#define | do_nothing(iii) |
Functions | |
THD_warp * | AFNI_make_voxwarp (THD_warp *inwarp, THD_3dim_dataset *old_dset, THD_3dim_dataset *new_dset) |
THD_linear_mapping * | AFNI_make_voxmap (THD_linear_mapping *inmap, THD_dataxes *old_daxes, THD_dataxes *new_daxes) |
void | AFNI_concatenate_warp (THD_warp *warp_in, THD_warp *warp_prior) |
THD_linear_mapping * | AFNI_concatenate_lmap (THD_linear_mapping *map_2, THD_linear_mapping *map_1) |
THD_warp * | AFNI_make_affwarp_12 (float a11, float a12, float a13, float s1, float a21, float a22, float a23, float s2, float a31, float a32, float a33, float s3) |
THD_warp * | AFNI_make_affwarp_mat (THD_mat33 mmm) |
THD_warp * | AFNI_make_affwarp_matvec (THD_mat33 mmm, THD_fvec3 vvv) |
Define Documentation
|
Definition at line 85 of file thd_warps.c. Referenced by AFNI_make_voxmap(). |
Function Documentation
|
Definition at line 265 of file thd_warps.c. References ADD_FVEC3, THD_linear_mapping::bot, THD_linear_mapping::bvec, MAPPING_LINEAR_TYPE, MAT_INV, MAT_MUL, MATVEC, THD_linear_mapping::mbac, THD_linear_mapping::mfor, myXtNew, NEGATE_FVEC3, THD_linear_mapping::svec, THD_linear_mapping::top, and THD_linear_mapping::type. Referenced by AFNI_concatenate_warp().
00267 { 00268 THD_linear_mapping * map_out ; 00269 THD_fvec3 tvec ; 00270 00271 /* make a new linear mapping */ 00272 00273 map_out = myXtNew(THD_linear_mapping) ; 00274 map_out->type = MAPPING_LINEAR_TYPE ; 00275 00276 /* matrix */ 00277 00278 map_out->mfor = MAT_MUL( map_2->mfor , map_1->mfor ) ; 00279 map_out->mbac = MAT_INV( map_out->mfor ) ; 00280 00281 /* vector */ 00282 00283 tvec = MATVEC( map_2->mfor , map_1->bvec ) ; 00284 map_out->bvec = ADD_FVEC3( tvec , map_2->bvec ) ; 00285 map_out->svec = MATVEC( map_out->mbac , map_out->bvec ) ; 00286 NEGATE_FVEC3(map_out->svec) ; 00287 00288 map_out->bot = map_2->bot ; 00289 map_out->top = map_2->top ; 00290 00291 return map_out ; 00292 } |
|
Definition at line 193 of file thd_warps.c. References AFNI_concatenate_lmap(), myXtFree, myXtNew, THD_warp::rig_bod, THD_warp::tal_12, THD_talairach_12_warp::type, THD_warp::type, THD_talairach_12_warp::warp, THD_affine_warp::warp, WARP_AFFINE_TYPE, and WARP_TALAIRACH_12_TYPE. Referenced by adwarp_follower_dataset(), AFNI_follower_dataset(), AFNI_init_warp(), and THD_init_session().
00194 { 00195 THD_linear_mapping * prior_map , * new_map ; 00196 00197 if( warp_in == NULL || warp_prior == NULL ) return ; 00198 00199 switch( warp_in->type + 100*warp_prior->type ){ 00200 00201 default: 00202 warp_in->type = -1 ; /* set error flag! */ 00203 return ; 00204 00205 /*-- 2 affine warps ==> a new affine warp --*/ 00206 00207 case WARP_AFFINE_TYPE + 100*WARP_AFFINE_TYPE:{ 00208 prior_map = &(warp_prior->rig_bod.warp) ; 00209 new_map = AFNI_concatenate_lmap( 00210 &(warp_in->rig_bod.warp) , prior_map ) ; 00211 00212 warp_in->rig_bod.warp = *new_map ; /* write over input warp */ 00213 myXtFree( new_map ) ; 00214 } 00215 break ; 00216 00217 /*--- Talairach preceeded by affine ==> new Talairach --*/ 00218 00219 case WARP_TALAIRACH_12_TYPE + 100*WARP_AFFINE_TYPE:{ 00220 int iw ; 00221 prior_map = &(warp_prior->rig_bod.warp) ; 00222 for( iw=0 ; iw < 12 ; iw++ ){ 00223 00224 new_map = AFNI_concatenate_lmap( 00225 &(warp_in->tal_12.warp[iw]) , prior_map ) ; 00226 00227 warp_in->tal_12.warp[iw] = *new_map ; /* write over input warp */ 00228 myXtFree( new_map ) ; 00229 } 00230 } 00231 break ; 00232 00233 /*-- affine preceeded by Talairach ==> new Talairach 00234 [this case is not currently used, since there are no warps 00235 AFTER a Talairach warp, but it may be useful in the future] 00236 -- RWCox, November 1994 A.D. --*/ 00237 00238 case WARP_AFFINE_TYPE + 100*WARP_TALAIRACH_12_TYPE:{ 00239 int iw ; 00240 THD_talairach_12_warp * new_warp = myXtNew( THD_talairach_12_warp ) ; 00241 00242 new_warp->type = WARP_TALAIRACH_12_TYPE ; 00243 for( iw=0 ; iw < 12 ; iw++ ){ 00244 prior_map = &(warp_prior->tal_12.warp[iw]) ; 00245 new_map = AFNI_concatenate_lmap( 00246 &(warp_in->rig_bod.warp) , prior_map ) ; 00247 new_warp->warp[iw] = *new_map ; 00248 myXtFree( new_map ) ; 00249 } 00250 00251 warp_in->tal_12 = *new_warp ; /* write over input warp */ 00252 myXtFree( new_warp ) ; 00253 } 00254 break ; 00255 00256 } /* end of switch on warp types */ 00257 00258 return ; 00259 } |
|
Make an affine warp from 12 input numbers:
Definition at line 303 of file thd_warps.c. References THD_linear_mapping::bvec, LOAD_FVEC3, LOAD_INVERSE_LMAP, LOAD_MAT, MAPPING_LINEAR_TYPE, MAT_DET, MAT_FNORM, THD_linear_mapping::mfor, myXtNew, THD_warp::rig_bod, s2, THD_linear_mapping::type, THD_warp::type, THD_affine_warp::warp, and WARP_AFFINE_TYPE. Referenced by AFNI_make_affwarp_mat(), AFNI_make_affwarp_matvec(), and THD_init_session().
00306 { 00307 THD_warp *warp ; 00308 THD_linear_mapping map ; 00309 float dd , nn ; 00310 00311 warp = myXtNew( THD_warp ) ; 00312 warp->type = WARP_AFFINE_TYPE ; 00313 00314 map.type = MAPPING_LINEAR_TYPE ; 00315 00316 LOAD_MAT(map.mfor,a11,a12,a13,a21,a22,a23,a31,a32,a33) ; 00317 dd = MAT_DET(map.mfor) ; nn = MAT_FNORM(map.mfor) ; 00318 if( fabs(dd) < 1.e-5*nn*nn*nn ) return NULL ; /* bad input */ 00319 LOAD_FVEC3(map.bvec,-s1,-s2,-s3) ; 00320 LOAD_INVERSE_LMAP(map) ; 00321 00322 warp->rig_bod.warp = map ; 00323 00324 return warp ; 00325 } |
|
Definition at line 329 of file thd_warps.c. References AFNI_make_affwarp_12(), THD_mat33::mat, and mmm. Referenced by THD_init_session().
|
|
Definition at line 338 of file thd_warps.c. References AFNI_make_affwarp_12(), THD_mat33::mat, mmm, and THD_fvec3::xyz.
|
|
Definition at line 107 of file thd_warps.c. References ADD_FVEC3, THD_linear_mapping::bvec, do_nothing, LOAD_DIAG_MAT, LOAD_FVEC3, MAPPING_LINEAR_TYPE, MAT_INV, MAT_MUL, MATVEC, THD_linear_mapping::mbac, THD_linear_mapping::mfor, myXtNew, NEGATE_FVEC3, SUB_FVEC3, THD_linear_mapping::svec, THD_dataxes::to_dicomm, TRANSPOSE_MAT, THD_linear_mapping::type, THD_dataxes::xxdel, THD_dataxes::xxorg, THD_dataxes::yydel, THD_dataxes::yyorg, THD_dataxes::zzdel, and THD_dataxes::zzorg. Referenced by AFNI_make_voxwarp().
00110 { 00111 THD_mat33 old_scale , old_3dmm_to_dicomm , 00112 dd_trans , new_scale , new_dicomm_to_3dmm , 00113 mt ; /* temp matrix */ 00114 00115 THD_fvec3 dd_base , new_origin , old_origin , vt0,vt1,vt2 ; 00116 00117 THD_linear_mapping * newmap ; 00118 00119 /*--- set up the elements of the transformation ---*/ 00120 00121 dd_trans = inmap->mfor ; 00122 00123 LOAD_DIAG_MAT( old_scale , old_daxes->xxdel , 00124 old_daxes->yydel , 00125 old_daxes->zzdel ) ; 00126 00127 LOAD_DIAG_MAT( new_scale , 1.0/new_daxes->xxdel , /* notice */ 00128 1.0/new_daxes->yydel , /* inversion */ 00129 1.0/new_daxes->zzdel ) ; 00130 00131 old_3dmm_to_dicomm = old_daxes->to_dicomm ; 00132 new_dicomm_to_3dmm = TRANSPOSE_MAT(new_daxes->to_dicomm) ; /* inversion */ 00133 00134 /* vector elements */ 00135 00136 dd_base = inmap->bvec ; /* in new dicomm */ 00137 00138 LOAD_FVEC3( new_origin , new_daxes->xxorg , /* in old 3dmm */ 00139 new_daxes->yyorg , 00140 new_daxes->zzorg ) ; 00141 00142 LOAD_FVEC3( old_origin , old_daxes->xxorg , /* in new 3dmm */ 00143 old_daxes->yyorg , 00144 old_daxes->zzorg ) ; 00145 00146 /* multiply the matrices together */ 00147 00148 mt = MAT_MUL( old_3dmm_to_dicomm , old_scale ) ; do_nothing(0) ; 00149 mt = MAT_MUL( dd_trans , mt ) ; do_nothing(0) ; 00150 mt = MAT_MUL( new_dicomm_to_3dmm , mt ) ; do_nothing(0) ; 00151 mt = MAT_MUL( new_scale , mt ) ; do_nothing(0) ; 00152 00153 /* compute the new bvec */ 00154 00155 vt0 = MATVEC( old_3dmm_to_dicomm , old_origin ) ; 00156 vt0 = MATVEC( dd_trans , vt0 ) ; 00157 vt0 = MATVEC( new_dicomm_to_3dmm , vt0 ) ; 00158 vt0 = MATVEC( new_scale , vt0 ) ; 00159 00160 vt1 = MATVEC( new_dicomm_to_3dmm , dd_base ) ; 00161 vt1 = MATVEC( new_scale , vt1 ) ; 00162 00163 vt2 = MATVEC( new_scale , new_origin ) ; /* want vt1 + vt2 - vt0 */ 00164 00165 vt2 = ADD_FVEC3( vt1 , vt2 ) ; 00166 vt2 = SUB_FVEC3( vt2 , vt0 ) ; 00167 00168 /* make the output map */ 00169 00170 newmap = myXtNew( THD_linear_mapping ) ; 00171 00172 newmap->type = MAPPING_LINEAR_TYPE ; 00173 newmap->mfor = mt ; 00174 newmap->mbac = MAT_INV(mt) ; 00175 newmap->bvec = vt2 ; 00176 00177 newmap->svec = MATVEC(newmap->mbac,newmap->bvec) ; 00178 NEGATE_FVEC3(newmap->svec) ; 00179 00180 return newmap ; 00181 } |
|
Definition at line 19 of file thd_warps.c. References AFNI_make_voxmap(), THD_linear_mapping::bot, CURRENT_DAXES, THD_3dim_dataset::daxes, EXIT, LOAD_FVEC3, myXtFree, myXtNew, THD_dataxes::nxx, THD_dataxes::nyy, THD_dataxes::nzz, THD_warp::rig_bod, THD_warp::tal_12, THD_3dmm_to_3dfind(), THD_dicomm_to_3dmm(), THD_linear_mapping::top, THD_warp::type, THD_talairach_12_warp::warp, THD_affine_warp::warp, WARP_AFFINE_TYPE, and WARP_TALAIRACH_12_TYPE. Referenced by AFNI_dataset_slice().
00022 { 00023 THD_warp * newwarp ; 00024 THD_linear_mapping * map ; 00025 THD_dataxes * new_daxes ; 00026 00027 newwarp = myXtNew( THD_warp ) ; 00028 newwarp->type = inwarp->type ; 00029 new_daxes = CURRENT_DAXES(new_dset) ; 00030 00031 switch( inwarp->type ){ 00032 00033 default:{ 00034 fprintf(stderr,"\a\n*** ILLEGAL warp code!!! %d\n",inwarp->type) ; 00035 sleep(1) ; EXIT(1) ; 00036 } 00037 break ; 00038 00039 case WARP_AFFINE_TYPE:{ 00040 00041 map = AFNI_make_voxmap( &(inwarp->rig_bod.warp), 00042 old_dset->daxes , new_daxes ) ; 00043 00044 /* load the (inclusive) voxel index ranges into the affine map */ 00045 00046 LOAD_FVEC3( map->bot, 0,0,0 ) ; 00047 LOAD_FVEC3( map->top, new_daxes->nxx-1, 00048 new_daxes->nyy-1, new_daxes->nzz-1 ) ; 00049 00050 00051 newwarp->rig_bod.warp = *map ; 00052 00053 myXtFree( map ) ; 00054 } 00055 break ; 00056 00057 case WARP_TALAIRACH_12_TYPE:{ 00058 int iw ; 00059 for( iw=0 ; iw < 12 ; iw++ ){ 00060 map = AFNI_make_voxmap( &(inwarp->tal_12.warp[iw]) , 00061 old_dset->daxes , new_daxes ) ; 00062 00063 map->bot = THD_dicomm_to_3dmm(new_dset,inwarp->tal_12.warp[iw].bot); 00064 map->top = THD_dicomm_to_3dmm(new_dset,inwarp->tal_12.warp[iw].top); 00065 00066 map->bot = THD_3dmm_to_3dfind( new_dset , map->bot ) ; 00067 map->top = THD_3dmm_to_3dfind( new_dset , map->top ) ; 00068 00069 newwarp->tal_12.warp[iw] = *map ; 00070 00071 myXtFree( map ) ; 00072 } 00073 } 00074 break ; 00075 } 00076 00077 return newwarp ; 00078 } |