之前写过一篇关于点到直线距离的文章,这回我来研究一下点到线段距离

回顾一下,推导出的点到直线距离公式为:

详细请见原博客。

分析

在某种情况下,线段外一点P到线段AB的距离可以看做上述P到直线AB的距离:

就像这样子:

但是这样却不行(蓝线为实际距离,红线为到直线距离):

不难看出:

三角形ABP的形状 点到线段的距离
锐角三角形 P到直线AB的距离
直角三角形

PA,PB的较小者;P到直线AB的距离

钝角三角形 PA,PB的较小者

如图所示。

判断三角形的形状

不妨设三边中,最短的两边为a,b,最长边为c。

不难想到,判断直角三角形,就用勾股定理:

对于锐角三角形:

同理推出,在钝角三角形中,

接下来,便是令人兴奋的代码了。

代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
double dist(double x1,double x2,double y1,double y2)
{return sqrt(pow(x2-x1,2)+pow(y2-y1,2));}//返回(x1,y1),(x2,y2)之间的距离
int main()
{double x1,x2,x3,y1,y2,y3;/*A(x1,y1)B(x2,y2)P(x3,y3)*/cin>>x1>>y1>>x2>>y2>>x3>>y3;//判断三角形形状double a,b,c,d;a=dist(x1,x2,y1,y2);b=dist(x2,x3,y2,y3);c=dist(x1,x3,y1,y3);if(c<a or c<b){if(c<a){int t=a;a=c;c=t;}if(c<b){int t=b;b=c;c=t;}}if(a*a+b*b<=c*c)//直角三角形或钝角三角形 d=min(dist(x1,x3,y1,y3),dist(x2,x3,y2,y3));elsed=sqrt(pow((x3-x1)*(y2-y1)+(y3-y1)*(x1-x2),2)/(pow(y2-y1,2)+pow(x1-x2,2)));printf("%.3lf",d);return 0;
}

但是... ...

有2个测试点没过。80分。

是哪儿出了问题呢?

#以下是改来改去的过程。比较乱。请选择性阅读。#

[灵光一闪]   哦!会不会是没考虑到点在线段(所在直线)上的情况呢?

返回判断三角形的那一步,我们考虑一下这种情况。

让我来改一下代码。

if(a*a+b*b<=c*c)//直角三角形或钝角三角形 {d=min(dist(x1,x3,y1,y3),dist(x2,x3,y2,y3));if(a+b==c)//点在线段上d=0; }

在此做修改(原代码36行)。

看看对不对呢......?!

Emmm mmmm mmmm... ... ...(不要急不要急不要急)

[灵光再现] 我使了个坏。看到锐角三角形部分有些乱,会不会是那里错了?

于是我把else后面的计算部分删了,交了上去。

哈哈哈哈!找到了!还是80分,也就是说,是else后的计算错了!

让我来换个思路。

由于d是P垂直AB的长度,即AB边上的高,所以通过面积法即可求出!

不知道大家知不知道,有一条根据边长计算面积的公式,叫海伦公式

于是,求出面积,除以AB即可。

if(a*a+b*b>c*c)
{int p=(dist(x1,x2,y1,y2)+dist(x1,x3,y1,y3)+dist(x3,x2,y3,y2));int s=sqrt(p*(p-dist(x1,x2,y1,y2))*(p-dist(x3,x2,y3,y2))*(p-dist(x1,x3,y1,y3)));d=s/dist(x1,x2,y1,y2);
}

。。。还是80分。(烂尾警告)

等我!我会搞好的!

