点到线段所在直线的垂足

在这里插入图片描述
p点在现在AB上的垂足,就是AP在AB上的投影点,可以使用点乘计算。
点乘公式:a * b = |a||b|cosQ ,
这个可以看成是投影关系表达式:cosQ = a * b / ( |a||b|);
cosQ就是比例值,p点是投影在AB哪处。

double dotmultiply(POINT p1,POINT p2,POINT p0) 
{ 
	return ((p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y)); 
} 
double relation(POINT p,LINESEG l) 
{ 
	LINESEG tl; 
	tl.s=l.s; 
	tl.e=p; 
	return dotmultiply(tl.e,l.e,l.s)/(dist(l.s,l.e)*dist(l.s,l.e)); 
}
// 求点C到线段AB所在直线的垂足 P 
POINT perpendicular(POINT p,LINESEG l) 
{ 
	double r=relation(p,l); 
	POINT tp; 
	tp.x=l.s.x+r*(l.e.x-l.s.x); 
	tp.y=l.s.y+r*(l.e.y-l.s.y); 
	return tp; 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
两条平行的线段之间的最短垂直距离就是其中一条线段的端点到另一条线段所在直线垂足的距离。因此,我们需要先计算出两条线段所在直线的方向向量,然后计算两条线段所在直线垂足,最后计算端点到垂足的距离即可。 以下是用 C++ 编写的程序: ```c++ #include <iostream> #include <cmath> using namespace std; struct Point3D { double x, y, z; }; struct Line3D { Point3D p1, p2; }; double dotProduct(const Point3D& p1, const Point3D& p2) { return p1.x * p2.x + p1.y * p2.y + p1.z * p2.z; } Point3D crossProduct(const Point3D& p1, const Point3D& p2) { Point3D result; result.x = p1.y * p2.z - p1.z * p2.y; result.y = p1.z * p2.x - p1.x * p2.z; result.z = p1.x * p2.y - p1.y * p2.x; return result; } Point3D subtract(const Point3D& p1, const Point3D& p2) { Point3D result; result.x = p1.x - p2.x; result.y = p1.y - p2.y; result.z = p1.z - p2.z; return result; } Point3D add(const Point3D& p1, const Point3D& p2) { Point3D result; result.x = p1.x + p2.x; result.y = p1.y + p2.y; result.z = p1.z + p2.z; return result; } double distance(const Point3D& p1, const Point3D& p2) { double dx = p1.x - p2.x; double dy = p1.y - p2.y; double dz = p1.z - p2.z; return sqrt(dx * dx + dy * dy + dz * dz); } double shortestPerpendicularDistance(const Line3D& l1, const Line3D& l2) { Point3D v1 = subtract(l1.p2, l1.p1); Point3D v2 = subtract(l2.p2, l2.p1); Point3D n = crossProduct(v1, v2); double d = dotProduct(n, subtract(l1.p1, l2.p1)) / dotProduct(n, n); Point3D p = add(l1.p1, {d * n.x, d * n.y, d * n.z}); double d1 = distance(p, l1.p1); double d2 = distance(p, l1.p2); return min(d1, d2); } int main() { Point3D p1 = {0, 0, 0}; Point3D p2 = {1, 1, 1}; Point3D q1 = {2, 0, 0}; Point3D q2 = {3, 1, 1}; Line3D l1 = {p1, p2}; Line3D l2 = {q1, q2}; double d = shortestPerpendicularDistance(l1, l2); cout << "Shortest perpendicular distance: " << d << endl; return 0; } ``` 这个程序首先定义了一个 Point3D 结构体表示三维空间中的一个,以及一个 Line3D 结构体表示三维空间中的一条直线。然后,定义了计算两个积 dotProduct,计算两个向量的叉积 crossProduct,计算两个之间的差 subtract,以及计算两个之间的和 add。最后,定义了计算两条线段之间最短垂直距离的函数 shortestPerpendicularDistance,它计算了两条线段所在直线的方向向量和垂足,并计算了端点到垂足的距离。在 main 函数中,我们定义了两条平行的线段,然后调用 shortestPerpendicularDistance 函数来计算它们之间的最短垂直距离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

<( ̄︶ ̄)Okay.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值