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 }
|