(伪)点到线段的距离 C++相关推荐

  1. c# 计算点到线段的距离

    //计算点到线段的距离 public double pointToLine(Vector2 point,LineBase line) {//距离double distance =0;//线段的起点与终 ...

  2. 点到直线的距离c语言程序,点到线段的距离 题解(C++)

    初步分析 这道题之前有<点到直线的距离>一题. 如图,我们不妨来下个定义(名字是乱起的,如果有雷同就以以下定义为准): 对于任意线段l,在其两个端点上分别作垂直于l的直线,若点在两直线之间 ...

  3. costmap_2d 中计算footprint 的内切圆半径和外切圆半径的函数解析——点到线段的距离计算

    计算footprint 的内切圆半径和外切圆半径,用到点到线段的距离,计算方法 两个向量的点积等于一个向量在另一个向量的投影 乘以 另一个向量的模 点到线段的三种情况如下: /*作用:计算点到线段的距 ...

  4. 向量法计算空间点到线段的距离(python)

    中学数学告诉我们,计算点到线段的距离有两种. 我们假设点是P,线段是AB.P和AB都由三维的笛卡尔坐标表示.现计算P到AB的距离. 第一种是,过点P向线段AB上画垂线,判断垂足有没有落在线段上.如果落 ...

  5. 玲珑杯-射击气球-点到线段的距离

    玲珑杯-射击气球-点到线段的距离 求点到线段的距离 由于网页显示吃tab键,缩进无法正常显示 对于空间V-xyz三维几何中点到水平线段的距离,可以投影到xy平面(欧式几何)上.distance = √ ...

  6. python 点到线段的距离_点到线段的最短距离

    博客转载自:http://blog.sina.com.cn/s/blog_5d5c80840101bnhw.html 点到线段最短距离的运算与点到直线的最短距离的运算二者之间存在一定的差别,即求点到线 ...

  7. 关于计算点到线段的距离

    已知线段AB,求某点到该线段的距离.有三种情况,如图:图中只画出两种,其实垂足在另一侧也是一样的.还有就是垂足与A或B共点,这两种情形可以按照前述两种情况任意之一处理. 当垂足在线段上时(包括垂足与A ...

  8. 点到线段的距离计算方法

    如何计算点到线段的最近距离 算法原理图 在二维/三维图形学系统当中,线段的拾取是一个经常使用的功能 如何根据鼠标点来判断线段是否被选择了,最主要的方法之一是通过点到线段的最小距离来判定的 无论二维还是 ...

  9. 点到线段的距离_直线垂直,垂线的性质,点到直线的距离

    欢迎关注公z号:沈阳奥数 两条直线相交所成的四个角中,有一个角是直角时,就说这两条直线互相垂直,其中一条直线叫做另一条直线的垂线,它们的交点叫垂足. 如图,直线AB与CD垂直于点E,记作:AB⊥CD于 ...

  10. URAL 1348. Goat in the Garden 2[求点到线段的距离]

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1348 题目的意思是:求一个点到线段的最短距离和最长距离.. 最长距离比较容易,就是求点到 ...

最新文章

  1. Redhat7 systemctl命令
  2. android 观察者的框架,Android 架构师7 设计模式之观察者模式
  3. 10.14 ssh:安全地远程登录主机
  4. Git之深入解析如何使用Git的分布式工作流程与如何管理多人开发贡献的项目
  5. python接口测试框架实战与自动化进阶(三)
  6. 每隔10秒钟打印一个“Helloworld”
  7. weakreference_Java中WeakReference,SoftReference,PhantomReference和Strong Reference之间的区别...
  8. A new start!
  9. uni-app微信小程序登录;uni-app微信登录小程序;uni-app微信登录app;
  10. [react] react与angular、vue有什么区别?
  11. java interface 实例_Java - Interface 接口的实现方式实例
  12. 格雷码基础和生成的几种方法
  13. 零基础学习次世代,3D游戏建模要美术基础吗?
  14. oracle 数据的定义,oracle——数据定义
  15. leetcode/剑指Offer05.替换空格 双指针法实现原地替换
  16. Unity使用tolua框架教程: LuaFramewrk
  17. 有效解决steamcommunity端口占用问题
  18. 原创 | 假期必读:一文看尽2019-2020各大顶会GNN论文(附链接)
  19. 维汉一家亲 60岁维族大妈免费教市民跳新疆舞(图)
  20. 桌面我的额计算机丢了,电脑中毒后,桌面上的文件都不见了怎么办?

热门文章

  1. 看完这篇文章,再也不怕别人问我JVM了
  2. eclipse中的英文与汉语对照表
  3. 用计算机画频率分布直方图,频率分布直方图
  4. am3352偶发上电不启动问题分析
  5. erp5,一套基于python和gpl协议,功能和界面完全模仿sap r3的大型开源制造业erp系统
  6. 小程序中的flex_在Flex应用程序中启用辅助功能
  7. Dell vostro 3667重装系统
  8. 华为手机如何给应用加锁_如何设置华为手机应用程序锁?
  9. openg离线包_OpenGL离线渲染和缓冲区对象
  10. centos7创建asm磁盘_centos7下安装oracle rac使用udev绑定磁盘方法