Mercurial > hg > minc-tools
changeset 53:4bef3da8d9ec
Initial revision
author | david <david> |
---|---|
date | Thu, 07 Jan 1993 14:07:13 +0000 |
parents | 4e7a0f0061b1 |
children | 22d0cb5dac63 |
files | volume_io/Volumes/input_volume.c |
diffstat | 1 files changed, 128 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/volume_io/Volumes/input_volume.c @@ -0,0 +1,128 @@ +#include <def_mni.h> +#include <minc.h> + +#define N_VALUES 256 + +public Status input_volume( + char filename[], + volume_struct *volume ) +{ + Status status; + int x, y, z; + Volume_type *x_strip; + int axis; + long length; + int icv, cdfid, img; + int ndims, dim[MAX_VAR_DIMS]; + long start[3], count[3]; + + icv = miicv_create(); + + (void) miicv_setint( icv, MI_ICV_TYPE, NC_BYTE ); + (void) miicv_set( icv, MI_ICV_SIGN, MI_UNSIGNED ); + (void) miicv_setdbl( icv, MI_ICV_VALID_MAX, 255.0 ); + (void) miicv_setdbl( icv, MI_ICV_VALID_MIN, 0.0 ); + + cdfid = ncopen( filename, NC_NOWRITE ); + + img = ncvarid( cdfid, MIimage ); + (void) miicv_attach( icv, cdfid, img ); + + (void) ncvarinq( cdfid, img, (char *) 0, (nc_type *) 0, + &ndims, dim, (int *) 0 ); + + if( ndims != N_DIMENSIONS ) + { + print( + "Error: input volume file does not have exactly 3 dimensions.\n" ); + status = ERROR; + return( status ); + } + + for_less( axis, 0, ndims ) + { + (void) ncdiminq( cdfid, dim[axis], (char *) 0, &length ); + volume->sizes[2-axis] = length; + } + + ALLOC3D( status, volume->data, volume->sizes[X], volume->sizes[Y], + volume->sizes[Z] ); + + ALLOC( status, x_strip, volume->sizes[X] ); + + for_less( z, 0, volume->sizes[Z] ) + { + for_less( y, 0, volume->sizes[Y] ) + { + start[0] = z; + start[1] = y; + start[2] = 0; + count[0] = 1; + count[1] = 1; + count[2] = volume->sizes[X]; + (void) miicv_get( icv, start, count, (void *) x_strip ); + + for_less( x, 0, volume->sizes[X] ) + { + volume->data[x][y][z] = x_strip[x]; + } + } + } + + FREE( status, x_strip ); + + (void) ncclose( cdfid ); + (void) miicv_free( icv ); + + volume->thickness[X] = 1.0; + volume->thickness[Y] = 1.0; + volume->thickness[Z] = 1.0; + volume->value_scale = 1.0; + volume->value_translation = 0.0; + + return( status ); +} + +public Status input_fake_volume( + char filename[], + volume_struct *volume ) /* ARGSUSED */ +{ + Status status; + int x, y, z, val; + Real dx, dy, dz; + + volume->sizes[X] = 100; + volume->sizes[Y] = 100; + volume->sizes[Z] = 100; + volume->thickness[X] = 1.0; + volume->thickness[Y] = 1.0; + volume->thickness[Z] = 1.0; + volume->value_scale = 1.0; + volume->value_translation = 0.0; + + ALLOC3D( status, volume->data, volume->sizes[X], volume->sizes[Y], + volume->sizes[Z] ); + + for_less( x, 0, volume->sizes[X] ) + { + dx = 2.0 * (Real) x / (Real) volume->sizes[X] - 1.0; + if( dx < 0.0 ) dx = -dx; + for_less( y, 0, volume->sizes[Y] ) + { + dy = 2.0 * (Real) y / (Real) volume->sizes[Y] - 1.0; + if( dy < 0.0 ) dy = -dy; + for_less( z, 0, volume->sizes[Z] ) + { + dz = 2.0 * (Real) z / (Real) volume->sizes[Z] - 1.0; + if( dz < 0.0 ) dz = -dz; + val = (int) ((dx + dy + dz) * (Real) N_VALUES / 2.0 ); + if( val > N_VALUES-1 ) val = 0; + volume->data[x][y][z] = val; + } + } + if( x % 10 == 0 ) + print( "%d/%d\n", x, volume->sizes[X] ); + } + + return( status ); +}