// reçoit deux extrémités d'une droite, un point dans un plan, et une normale unitaire // pour le plan, retourne le point d'intersection de la droite // et du plan dans 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) { // le point est dans le plan 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; }