Listing 1 (SRF_TRNS.C)

/*****************************************************
              Name:  SRF_TRNS.C
        Description:  Library of functions for the
                    rotation and translation of
                    surface equation coefficients
Global Function List:  srf_rotate, srf_trans
        Portability:  Standard C
*****************************************************/

#include <stdlib.h>
#include <srf_trns.h>

/*****************************************************
      Name:  srf_rotate
 Parameters:  Co - 4x4 matrix of original coefficients
            Cr - 4x4 matrix of rotated coefficients
            R - 3x3 matrix of coordinant rotation of
            new system with respect to the original
Description:  Rotate a surface by a given coordinant
            transformation. Second order surfaces
            are in the form,
            0 = C00 + C01x + C02y + C03z + C11x +
            C22y + C33z + C12xy + C23yz + C13xz
            First order are in the form,
            0 : C00 + C01x + C02y + C03z
*****************************************************/
void srf_rotate( double **Co, double **Co,
     double **R )
   {
   size_t i, j, k, m;
   /* Get the constant term. */
   Cr[0] [0] = Co[0] [0];

   /* The squared terms. C11, C22, C33 */
   for ( i = 1; i < 4; i++ )
      for ( j = 1; j < 4; j++ )
         for ( k = 1; k < 4; k++ )
            Cr[i][i] += R[i - 1][j - 1] *
                 R[i - 1][k - 1] * Co[j][k];

   /* The mixed terms. C12, C13, C23 */
   for ( i = 1; i < 4; i++ )
      for ( j = i + 1; j < 4; j++ )
         for ( k = 1; k < 4; k++ )
            for ( m = 1; m < 4; m++ )
               Cr[i][j] += R[i - 1][k - 1] * R[j - 1][m- 1] * Co[k][m] * 
                  ( k == m) ? 2 : 1 );
   
   /* The linear terms. C01, C02, C03 */
   for ( i = 1; i < 4; i++ )
      for ( j = 1; j < 4; j++ )
         Cr[0][i] += R[i - 1][j - 1] * Co[0][j];
   
   /* Fill up the diagonals, make matrix symetric */
   for ( i = 0; i < 4; i++ )
      for ( j = i + 1; j < 4; j++ )
         Cr[j][i] = Cr[i][j];
   
   }  /* function surf rotate */

/*****************************************************
      Name:  srf_trans
 Parameters:  Co - 4x4 matrix of original coefficients
            T - array of translation vector
    Return:  Co is modified
            Description: Translate a surface by a given distance
            vector. The distance vector is defined
            the the coordinate system the surface is
            currently in. Second order surfaces
            are in the form,
            0 = C00 + C01x + C02y + C03z + C11x +
            C22y + C33z + C12xy + C23yz + C13xz
            First order are in the form,
            0: C00 + C01x + C02y + CO3z
****************************************************/
void srf_trans( double **Co, double *T )
   {
   size_t i, j;

   /* Get the constant term. C00 */
   for ( i = 0; i < 4; i++ )
      for ( j = i; j < 4; j++ )
         Co[0][0] += (( i == 0 ) ? 1.0 :
              T[j- 1] ) * (( j == 0 ) ? 0.0 :
              T[j - 1] ) * Co[i][j];

   /* Get the single terms. C01, C02, C03 */
   for ( i = 1; i < 4; i++ )
      for ( j = 1; j < 4; j++ )
         Co[0][i] +: T[j - 1] * Co[j][i] *
              ((i ==j) ? 2.0: 1.0);

   /* Fill up the diagonals, make matrix symetric */
   for ( i = 0; i < 4; i++ )
      for ( j = i + 1; j < 4; j++ )
         Co[j][i]= Co[i] [j];

   }  /* function surf_tran */
/* End of File */