Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

SUMA_ConvexHull.c File Reference

#include "SUMA_suma.h"

Go to the source code of this file.


Functions

int SUMA_qhull_wrap (int npt, float *xyz, int **ijk, int fliporient)
SUMA_SurfaceObjectSUMA_ConvexHullSurface (SUMA_GENERIC_PROG_OPTIONS_STRUCT *Opt)

Variables

SUMA_CommonFieldsSUMAg_CF
SUMA_DOSUMAg_DOv
SUMA_SurfaceViewerSUMAg_SVv
int SUMAg_N_SVv
int SUMAg_N_DOv

Function Documentation

SUMA_SurfaceObject* SUMA_ConvexHullSurface SUMA_GENERIC_PROG_OPTIONS_STRUCT   Opt
 

A function to call SUMA_qhull_wrap

Definition at line 133 of file SUMA_ConvexHull.c.

References THD_3dim_dataset::daxes, SUMA_GENERIC_PROG_OPTIONS_STRUCT::debug, DSET_DX, DSET_DY, DSET_DZ, DSET_NX, DSET_NY, DSET_NZ, DSET_XORG, DSET_YORG, DSET_ZORG, free, i, SUMA_GENERIC_PROG_OPTIONS_STRUCT::in_vol, SUMA_GENERIC_PROG_OPTIONS_STRUCT::mcdatav, SUMA_GENERIC_PROG_OPTIONS_STRUCT::N_XYZ, SUMA_ENTRY, SUMA_free, SUMA_malloc, SUMA_Patch2Surf(), SUMA_qhull_wrap(), SUMA_RETURN, SUMA_S_Err, SUMA_THD_3dmm_to_dicomm(), THD_dataxes::xxorient, SUMA_GENERIC_PROG_OPTIONS_STRUCT::XYZ, THD_fvec3::xyz, THD_dataxes::yyorient, and THD_dataxes::zzorient.

00134 {
00135    static char FuncName[]={"SUMA_ConvexHullSurface"};
00136    SUMA_SurfaceObject *SO=NULL;
00137    float *xyz=NULL;
00138    int npt, *ijk=NULL, nf, cnt, i, j, k, nxx, nyy, nzz;
00139    FILE *fid=NULL;
00140    THD_fvec3 fv, iv;
00141 
00142    SUMA_ENTRY;
00143    
00144    npt = 0;
00145    if (Opt->in_vol) {
00146       cnt = 0; npt = 0;
00147       nxx = (DSET_NX(Opt->in_vol)); 
00148       nyy = (DSET_NY(Opt->in_vol));
00149       nzz = (DSET_NZ(Opt->in_vol));
00150 
00151       if (Opt->debug) fprintf(SUMA_STDERR,"%s:\nRunning qhull...\n", FuncName);
00152       xyz = (float *)SUMA_malloc(3*nxx*nyy*nzz*sizeof(float));
00153       if (!xyz) {
00154          SUMA_S_Err("Failed to allocate"); SUMA_RETURN(NULL);
00155       }
00156       for(  k = 0 ; k < nzz ; k++ ) {
00157          for(  j = 0 ; j < nyy ; j++ ) {
00158             for(  i = 0 ; i < nxx ; i++ ) {
00159                if (Opt->mcdatav[cnt] == 1) {
00160                   fv.xyz[0] = DSET_XORG(Opt->in_vol) + i * DSET_DX(Opt->in_vol);
00161                   fv.xyz[1] = DSET_YORG(Opt->in_vol) + j * DSET_DY(Opt->in_vol);
00162                   fv.xyz[2] = DSET_ZORG(Opt->in_vol) + k * DSET_DZ(Opt->in_vol);
00163                   /* change mm to RAI coords */
00164                             iv = SUMA_THD_3dmm_to_dicomm( Opt->in_vol->daxes->xxorient, Opt->in_vol->daxes->yyorient, Opt->in_vol->daxes->zzorient, fv );
00165                   xyz[3*npt] = iv.xyz[0]; xyz[3*npt+1] = iv.xyz[1]; xyz[3*npt+2] = iv.xyz[2]; 
00166                   npt++;
00167                }
00168                ++cnt;
00169             }
00170          }
00171       }
00172    } else if (Opt->XYZ) {
00173       xyz = (float *)SUMA_malloc(3*Opt->N_XYZ*sizeof(float));
00174       if (!xyz) {
00175          SUMA_S_Err("Failed to allocate"); SUMA_RETURN(NULL);
00176       }
00177       for(  k = 0 ; k < 3*Opt->N_XYZ ; k++ ) {  xyz[k] = Opt->XYZ[k]; npt = Opt->N_XYZ; }   
00178    } else {
00179       SUMA_S_Err("No input");
00180       SUMA_RETURN(NULL);
00181    }
00182    if (! (nf = SUMA_qhull_wrap(npt, xyz, &ijk, 1)) ) {
00183       fprintf(SUMA_STDERR,"%s:\nFailed in SUMA_qhull_wrap\n", FuncName);
00184       SUMA_RETURN(SO);
00185    }
00186    
00187    if (Opt->debug) fprintf(SUMA_STDERR,"%s:\n%d triangles.\n", FuncName, nf);
00188    
00189    
00190    SO = SUMA_Patch2Surf(xyz, npt, ijk, nf, 3);
00191    free(ijk); ijk=NULL;
00192    SUMA_free(xyz); xyz = NULL;
00193       
00194    SUMA_RETURN(SO);
00195 }

