求空间点到指定线段的垂点坐标

设空间线段的起点A和终点B分别为(a_1,b_1,c_1)\left ( a_2,b_2,c_2 \right ),线段AB外一点C(a,b,c),则C点到线段AB的垂点D的坐标求解过程如下:

因垂点D在线段AB上,则有向量关系\overrightarrow{AD}=k\overrightarrow{AB},由向量仿射知D点坐标可表示为\left ( a_1+k(a_2-a_1), b_1+k(b_2-b_1), c_1+k(c_2-c_1)\right )[式1]。

\overrightarrow{AB}=(a_2-a_1,b_2-b_1,c_2-c_1)

\overrightarrow{CD}=(a_1-a+k(a_2-a_1),b_1-b+k(b_2-b_1),c_1-c+k(c_2-c_1))

\overrightarrow{AB}\perp \overrightarrow{CD},则有

(a_1-a+k(a_2-a_1))\times (a_2-a_1)+(b_1-b+k(b_2-b_1))\times (b_2-b_1)+((c_1-c+k(c_2-c_1))\times (c_2-c_1)=0

整理得:

k=\frac{(a_2-a_1)(a-a_1)+(b_2-b_1)(b-b_1)+(c_2-c_1)(c-c_1)}{(a_2-a_1)^{2}+(b_2-b_1)^{2}+(c_2-c_1)^{2}}

求出k后,由[式1]可求出D点坐标。

0\leq k\leqslant 1时,垂点D在线段AB上,否则在线段AB外。

C++代码如下:

#include "stdafx.h"
class CPoint
{
public:
	CPoint()
	{
		x = 0;
		y = 0;
		z = 0;
	}
	CPoint(double _x, double _y, double _z)
	{
		x = _x;
		y = _y;
		z = _z;
	}
	inline void operator = (const CPoint& p)
	{
		x = p.x;
		y = p.y;
		z = p.z;
	}
	static CPoint getPerpendicularPoint(CPoint start, CPoint end, CPoint pt, double& u)
	{
		CPoint ret;
		double dx = end.x - start.x;
		double dy = end.y - start.y;
		double dz = end.z - start.z;
		double k = (end.x - start.x)*(pt.x - start.x) + (end.y - start.y)*(pt.y - start.y) + (end.z - start.z)*(pt.z - start.z);
		k = k / (dx*dx + dy*dy + dz*dz);
		u = k;
		return CPoint(start.x + k*dx, start.y + k*dy, start.z + k*dz);
	}
public:
	double x;
	double y;
	double z;
};

int _tmain(int argc, _TCHAR* argv[])
{
	double u;
	CPoint x1 = CPoint::getPerpendicularPoint(CPoint(0, 0, 0), CPoint(0,0, 100),CPoint(30,20,30),u);
	return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值