#include "mrilib.h"
#include "nifti1_io.h"
typedef void (*Warpfield_basis)(int,float *,int,float *,float *,float *,float *) ;
/*---------------------------------------------------------------------------*/
typedef struct {
mat44 aa ;
float param[19] ;
int nwx , nwy , nwz ;
float *wx , *wy , *wz ;
Warpfield_basis bfun ;
} Warpfield ;
#undef INIT_Warpfield
#define INIT_Warpfield(nam) \
do{ (nam) = (WarpField *)calloc(1,sizeof(WarpField)) ; \
(nam)->aa.m[0][0] = (nam)->aa.m[1][1] = (nam)->aa.m[2][2] = 1.0f ; \
(nam)->wx = (nam)->wy = (nam)->wz = (float *)NULL ; \
(nam)->bfun = (Warpfield_basis)NULL ; \
} while(0)
#undef FREEIF
#define FREEIF(p) do{ if((p)!=NULL){free(p);(p)=NULL;} }while(0)
/*---------------------------------------------------------------------------*/
float Warpfield_approx_inverse( int nnx , int nny , int nnz , Warpfield *wf ,
int nwxi, int nwyi, int nwzi, Warpfield *wi )
{
MRI_IMAGE *imc , *imp ;
float *car , *par , *wtf , *wti , *rhs ;
int nx=nnx , nwf , ii,jj ;
float dx , xx , ss , yy , aa,ainv ;
double esum ;
}
/*---------------------------------------------------------------------------*/
#undef TWOPI
#define TWOPI 6.283185307f
/*! param[0] = xbot param[1] = xtop param[2] = number of sin(x) func,
etc. for y & z parameters
*/
void Warpfield_sin( int nord, float *param ,
int npt, float *x, float *y, float *z, float *val )
{
int nx,ny,nz , ii=0 ;
float bot,top,scl ;
int nxfun,nyfun,nzfun ;
if( nord < 1 || param == NULL || npt < 1 || val == NULL ) return ;
nxfun = (int)param[2] ;
nyfun = (int)param[5] ;
nzfun = (int)param[8] ;
if( nx == 0 && ny == 0 && nz == 0 ) return ;
memset( val , 0 , sizeof(float)*npt ) ;
if( nx != 0 && x != NULL ){
bot = param[0] ; top = param[1] ; scl = TWOPI/(top-bot) ;
for( ii=0 ; ii < npt ; ii++ ) val[ii] = (x[ii]-bot)*scl ;
}
if( ny != 0 && y != NULL ){
bot = param[2] ; top = param[3] ; scl = TWOPI/(top-bot) ;
for( ii=0 ; ii < npt ; ii++ ) val[ii] +=(y[ii]-bot)*scl ;
}
if( nz != 0 && z != NULL ){
bot = param[4] ; top = param[5] ; scl = TWOPI/(top-bot) ;
for( ii=0 ; ii < npt ; ii++ ) val[ii] +=(z[ii]-bot)*scl ;
}
if( ii == 0 ) return ;
for( ii=0 ; ii < npt ; ii++ ) val[ii] = sinf(val[ii]) ;
return ;
}
syntax highlighted by Code2HTML, v. 0.9.1