home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 3 / RISC_DISC_3.iso / resources / etexts / gems / gemsi / raypolygon.c < prev    next >
Text File  |  1992-09-15  |  2KB  |  54 lines

  1. /*
  2. An Efficient Ray/Polygon Intersection
  3. by Didier Badouel
  4. from "Graphics Gems", Academic Press, 1990
  5.  
  6. just code, not a procedure.
  7. */
  8.  
  9. /* the value of t is computed.
  10.  * i1 and i2 come from the polygon description.
  11.  * V is the vertex table for the polygon and N the
  12.  * associated normal vectors.
  13.  */
  14. P[0] = ray.O[0] + ray.D[0]*t;
  15. P[1] = ray.O[1] + ray.D[1]*t;
  16. P[2] = ray.O[2] + ray.D[2]*t;
  17. u0 = P[i1] - V[0][i1]; v0 = P[i2] - V[0][i2];
  18. inter = FALSE; i = 2;
  19. do {
  20.     /* The polygon is viewed as (n-2) triangles. */
  21.     u1 = V[i-1][i1] - V[0][i1]; v1 = V[i-1][i2] - V[0][i2];
  22.     u2 = V[i  ][i1] - V[0][i1]; v2 = V[i  ][i2] - V[0][i2];
  23.  
  24.     if (u1 == 0)    {
  25.         beta = u0/u2;
  26.         if ((beta >= 0.)&&(beta <= 1.)) {
  27.             alpha = (v0 - beta*v2)/v1;
  28.             inter = ((alpha >= 0.)&&(alpha+beta) <= 1.));
  29.         }
  30.     } else {
  31.         beta = (v0*u1 - u0*v1)/(v2*u1 - u2*v1);
  32.         if ((beta >= 0.)&&(beta <= 1.)) {
  33.             alpha = (u0 - beta*u2)/u1;
  34.             inter = ((alpha >= 0)&&((alpha+beta) <= 1.));
  35.         }
  36.     }
  37. } while ((!inter)&&(++i < poly.n));
  38.  
  39. if (inter) {
  40.     /* Storing the intersection point. */
  41.     ray.P[0] = P[0]; ray.P[1] = P[1]; ray.P[2] = P[2];
  42.     /* the normal vector can be interpolated now or later. */
  43.     if (poly.interpolate) {
  44.         gamma = 1 - (alpha+beta);
  45.         ray.normal[0] = gamma * N[0][0] + alpha * N[i-1][0] + 
  46.         beta * N[i][0];
  47.         ray.normal[1] = gamma * N[0][1] + alpha * N[i-1][1] +
  48.          beta * N[i][1];
  49.         ray.normal[2] = gamma * N[0][2] + alpha * N[i-1][2] +
  50.          beta * N[i][2];
  51.     }
  52. }
  53. return (inter);
  54.