home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 3 / RISC_DISC_3.iso / resources / etexts / gems / gemsv / ch3_5 / bsputility.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-22  |  2.0 KB  |  64 lines

  1. /* bspUtility.c: module to compute plane equation, normalize a vector and 
  2.  * perform cross products. 
  3.  * Copyright (c) Norman Chin 
  4.  */
  5. #include "bsp.h"
  6.  
  7. /* local functions */
  8. static void normalizeVector(float ii,float jj,float kk,
  9.                 float *ii2,float *jj2,float *kk2);
  10. static void crossProduct(float ii,float jj,float kk,
  11.              float ii2,float jj2,float kk2,
  12.              float *iicp,float *jjcp,float *kkcp);
  13.  
  14. /* Computes plane equation.
  15.  *
  16.  * xx0,yy0,zz0, xx1,yy1,zz1, xx2,yy2,zz2 - 3 non-collinear vertices 
  17.  * plane                                 - plane equation returned
  18.  */
  19. void computePlane(float xx0,float yy0,float zz0,float xx1,float yy1,float zz1,
  20.           float xx2,float yy2,float zz2, PLANE *plane)
  21. {
  22.    float ii1= xx1 - xx0; float jj1= yy1 - yy0; float kk1= zz1 - zz0;
  23.    float ii2= xx2 - xx0; float jj2= yy2 - yy0; float kk2= zz2 - zz0;
  24.    float iicp, jjcp, kkcp;
  25.  
  26.    crossProduct(ii1,jj1,kk1,ii2,jj2,kk2,&iicp,&jjcp,&kkcp);
  27.    assert(!(IS_EQ(iicp,0.0) && IS_EQ(jjcp,0.0) && IS_EQ(kkcp,0.0)));
  28.  
  29.    /* normalize plane equation */
  30.    normalizeVector(iicp,jjcp,kkcp,&plane->aa,&plane->bb,&plane->cc);
  31.  
  32.    /* compute D of plane equation */
  33.    plane->dd= - (plane->aa * xx0) - (plane->bb * yy0) - (plane->cc * zz0); 
  34. } /* computePlane() */
  35.  
  36. /* Performs cross product.
  37.  *
  38.  * ii1,jj1,kk1, ii2,j2,kk2 - two vectors
  39.  * iicp,jjcp,kkcp          - cross product
  40.  */
  41. static void crossProduct(float ii1,float jj1,float kk1,
  42.              float ii2,float jj2,float kk2,
  43.              float *iicp,float *jjcp,float *kkcp)
  44. {
  45.  *iicp= jj1*kk2 - jj2*kk1; *jjcp= ii2*kk1 - ii1*kk2; *kkcp= ii1*jj2 - ii2*jj1;
  46. } /* crossProduct() */
  47.  
  48. /* Normalize a vector.
  49.  *
  50.  * ii,jj,kk    - vector to be normalized  
  51.  * ii2,jj2,kk2 - vector normalized
  52.  */
  53. static void normalizeVector(float ii,float jj,float kk,
  54.                 float *ii2,float *jj2,float *kk2)
  55. {
  56.    double magnitude= sqrt((double)ii*ii + (double)jj*jj + (double)kk*kk);
  57.    double dfactor= 1.0 / magnitude;
  58.  
  59.    *ii2= (float) (ii * dfactor);
  60.    *jj2= (float) (jj * dfactor);
  61.    *kk2= (float) (kk * dfactor);
  62. } /* normalizeVector() */ 
  63. /*** bspUtility.c ***/
  64.