如下图所示,已知面的法向量为N=(A,B,C),且M是面上确定的一点,求直线P1P2与平面的交点P。
根据向量的基本知识,可知:
P = P1 + u (P2 - P1)
由于点P属于平面,根据面的点法式方程有:
N • (P - M) = 0
根据以上两式消去P,可得:
N • (P1 + u (P2 - P1)) = N • M
解上面的方程,则:
typedef struct Point3D { Point3D() :x(0.0f),y(0.0f),z(0.0f) { } Point3D(float fx,float fy,float fz) :x(fz),y(fy),z(fz) { } float x; float y; float z; }Point3D; bool IntersectionLinePlane(const Point3D& N, const Point3D& M, const Point3D& P1, const Point3D& P2, Point3D* P) { Point3D P2_P1; P2_P1.x = P2.x - P1.x; P2_P1.y = P2.y - P1.y; P2_P1.z = P2.z - P1.z; float denom = P2_P1.x*N.x + P2_P1.y*N.y + P2_P1.z*N.z; if (denom == 0.0f) { return false; } else { float numer = (M.x - P1.x)*N.x + (M.y - P1.y)*N.y + (M.z - P1.z)*N.z; float u = numer / denom; P->x = P1.x + u * P2_P1.x; P->y = P1.y + u * P2_P1.y; P->y = P1.z + u * P2_P1.z; return true; } }