#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