计算几何之 点到直线的距离&点到线段的距离 代码模板与证明

点到直线的距离

已知直线上两点a、b,和直线外一点p,求p到直线ab的距离。

代码模板
double distance_line(Point p,Point a,Point b)
{
	Vector v1 = b - a,v2 = p - a;
	return fabs(cross(v1,v2) / len(v1));		//cross是v1和v2的叉积
}
证明

这里的v1是直线上的一个向量,v2是v1同起点,指向直线外点p的向量,p到直线的距离就等于两向量的叉积除以v1的模。这里两向量的叉积就是三角形PAB的面积的两倍,就等于底乘高,然后面积除以底就是高,底就是AB就是v1的模,高就是我们要求的距离,如下图:
在这里插入图片描述


点到线段的距离

已知线段AB和线段外一点P,求P到线段AB的距离

代码模板
double distance_segment(Point p,Point a,Point b)
{
	if(a == b)
		return len(p-a);
	Vector v1 = b - a,v2 = p - a,v3 = p - b;
	if(dot(v1,v2) < 0)		//dot是v1和v2的点积
		return len(v2);
	if(dot(v1,v3) > 0)
		return len(v3);
	return distance_lint(p,a,b);
}
证明

点到线段的距离和点到直线的距离有一些不一样。点到线段的距离分三种情况,P在线段AB的左边、右边和中间,如下图:3

首先判断若AB是同一点的话,P到线段AB的距离就是PA的长度,否则,分如下三种情况:

①对于第一种情况,P到线段AB的距离就是PA的长度。这就是第一个if判断,如图若 v ⃗ 1 \vec v_1 v 1 v ⃗ 2 \vec v_2 v 2夹角的cos值小于0,说明是第一种情况,而 c o s θ cos\theta cosθ的正负就可以通过 v ⃗ 1 \vec v_1 v 1 v ⃗ 2 \vec v_2 v 2的点积来判断。
②对于第二种情况,P到线段AB的距离就是PB的长度。这里是第二个if判断,若 v ⃗ 1 \vec v_1 v 1 v ⃗ 3 \vec v_3 v 3夹角的cos值大于0,说明是第二种情况,而同理 c o s θ cos\theta cosθ的正负通过 v ⃗ 1 \vec v_1 v 1 v ⃗ 3 \vec v_3 v 3的点积来判断。
③剩下的就是第三种情况了,P到线段AB的距离就是P到直线AB的距离。

不要忘记cos函数的正负情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值