点到平面的垂足:
思路:
先求解点到平面的距离---根据上面的公式
求交点
long GetPanelProjDot(Vector3 *dot0, double *pdPanelCoef, Vector3 *dot1)
{
long lRes = 1;
double linT = 0;
if(pdPanelCoef==NULL) {
lRes = -1;
goto EndPro;
}
//计算直线参数方程的参数
//点到平面的距离---有符号的距离,距离取反是因为后面投影式用+号。
距离符号说明:距离为正,说明法向量指向点,如果距离为负,说明法向量指向点所在平面的另一面。
计算距离
linT= -(pdPanelCoef[0]*dot0->x+pdPanelCoef[1]*dot0->y+pdPanelCoef[2]*dot0->z+pdPanelCoef[3]) /
(pow(pdPanelCoef[0],2)+pow(pdPanelCoef[1],2)+pow(pdPanelCoef[2],2));
这里也可以用另外一个公式计算:更简便
计算投影点
求投影点:用向量求投影点 dot1->x = (float)(dot0->x + pdPanelCoef[0]*linT);,所以距离取反。
距离L>0,投影点为T= P–|L|*N,距离L<0,投影点为T= P+|L|*N,所以L取负,可以用“+”号,其实也可以,不用取反,然后用“-”号的。
//根据已经推断的公式,计算投影点
dot1->x = (float)(dot0->x + pdPanelCoef[0]*linT);
dot1->y = (float)(dot0->y + pdPanelCoef[1]*linT);
dot1->z = (float)(dot0->z + pdPanelCoef[2]*linT);
EndPro:
return lRes;
}