changeset 775:e18cd535c16d

*** empty log message ***
author david <david>
date Sat, 25 Feb 1995 15:10:35 +0000
parents 5c42d11da558
children e3d1ba5dfd9b
files volume_io/Volumes/evaluate.c
diffstat 1 files changed, 64 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/volume_io/Volumes/evaluate.c
+++ b/volume_io/Volumes/evaluate.c
@@ -1,5 +1,48 @@
 #include  <internal_volume_io.h>
 
+private  void    trilinear_interpolate_volume(
+    Real     u,
+    Real     v,
+    Real     w,
+    Real     coefs[],
+    Real     *value,
+    Real     derivs[] )
+{
+    Real   du00, du01, du10, du11, c00, c01, c10, c11, c0, c1, du0, du1;
+    Real   dv0, dv1, dw;
+
+    du00 = coefs[4] - coefs[0];
+    du01 = coefs[5] - coefs[1];
+    du10 = coefs[6] - coefs[2];
+    du11 = coefs[7] - coefs[3];
+
+    c00 = coefs[0] + u * du00;
+    c01 = coefs[1] + u * du01;
+    c10 = coefs[2] + u * du10;
+    c11 = coefs[3] + u * du11;
+
+    dv0 = c10 - c00;
+    dv1 = c11 - c01;
+
+    c0 = c00 + v * dv0;
+    c1 = c01 + v * dv1;
+
+    dw = c1 - c0;
+
+    if( value != NULL )
+        *value = c0 + w * dw;
+
+    if( derivs != NULL )
+    {
+        du0 = INTERPOLATE( v, du00, du10 );
+        du1 = INTERPOLATE( v, du01, du11 );
+
+        derivs[X] = INTERPOLATE( w, du0, du1 );
+        derivs[Y] = INTERPOLATE( w, dv0, dv1 );
+        derivs[Z] = dw;
+    }
+}
+
 private  void   interpolate_volume(
     int      n_dims,
     Real     parameters[],
@@ -256,9 +299,27 @@
     case 0:
     case 1:
     case 2:
-        interpolate_volume( n_interp_dims, fraction, n_values,
-                            degrees_continuity + 2, coefs,
-                            values, first_deriv, second_deriv );
+        /*--- check for the common case which must be done fast */
+
+        if( degrees_continuity == 0 && n_interp_dims == 3 && n_values == 1 )
+        {
+            Real   *deriv;
+
+            if( first_deriv == NULL )
+                deriv = NULL;
+            else
+                deriv = first_deriv[0];
+
+            trilinear_interpolate_volume( fraction[0], fraction[1], fraction[2],
+                                          coefs, values, deriv );
+        }
+        else
+        {
+            interpolate_volume( n_interp_dims, fraction, n_values,
+                                degrees_continuity + 2, coefs,
+                                values, first_deriv, second_deriv );
+        }
+
         break;
     }