C++:求任一点沿一方向投影到平面的交点

本文记录了求一射线和平面交点的方法和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;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_35591253/article/details/129793103