changeset 774:5c42d11da558

*** empty log message ***
author david <david>
date Wed, 22 Feb 1995 16:03:24 +0000
parents e1e0f33f27d3
children e18cd535c16d
files volume_io/Volumes/evaluate.c
diffstat 1 files changed, 100 insertions(+), 105 deletions(-) [+]
line wrap: on
line diff
--- a/volume_io/Volumes/evaluate.c
+++ b/volume_io/Volumes/evaluate.c
@@ -111,24 +111,25 @@
     Real           voxel[],
     BOOLEAN        interpolating_dimensions[],
     int            degrees_continuity,
+    Real           outside_value,
     Real           values[],
     Real           **first_deriv,
-    Real           ***second_deriv,
-    BOOLEAN        *inside )
+    Real           ***second_deriv )
 {
-    int   n, v, d, dim, n_values, sizes[MAX_DIMENSIONS], n_dims, ind;
-    int   start[MAX_DIMENSIONS], n_interp_dims;
-    int   end[MAX_DIMENSIONS];
-    int   interp_dims[MAX_DIMENSIONS];
-    int   n_coefs;
-    int   vi[MAX_DIMENSIONS];
-    Real  value, fraction[MAX_DIMENSIONS], bound, *coefs;
+    int      n, v, d, dim, n_values, sizes[MAX_DIMENSIONS], n_dims, ind;
+    int      start[MAX_DIMENSIONS], n_interp_dims;
+    int      end[MAX_DIMENSIONS];
+    int      interp_dims[MAX_DIMENSIONS];
+    int      n_coefs;
+    int      vi[MAX_DIMENSIONS];
+    Real     fraction[MAX_DIMENSIONS], bound, *coefs;
+    BOOLEAN  fully_inside;
 
-    if( degrees_continuity > 2 )
+    if( degrees_continuity < -1 || degrees_continuity > 2 )
     {
-        print( "Warning: evaluate_volume(), degrees too large: %d\n",
+        print( "Warning: evaluate_volume(), degrees invalid: %d\n",
                degrees_continuity );
-        degrees_continuity = 2;
+        degrees_continuity = 0;
     }
 
     n_dims = get_volume_n_dimensions(volume);
@@ -139,39 +140,9 @@
     for_less( d, 0, n_dims )
     {
         if( interpolating_dimensions == NULL || interpolating_dimensions[d] )
-        {
-            if( degrees_continuity > -2 &&
-                (voxel[d] < (Real) degrees_continuity * 0.5 ||
-                 voxel[d] > (Real)(sizes[d]-1) - (Real)degrees_continuity*0.5) )
-            {
-                --degrees_continuity;
-                for( ; degrees_continuity > -2;  --degrees_continuity )
-                {
-                    if( voxel[d] >= (Real) degrees_continuity * 0.5 &&
-                        voxel[d] <= (Real)(sizes[d]-1) -
-                                    (Real)degrees_continuity * 0.5 )
-                    {
-                        break;
-                    }
-                }
-            }
             ++n_interp_dims;
-        }
         else
-        {
             n_values *= sizes[d];
-        }
-    }
-
-    if( inside != NULL )
-        *inside = degrees_continuity >= -1;
-
-    if( degrees_continuity < -1 )
-    {
-        value = get_volume_real_min( volume );
-
-        for_less( v, 0, n_values )
-            values[v] = value;
     }
 
     if( degrees_continuity < 0 && first_deriv != NULL )
@@ -189,59 +160,55 @@
                    second_deriv[v][d][dim] = 0.0;
     }
 
-    if( degrees_continuity > -2 )
+    bound = degrees_continuity / 2.0;
+    n_interp_dims = 0;
+    n_coefs = 1;
+
+    fully_inside = TRUE;
+
+    for_less( d, 0, n_dims )
     {
-        bound = degrees_continuity / 2.0;
-        n_interp_dims = 0;
-        n_coefs = 1;
+        if( interpolating_dimensions == NULL || interpolating_dimensions[d])
+        {
+            interp_dims[n_interp_dims] = d;
+            start[n_interp_dims] =      (int) ( voxel[d] - bound );
+            fraction[n_interp_dims] = FRACTION( voxel[d] - bound );
+            end[n_interp_dims] = start[d] + degrees_continuity + 2;
+            n_coefs *= 2 + degrees_continuity;
 
-        for_less( d, 0, n_dims )
-        {
-            if( interpolating_dimensions == NULL || interpolating_dimensions[d])
+            if( start[n_interp_dims] < 0 ||
+                end[n_interp_dims] > sizes[n_interp_dims] )
             {
-                interp_dims[n_interp_dims] = d;
-                n_coefs *= 2 + degrees_continuity;
-                if( voxel[d] >= (Real) sizes[d] - 1.0 - bound )
-                {
-                    start[n_interp_dims] = sizes[d] - degrees_continuity - 2;
-                    fraction[n_interp_dims] = 1.0;
-                }
-                else
-                {
-                    if( voxel[d] < bound )
-                        voxel[d] = bound;
-
-                    start[n_interp_dims] = (int) ( voxel[d] - bound );
-                    fraction[n_interp_dims] = FRACTION( voxel[d] - bound );
-                }
+                fully_inside = FALSE;
+            }
 
-                end[n_interp_dims] = start[d] + degrees_continuity + 2;
-                ++n_interp_dims;
-            }
+            ++n_interp_dims;
         }
+    }
 
-        n = 0;
-        for_less( d, 0, n_dims )
+    n = 0;
+    for_less( d, 0, n_dims )
+    {
+        if( interpolating_dimensions != NULL && !interpolating_dimensions[d] )
         {
-            if( interpolating_dimensions != NULL &&
-                !interpolating_dimensions[d] )
-            {
-                interp_dims[n_interp_dims+n] = d;
-                start[n_interp_dims+n] = 0;
-                end[n_interp_dims+n] = sizes[d];
-                ++n;
-            }
+            interp_dims[n_interp_dims+n] = d;
+            start[n_interp_dims+n] = 0;
+            end[n_interp_dims+n] = sizes[d];
+            ++n;
         }
+    }
 
-        for_less( d, n_dims, MAX_DIMENSIONS )
-        {
-            start[d] = 0;
-            end[d] = 1;
-            interp_dims[d] = d;
-        }
+    for_less( d, n_dims, MAX_DIMENSIONS )
+    {
+        start[d] = 0;
+        end[d] = 1;
+        interp_dims[d] = d;
+    }
 
-        ALLOC( coefs, n_values * n_coefs );
+    ALLOC( coefs, n_values * n_coefs );
 
+    if( fully_inside )
+    {
         ind = 0;
         for_less( vi[interp_dims[0]], start[0], end[0] )
         for_less( vi[interp_dims[1]], start[1], end[1] )
@@ -252,26 +219,51 @@
             GET_VALUE( coefs[ind], volume, vi[0], vi[1], vi[2], vi[3], vi[4] );
             ++ind;
         }
-
-        switch( degrees_continuity )
+    }
+    else
+    {
+        ind = 0;
+        for_less( vi[interp_dims[0]], start[0], end[0] )
+        for_less( vi[interp_dims[1]], start[1], end[1] )
+        for_less( vi[interp_dims[2]], start[2], end[2] )
+        for_less( vi[interp_dims[3]], start[3], end[3] )
+        for_less( vi[interp_dims[4]], start[4], end[4] )
         {
-        case -1:
-            for_less( v, 0, n_values )
-                values[v] = coefs[v];
-            break;
+            for_less( d, 0, n_dims )
+            {
+                if( vi[d] < 0 || vi[d] >= sizes[d] )
+                    break;
+            }
 
-        case 0:
-        case 1:
-        case 2:
-            interpolate_volume( n_interp_dims, fraction, n_values,
-                                degrees_continuity + 2, coefs,
-                                values, first_deriv, second_deriv );
-            break;
+            if( d == n_dims )
+            {
+                GET_VALUE( coefs[ind], volume, vi[0], vi[1], vi[2], vi[3],
+                                               vi[4] );
+            }
+            else
+                coefs[ind] = outside_value;
+            ++ind;
         }
+    }
 
