点到平面的垂足

点到平面的垂足:

思路:

先求解点到平面的距离---根据上面的公式

求交点

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;

}

计算点到平面的垂直距离可以通过以下步骤实现: 1. 根据给定的点和平面上的三个点,计算出平面的法向量,可以使用向量积的方法:将平面上的两个向量进行叉乘。 2. 将点与平面上的任意一点连接成一个向量,计算该向量在法向量方向上的投影。 3. 将该向量减去上一步计算的投影向量,得到点到平面的垂直向量。 4. 计算垂直向量的长度,即为点到平面的垂直距离。 具体的实现代码如下: function computeDistance(point, plane){ //计算平面的法向量 var v1 = subtractVectors(plane[1], plane[0]); var v2 = subtractVectors(plane[2], plane[0]); var normal = crossProduct(v1, v2); //将点与平面上的任意一点连接成一个向量 var vector = subtractVectors(point, plane[0]); //计算投影向量 var projection = projectVector(vector, normal); //计算垂直向量 var perpendicular = subtractVectors(vector, projection); //计算垂直向量长度 var distance = vectorLength(perpendicular); return distance; } //向量减法 function subtractVectors(v1, v2){ return [v1[0]-v2[0], v1[1]-v2[1], v1[2]-v2[2]]; } //向量叉乘 function crossProduct(v1, v2){ return [v1[1]*v2[2]-v1[2]*v2[1], v1[2]*v2[0]-v1[0]*v2[2], v1[0]*v2[1]-v1[1]*v2[0]]; } //向量点乘 function dotProduct(v1, v2){ return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]; } //向量长度 function vectorLength(v){ return Math.sqrt(dotProduct(v, v)); } //向量投影 function projectVector(v, axis){ var length = dotProduct(v, axis) / dotProduct(axis, axis); return [axis[0]*length, axis[1]*length, axis[2]*length]; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值