home *** CD-ROM | disk | FTP | other *** search
- // Given two line endpoints, a point on a plane, and a unit normal
- // for the plane, returns the point of intersection of the line
- // and the plane in intersectpoint.
-
- #define DOT_PRODUCT(x,y) (x[0]*y[0]+x[1]*y[1]+x[2]*y[2])
-
- void LineIntersectPlane (float *linestart, float *lineend,
- float *planeorigin, float *planenormal, float *intersectpoint)
- {
- float vec1[3], projectedlinelength, startdistfromplane, scale;
-
- vec1[0] = linestart[0] - planeorigin[0];
- vec1[1] = linestart[1] - planeorigin[1];
- vec1[2] = linestart[2] - planeorigin[2];
-
- startdistfromplane = DOT_PRODUCT(vec1, planenormal);
-
- if (startdistfromplane == 0)
- {
- // point is in plane
- intersectpoint[0] = linestart[0];
- intersectpoint[1] = linestart[1];
- intersectpoint[2] = linestart[1];
- return;
- }
-
- vec1[0] = linestart[0] - lineend[0];
- vec1[1] = linestart[1] - lineend[1];
- vec1[2] = linestart[2] - lineend[2];
-
- projectedlinelength = DOT_PRODUCT(vec1, planenormal);
-
- scale = startdistfromplane / projectedlinelength;
-
- intersectpoint[0] = linestart[0] - vec1[0] * scale;
- intersectpoint[1] = linestart[1] - vec1[1] * scale;
- intersectpoint[2] = linestart[1] - vec1[2] * scale;
- }
-