int SUMA_qhull_wrap int    npt,
float *    xyz,
int **    ijk,
int    fliporient
 

Definition at line 62 of file SUMA_ConvexHull.c.

References close(), fd, fdopen(), free, malloc, pclose, and popen.

Referenced by SUMA_ConvexHullSurface(), and SUMA_LoadPrepInVol().

00063 {
00064    static char FuncName[]={"SUMA_qhull_wrap"};
00065    int ii,jj , nfac , *fac ;
00066    int fd ; FILE *fp ;
00067    char qbuf[128] ;
00068 
00069 #ifndef DONT_USE_MKSTEMP
00070    char fname[] = "/tmp/afniXXXXXX" ;
00071 #else
00072    char *fname ;
00073 #endif
00074 
00075    if( npt < 3 || xyz == NULL || ijk == NULL ){
00076       fprintf(stderr,"SUMA_qhull_wrap: bad inputs\n") ;
00077       return 0 ;
00078    }
00079 
00080 #ifndef DONT_USE_MKSTEMP
00081    fd = mkstemp( fname ) ;
00082    if( fd == -1 ){ fprintf(stderr,"SUMA_qhull_wrap: mkstemp fails\n"); return 0; }
00083    fp = fdopen( fd , "w" ) ;
00084    if( fp == NULL ){ fprintf(stderr,"SUMA_qhull_wrap: fdopen fails\n"); close(fd); return 0; }
00085 #else
00086    fname = tmpnam(NULL) ;
00087    if( fname == NULL ){ fprintf(stderr,"SUMA_qhull_wrap: tmpnam fails\n"); return 0; }
00088    fp = fopen( fname , "w" ) ;
00089    if( fp == NULL ){ fprintf(stderr,"SUMA_qhull_wrap: fopen fails\n"); return 0; }
00090 #endif
00091 
00092    fprintf(fp,"3\n%d\n",npt) ;
00093    for( ii=0 ; ii < npt ; ii++ )
00094       fprintf(fp,"%g %g %g\n",xyz[3*ii],xyz[3*ii+1],xyz[3*ii+2]) ;
00095 
00096    fclose(fp) ;
00097 
00098    sprintf(qbuf,"qhull QJ i < %s",fname) ;
00099    fp = popen( qbuf , "r" ) ;
00100    if( fp == NULL ){ fprintf(stderr,"SUMA_qhull_wrap: popen fails\n"); remove(fname); return 0; }
00101 
00102    jj = fscanf(fp,"%d",&nfac) ;
00103    if( jj != 1 || nfac < 1 ){ fprintf(stderr,"SUMA_qhull_wrap: 1st fscanf fails\n"); pclose(fp); remove(fname); return 0; }
00104 
00105    fac = (int *) malloc( sizeof(int)*3*nfac ) ;
00106    if( fac == NULL ){ fprintf(stderr,"SUMA_qhull_wrap: malloc fails\n"); pclose(fp); remove(fname); return 0; }
00107 
00108    if (fliporient) {
00109       for( ii=0 ; ii < nfac ; ii++ ){
00110          jj = fscanf(fp,"%d %d %d",fac+(3*ii+2),fac+(3*ii+1),fac+(3*ii)) ;
00111          if( jj < 3 ){
00112             fprintf(stderr,"SUMA_qhull_wrap: fscanf fails at ii=%d\n",ii) ;
00113             pclose(fp); remove(fname); free(fac); return 0;
00114          }
00115       }
00116    } else {
00117       for( ii=0 ; ii < nfac ; ii++ ){
00118          jj = fscanf(fp,"%d %d %d",fac+(3*ii),fac+(3*ii+1),fac+(3*ii+2)) ;
00119          if( jj < 3 ){
00120             fprintf(stderr,"SUMA_qhull_wrap: fscanf fails at ii=%d\n",ii) ;
00121             pclose(fp); remove(fname); free(fac); return 0;
00122          }
00123       }
00124    }
00125    pclose(fp); remove(fname);
00126 
00127    *ijk = fac ; return nfac ;
00128 }

Variable Documentation

SUMA_CommonFields* SUMAg_CF  
 

Global pointer to structure containing info common to all viewers

Definition at line 20 of file SUMA_ConvexHull.c.

SUMA_DO* SUMAg_DOv  
 

Global pointer to Displayable Object structure vector

Definition at line 21 of file SUMA_ConvexHull.c.

int SUMAg_N_DOv  
 

Number of DOs stored in DOv

Definition at line 24 of file SUMA_ConvexHull.c.

int SUMAg_N_SVv  
 

Number of SVs stored in SVv

Definition at line 23 of file SUMA_ConvexHull.c.

SUMA_SurfaceViewer* SUMAg_SVv  
 

Global pointer to the vector containing the various Surface Viewer Structures

Definition at line 22 of file SUMA_ConvexHull.c.

 

Powered by Plone

This site conforms to the following standards: