本文记录了求一射线和平面交点的方法和C++代码。
应用场景如下,
已知: 在三维空间中,向量v是平面的法向量,点O是平面上任一点,点A是射线的起点,向量l是射线的方向向量。
求: 射线和平面的交点B的坐标。
一、示意图
其示意图如下所示,
二、代码
// 求一条射线与平面的交点
//linePoint:直线经过的一点坐标,长度为3
//lineVector:直线的方向向量,长度为3
//planePoint:平面经过的一点坐标,长度为3
//planeVector:平面的法线向量,长度为3
//intersectPoint:输出的交点,长度为3
void calLinePlaneIntersectPoint(double linePoint[3], double lineVector[3], double planePoint[3], double planeVector[3], double intersectPoint[3])
{
double vp1, vp2, vp3, n1, n2, n3, v1, v2, v3, m1, m2, m3, t, vpt;
vp1 = planeVector[0];
vp2 = planeVector[1];
vp3 = planeVector[2];
n1 = planePoint[0];
n2 = planePoint[1];
n3 = planePoint[2];
v1 = lineVector[0];
v2 = lineVector[1];
v3 = lineVector[2];
m1 = linePoint[0];
m2 = linePoint[1];
m3 = linePoint[2];
vpt = v1 * vp1 + v2 * vp2 + v3 * vp3;
//首先判断直线是否与平面平行
if (vpt == 0)
{
//intersectPoint = null;
}
else
{
t = ((n1 - m1) * vp1 + (n2 - m2) * vp2 + (n3 - m3) * vp3) / vpt;
intersectPoint[0] = m1 + v1 * t;
intersectPoint[1] = m2 + v2 * t;
intersectPoint[2] = m3 + v3 * t;
}
}