-        FREE( coefs );
+    switch( degrees_continuity )
+    {
+    case -1:
+        for_less( v, 0, n_values )
+            values[v] = coefs[v];
+        break;
+
+    case 0:
+    case 1:
+    case 2:
+        interpolate_volume( n_interp_dims, fraction, n_values,
+                            degrees_continuity + 2, coefs,
+                            values, first_deriv, second_deriv );
+        break;
     }
 
+    FREE( coefs );
+
     return( n_values );
 }
 
@@ -295,12 +287,13 @@
 @MODIFIED   : 
 ---------------------------------------------------------------------------- */
 
-public  BOOLEAN   evaluate_volume_in_world(
+public  void   evaluate_volume_in_world(
     Volume         volume,
     Real           x,
     Real           y,
     Real           z,
     int            degrees_continuity,
+    Real           outside_value,
     Real           values[],
     Real           deriv_x[],
     Real           deriv_y[],
@@ -318,7 +311,7 @@
     Real      t[MAX_DIMENSIONS][MAX_DIMENSIONS];
     int       c, d, dim, v, n_values, n_interp_dims, n_dims, axis;
     int       sizes[MAX_DIMENSIONS];
-    BOOLEAN   interpolating_dimensions[MAX_DIMENSIONS], inside;
+    BOOLEAN   interpolating_dimensions[MAX_DIMENSIONS];
 
     convert_world_to_voxel( volume, x, y, z, voxel );
     get_volume_sizes( volume, sizes );
@@ -333,7 +326,7 @@
         if( axis < 0 )
         {
             print("evaluate_volume_in_world(): must have 3 spatial axes.\n");
-            return( FALSE );
+            return;
         }
 
         interpolating_dimensions[axis] = TRUE;
@@ -362,8 +355,8 @@
         second_deriv = NULL;
 
     n_values = evaluate_volume( volume, voxel, interpolating_dimensions,
-                      degrees_continuity, values, first_deriv, second_deriv,
-                      &inside );
+                      degrees_continuity, outside_value,
+                      values, first_deriv, second_deriv );
 
     if( deriv_x != NULL )
     {
@@ -384,6 +377,8 @@
             convert_voxel_normal_vector_to_world( volume, voxel,
                                    &deriv_x[v], &deriv_y[v], &deriv_z[v] );
         }
+
+        FREE2D( first_deriv );
     }
 
     if( deriv_xx != (Real *) 0 )
@@ -428,7 +423,7 @@
             convert_voxel_normal_vector_to_world( volume, voxel,
                                   &deriv_xz[v], &deriv_yz[v], &deriv_zz[v] );
         }
+
+        FREE3D( second_deriv );
     }
-
-    return( inside );
 }