问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://blog.csdn.net/qq_45735851/article/details/114448767

点到直线的距离

已知直线上两点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的左边、右边和中间,如下图:

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号