Doxygen Source Code Documentation
thd_shearwarp.c File Reference
#include "mrilib.h"
Go to the source code of this file.
Defines | |
#define | LL 0 |
#define | LR astep |
#define | UL bstep |
#define | UR (astep+bstep) |
#define | ASSIGN_DIRECTIONS |
#define | TSBOT 0.3 |
#define | TSTOP 0.7 |
#define | U(i, j) uu.mat[i][j] |
Functions | |
void | extract_assign_directions (int nx, int ny, int nz, int fixdir, int *Astep, int *Bstep, int *Cstep, int *Na, int *Nb, int *Nc) |
void | extract_byte_nn (int nx, int ny, int nz, byte *vol, Tmask *tm, int fixdir, int fixijk, float da, float db, int ma, int mb, byte *im) |
void | extract_byte_ts (int nx, int ny, int nz, byte *vol, Tmask *tm, int fixdir, int fixijk, float da, float db, int ma, int mb, byte *im) |
MRI_IMAGE * | project_byte_mip (int nx, int ny, int nz, byte *vol, Tmask *tm, THD_mat33 uu) |
THD_mat33 | rotmatrix (int ax1, float th1, int ax2, float th2, int ax3, float th3) |
int | main (int argc, char *argv[]) |
Define Documentation
|
Value: do{ switch( fixdir ){ \ default: \ case 1: \ astep = nx ; bstep = nxy ; cstep = 1 ; \ na = ny ; nb = nz ; nc = nx ; \ break ; \ \ case 2: \ astep = nxy ; bstep = 1 ; cstep = nx ; \ na = nz ; nb = nx ; nc = ny ; \ break ; \ \ case 3: \ astep = 1 ; bstep = nx ; cstep = nxy ; \ na = nx ; nb = ny ; nc = nz ; \ break ; \ } } while(0) Definition at line 40 of file thd_shearwarp.c. Referenced by extract_assign_directions(), extract_byte_nn(), and extract_byte_ts(). |
|
Definition at line 35 of file thd_shearwarp.c. Referenced by extract_byte_ts(). |
|
Definition at line 36 of file thd_shearwarp.c. Referenced by extract_byte_ts(). |
|
Definition at line 126 of file thd_shearwarp.c. Referenced by extract_byte_ts(). |
|
Definition at line 127 of file thd_shearwarp.c. Referenced by extract_byte_ts(). |
|
Definition at line 233 of file thd_shearwarp.c. Referenced by project_byte_mip(). |
|
Definition at line 37 of file thd_shearwarp.c. Referenced by extract_byte_ts(). |
|
Definition at line 38 of file thd_shearwarp.c. Referenced by extract_byte_ts(). |
Function Documentation
|
Definition at line 61 of file thd_shearwarp.c. References ASSIGN_DIRECTIONS, Nb, nc, and nz.
00064 { 00065 int astep,bstep,cstep , na,nb,nc , nxy=nx*ny ; 00066 00067 ASSIGN_DIRECTIONS ; 00068 00069 *Astep = astep ; *Bstep = bstep ; *Cstep = cstep ; 00070 *Na = na ; *Nb = nb ; *Nc = nc ; return ; 00071 } |
|
Definition at line 77 of file thd_shearwarp.c. References ASSIGN_DIRECTIONS, Tmask::mask, nc, and nz. Referenced by CREN_render().
00081 { 00082 int adel,bdel , abot,atop , bb,bbot,btop , nxy=nx*ny ; 00083 register int aa , ijkoff , aoff,boff ; 00084 int astep,bstep,cstep , na,nb,nc ; 00085 byte * mask ; 00086 00087 memset( im , 0 , ma*mb ) ; /* initialize output to zero */ 00088 00089 if( fixijk < 0 ) return ; 00090 00091 ASSIGN_DIRECTIONS ; 00092 00093 if( fixijk >= nc ) return ; 00094 00095 da += 0.5 ; adel = (int) da ; if( da < 0.0 ) adel-- ; /* floor(da+0.5) */ 00096 db += 0.5 ; bdel = (int) db ; if( db < 0.0 ) bdel-- ; /* floor(db+0.5) */ 00097 00098 abot = 0 ; if( abot < adel ) abot = adel ; /* range in im[] */ 00099 atop = na+adel ; if( atop > ma ) atop = ma ; 00100 00101 bbot = 0 ; if( bbot < bdel ) bbot = bdel ; 00102 btop = nb+bdel ; if( btop > mb ) btop = mb ; 00103 00104 ijkoff = fixijk*cstep + (abot-adel)*astep + (bbot-bdel)*bstep ; 00105 boff = bbot * ma ; 00106 00107 mask = (tm == NULL) ? NULL 00108 : tm->mask[fixdir%3] + (fixijk*nb - bdel) ; 00109 00110 for( bb=bbot ; bb < btop ; bb++,boff+=ma,ijkoff+=bstep ) 00111 if( mask == NULL || mask[bb] ) 00112 for( aa=abot,aoff=0 ; aa < atop ; aa++,aoff+=astep ) 00113 im[aa+boff] = vol[aoff+ijkoff] ; /* im(aa,bb) = vol(aa-adel,bb-bdel,fixijk) */ 00114 /* = vol[ (aa-adel)*astep + 00115 (bb-bdel)*bstep + 00116 fixijk *cstep ] */ 00117 00118 return ; 00119 } |
|
Definition at line 133 of file thd_shearwarp.c. References ASSIGN_DIRECTIONS, fa, fb, LL, LR, Tmask::mask, nc, nz, TSBOT, TSTOP, UL, and UR. Referenced by project_byte_mip().
00137 { 00138 int adel,bdel , abot,atop , bb,bbot,btop , nxy=nx*ny ; 00139 register int aa , ijkoff , aoff,boff ; 00140 int astep,bstep,cstep , na,nb,nc , nts,dts1,dts2 ; 00141 float fa , fb ; 00142 byte * mask ; 00143 00144 memset( im , 0 , ma*mb ) ; /* initialize output to zero */ 00145 00146 if( fixijk < 0 ) return ; 00147 00148 ASSIGN_DIRECTIONS ; 00149 00150 if( fixijk >= nc ) return ; 00151 00152 adel = (int) da ; if( da < 0.0 ) adel-- ; /* floor(da) */ 00153 bdel = (int) db ; if( db < 0.0 ) bdel-- ; /* floor(db) */ 00154 00155 fa = da - adel ; /* fractional part of dj */ 00156 fb = db - bdel ; /* fractional part of dk */ 00157 00158 fa = 1.0-fa ; fb = 1.0-fb ; 00159 00160 if( fa < TSBOT ){ /*- Left 30% -*/ 00161 if( fb < TSBOT ){ /*- Lower 30% -*/ 00162 nts = 1 ; dts1 = LL ; /* [0,0] */ 00163 } else if( fb > TSTOP ){ /*- Upper 30% -*/ 00164 nts = 1 ; dts1 = UL ; /* [0,1] */ 00165 } else { /*- Middle 40% -*/ 00166 nts = 2 ; dts1 = LL ; dts2 = UL ; /* mid of [0,0] and [0,1] */ 00167 } 00168 } else if( fa > TSTOP ){ /*- Right 30% -*/ 00169 if( fb < TSBOT ){ /*- Lower 30% -*/ 00170 nts = 1 ; dts1 = LR ; /* [1,0] */ 00171 } else if( fb > TSTOP ){ /*- Upper 30% -*/ 00172 nts = 1 ; dts1 = UR ; /* [1,1] */ 00173 } else { /*- Middle 40% -*/ 00174 nts = 2 ; dts1 = LR ; dts2 = UR ; /* mid of [1,0] and [1,1] */ 00175 } 00176 } else { /*- Middle 40% -*/ 00177 if( fb < TSBOT ){ /*- Lower 30% -*/ 00178 nts = 2 ; dts1 = LL ; dts2 = LR ; /* mid of [0,0] and [1,0] */ 00179 } else if( fb > TSTOP ){ /*- Upper 30% -*/ 00180 nts = 2 ; dts1 = UL ; dts2 = UR ; /* mid of [0,1] and [1,1] */ 00181 } else { /*- Middle 40% -*/ 00182 nts = 4 ; /* mid of all 4 points */ 00183 } 00184 } 00185 00186 adel++ ; bdel++ ; 00187 00188 abot = 0 ; if( abot < adel ) abot = adel ; /* range in im[] */ 00189 atop = na+adel-1 ; if( atop > ma ) atop = ma ; 00190 00191 bbot = 0 ; if( bbot < bdel ) bbot = bdel ; 00192 btop = nb+bdel-1 ; if( btop > mb ) btop = mb ; 00193 00194 ijkoff = fixijk*cstep + (abot-adel)*astep + (bbot-bdel)*bstep ; 00195 boff = bbot * ma ; 00196 00197 mask = (tm == NULL) ? NULL 00198 : tm->mask[fixdir%3] + (fixijk*nb - bdel) ; 00199 00200 switch( nts ){ 00201 00202 case 1: 00203 ijkoff += dts1 ; 00204 for( bb=bbot ; bb < btop ; bb++,boff+=ma,ijkoff+=bstep ) 00205 if( mask == NULL || mask[bb] || mask[bb+1] ) 00206 for( aa=abot,aoff=0 ; aa < atop ; aa++,aoff+=astep ) 00207 im[aa+boff] = vol[aoff+ijkoff] ; 00208 break ; 00209 00210 case 2: 00211 ijkoff += dts1 ; dts2 -= dts1 ; 00212 for( bb=bbot ; bb < btop ; bb++,boff+=ma,ijkoff+=bstep ) 00213 if( mask == NULL || mask[bb] || mask[bb+1] ) 00214 for( aa=abot,aoff=0 ; aa < atop ; aa++,aoff+=astep ) 00215 im[aa+boff] = (vol[aoff+ijkoff] + vol[aoff+(ijkoff+dts2)]) >> 1; 00216 break ; 00217 00218 case 4: 00219 for( bb=bbot ; bb < btop ; bb++,boff+=ma,ijkoff+=bstep ) 00220 if( mask == NULL || mask[bb] || mask[bb+1] ) 00221 for( aa=abot,aoff=0 ; aa < atop ; aa++,aoff+=astep ) 00222 im[aa+boff] = ( vol[aoff+ijkoff] +vol[aoff+(ijkoff+LR)] 00223 +vol[aoff+(ijkoff+UL)]+vol[aoff+(ijkoff+UR)]) >> 2; 00224 break ; 00225 } 00226 00227 return ; 00228 } |
|
Definition at line 314 of file thd_shearwarp.c. References argc, DSET_ARRAY, DSET_BRICK_TYPE, DSET_load, DSET_LOADED, DSET_mallocize, DSET_NX, DSET_NY, DSET_NZ, mri_write_pnm(), project_byte_mip(), rotmatrix(), strtod(), THD_open_dataset(), and THD_rotangle_user_to_dset().
00315 { 00316 THD_3dim_dataset *dset ; 00317 int iarg=1 ; 00318 char *cc1="x",*cc2="y",*cc3="z" ; 00319 float th1=0.0, th2=0.0, th3=0.0 ; 00320 float thx,thy,thz ; 00321 int axx,ayy,azz ; 00322 char *fname="testcox.ppm" ; 00323 void * rhand ; 00324 int bot=1 , ii ; 00325 float omap[128] , bfac ; 00326 MRI_IMAGE * im , * brim ; 00327 int hbr[256] , nperc,ibot,itop,sum ; 00328 byte * bar ; 00329 THD_mat33 rmat ; 00330 00331 if( argc < 2 || strcmp(argv[1],"-help") == 0 ){ 00332 printf("Usage: testcox [-rotate a b c] [-out f] [-bot b] dset\n") ; 00333 exit(0) ; 00334 } 00335 00336 while( iarg < argc && argv[iarg][0] == '-' ){ 00337 00338 if( strcmp(argv[iarg],"-bot") == 0 ){ 00339 bot = strtod( argv[++iarg] , NULL ) ; 00340 iarg++ ; continue ; 00341 } 00342 00343 if( strcmp(argv[iarg],"-rotate") == 0 ){ 00344 th1 = (PI/180.0) * strtod( argv[++iarg] , &cc1 ) ; 00345 th2 = (PI/180.0) * strtod( argv[++iarg] , &cc2 ) ; 00346 th3 = (PI/180.0) * strtod( argv[++iarg] , &cc3 ) ; 00347 00348 iarg++ ; continue ; 00349 } 00350 00351 if( strcmp(argv[iarg],"-out") == 0 ){ 00352 fname = argv[++iarg] ; 00353 iarg++ ; continue ; 00354 } 00355 00356 fprintf(stderr,"Illegal option: %s\n",argv[iarg]); exit(1); 00357 } 00358 00359 if( iarg >= argc ){fprintf(stderr,"No dataset?\n"); exit(1); } 00360 00361 dset = THD_open_dataset( argv[iarg] ) ; 00362 if( dset == NULL ){fprintf(stderr,"Can't open dataset!\n");exit(1);} 00363 if( DSET_BRICK_TYPE(dset,0) != MRI_byte ){ 00364 fprintf(stderr,"Non-byte dataset input!\n");exit(1); 00365 } 00366 DSET_mallocize(dset) ; DSET_load(dset) ; 00367 if( !DSET_LOADED(dset) ){ 00368 fprintf(stderr,"Can't load dataset!\n");exit(1); 00369 } 00370 00371 /* correct angles to go with rendering plugin are 00372 <yaw>A <pitch>R <roll>I 00373 in that order */ 00374 00375 THD_rotangle_user_to_dset( dset , 00376 th1,*cc1 , th2,*cc2 , th3,*cc3 , 00377 &thx,&axx , &thy,&ayy , &thz,&azz ) ; 00378 rmat = rotmatrix( axx,thx , ayy,thy , azz,thz ) ; 00379 00380 im = project_byte_mip( DSET_NX(dset) , DSET_NY(dset) , DSET_NZ(dset) , 00381 DSET_ARRAY(dset,0) , NULL , rmat ) ; 00382 00383 mri_write_pnm( fname , im ) ; 00384 fprintf(stderr,"+++ Output to file %s\n",fname); 00385 exit(0) ; 00386 } |
|
Definition at line 235 of file thd_shearwarp.c. References a, DUMP_MAT33, extract_byte_ts(), free, malloc, MAX, mri_aff2d_byte(), MRI_BYTE_PTR, mri_free(), mri_new(), nz, and U. Referenced by main().
00237 { 00238 int ii,jj,kk , ni,nj,nk,pk , ma,mb,mab , pij , nnn[3] ; 00239 float utop,uabs , a,b , aii,aij,aji,ajj , hnk , ba,bb ; 00240 byte *im , *sl ; 00241 MRI_IMAGE *bim , *qim ; 00242 00243 #if 1 00244 DUMP_MAT33("rotation",uu) ; 00245 #endif 00246 00247 /*-- find element U(kk,2) that is largest --*/ 00248 00249 nnn[0] = nx ; nnn[1] = ny ; nnn[2] = nz ; 00250 00251 kk = 0 ; utop = fabs(U(0,2)) ; 00252 uabs = fabs(U(1,2)) ; if( uabs > utop ){ utop = uabs; kk = 1; } 00253 uabs = fabs(U(2,2)) ; if( uabs > utop ){ utop = uabs; kk = 2; } 00254 00255 if( utop == 0.0 ) return ; /* bad matrix */ 00256 00257 ii = (kk+1) % 3 ; /* image axes */ 00258 jj = (kk+2) % 3 ; 00259 00260 a = U(ii,2) / U(kk,2) ; /* shearing parameters */ 00261 b = U(jj,2) / U(kk,2) ; 00262 00263 #if 0 00264 fprintf(stderr,"kk=%d a=%g b=%g\n",kk,a,b) ; 00265 #endif 00266 00267 aii = U(ii,0) - a * U(kk,0) ; /* warping parameters */ 00268 aij = U(ii,1) - a * U(kk,1) ; /* [not used just yet] */ 00269 aji = U(jj,0) - b * U(kk,0) ; 00270 ajj = U(jj,1) - b * U(kk,1) ; 00271 00272 #if 0 00273 fprintf(stderr,"warp: aii=%g aij=%g\n" 00274 " aji=%g ajj=%g\n" , aii,aij,aji,ajj ) ; 00275 #endif 00276 00277 ni = nnn[ii] ; nj = nnn[jj] ; nk = nnn[kk] ; hnk = 0.5*nk ; 00278 ma = MAX(ni,nj) ; ma = MAX(ma,nk) ; ma *= 1.2 ; 00279 mb = ma ; mab = ma * mb ; ba = 0.5*(ma-ni) ; bb = 0.5*(mb-nj) ; 00280 sl = (byte *) malloc(mab) ; 00281 bim = mri_new(ma,mb,MRI_byte) ; im = MRI_BYTE_PTR(bim) ; memset(im,0,mab) ; 00282 for( pk=0 ; pk < nk ; pk++ ){ 00283 extract_byte_ts( nx,ny,nz , vol , tm , 00284 kk+1 , pk , ba-a*(pk-hnk) , bb-b*(pk-hnk) , 00285 ma,mb , sl ) ; 00286 for( pij=0 ; pij < mab ; pij++ ) 00287 if( sl[pij] > im[pij] ) im[pij] = sl[pij] ; 00288 } 00289 00290 free(sl) ; 00291 00292 #if 1 00293 qim = mri_aff2d_byte( bim , 1 , aii,aij,aji,ajj ) ; 00294 mri_free(bim) ; bim = qim ; 00295 #endif 00296 00297 return bim ; 00298 } |
|
Definition at line 302 of file thd_shearwarp.c. References LOAD_ROT_MAT, MAT_MUL, p, and q. Referenced by CREN_render(), main(), and NUD_nudge_CB().
00304 { 00305 THD_mat33 q , p ; 00306 00307 LOAD_ROT_MAT( q , th1 , ax1 ) ; 00308 LOAD_ROT_MAT( p , th2 , ax2 ) ; q = MAT_MUL( p , q ) ; 00309 LOAD_ROT_MAT( p , th3 , ax3 ) ; q = MAT_MUL( p , q ) ; 00310 00311 return q ; 00312 } |