求空间点到指定线段的垂点坐标-创新互联

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

创新互联建站-专业网站定制、快速模板网站建设、高性价比龙山网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式龙山网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖龙山地区。费用合理售后完善,十多年实体公司更值得信赖。

因垂点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;
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


标题名称:求空间点到指定线段的垂点坐标-创新互联
当前路径:http://abwzjs.com/article/peese.html