点到线段的最小距离(C++)

原创 2014年01月27日 15:49:38
/*********************************/
// 如果经过点做直线的垂足,垂足落在线段上,则取垂线段的距离
// 否则取到线段两端点距离的最小值
//
// 参数:
// point:  存储点的xy坐标
// p1, p2: 线段的两点
//
// return: 点到线段的最小距离
/*********************************/

float CalculatePointToLineDistance(float point[2], const float p1[2], const float p2[2])
{
    float dis = 0.f;

    float dx = p2[0] - p1[0];
    float dy = p2[1] - p1[1];

    // 两直线垂直,向量表示法,转换后公示
    float k = -((p1[0] - point[0])*dx + (p1[1] - point[1])*dy) / ( dx*dx + dy*dy);
    float footX = k*dx + p1[0];
    float footY = k*dy + p1[1];

    //if垂足是否落在线段上
    if( footY >= min(p1[1], p2[1]) && footY <=max(p1[1], p2[1])
        && footX >= min(p1[0], p2[0]) && footX <=max(p1[0], p2[0] ) )
    {
        dis = sqrtf((footX-point[0])*(footX-point[0]) + (footY-point[1])*(footY-point[1]));
    }
    else 
    {
        float dis1 = sqrtf((p1[0]-point[0])*(p1[0]-point[0]) + (p1[1]-point[1])*(p1[1]-point[1]));
        float dis2 = sqrtf((p2[0]-point[0])*(p2[0]-point[0]) + (p2[1]-point[1])*(p2[1]-point[1]));

        dis = ( dis1 < dis2 ? dis1 : dis2 );
    }

    return dis;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

点到线段的最短距离

点到线段最短距离的运算与点到直线的最短距离的运算二者之间存在一定的差别,即求点到线段最短距离时需要考虑参考点在沿线段方向的投影点是否在线段上,若在线段上才可采用点到直线距离公式,如图1所示。  ...
  • angelazy
  • angelazy
  • 2014年08月11日 11:28
  • 16145

经纬坐标系中求点到线段距离的方法

提出一种在经纬坐标系中,计算点到线段距离的简单方法,这种方法比较实用,而且不存在二次误差,实用于广大求偏航、出区域等算法中...
  • ufoxiong21
  • ufoxiong21
  • 2015年06月14日 00:39
  • 1897

点到折线最短距离所在点距离折线起点的累积距离

点到折线最短距离所在点 距离  折线起点 的累积距离 using System; using System.Collections.Generic; using System.Linq; using...
  • my_lixiang
  • my_lixiang
  • 2015年07月08日 21:08
  • 1359

三维空间点到直线的距离C++实现

参考: http://blog.csdn.net/zhangsmile123456/article/details/48711719 http://blog.csdn.net/lcfactorizat...
  • piaoxuezhong
  • piaoxuezhong
  • 2017年05月13日 14:33
  • 1377

POJ 1556 The Doors(点到线段的距离+最短路)

The Doors Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit St...
  • u014665013
  • u014665013
  • 2016年05月16日 22:10
  • 491

点到线段的最短距离算法

点到线段最短距离的运算与点到直线的最短距离的运算二者之间存在一定的差别,即求点到线段最短距离时需要考虑参考点在沿线段方向的投影点是否在线段上,若在线段上才可采用点到直线距离公式,如图1所示。    ...
  • KeyboardMagician
  • KeyboardMagician
  • 2016年08月04日 09:13
  • 481

三维空间里点到直线的距离

三维欧式空间点到直线的距离计算方法。使用叉积的表示方法直线用固定点OO对应的向量 o⃗ \vec o 和直行的方向单位向量 a⃗ 0\vec a_0 表示;任意点 QQ 对应的向量 q⃗ \vec q...
  • lcfactorization
  • lcfactorization
  • 2016年11月22日 14:32
  • 2770

C++ 线段树—模板&总结

在信息学竞赛中,经常遇到这样一类问题:这类问题通常可以建模成数轴上的问题或是数列的问题,具体的操作一般是每次对数轴上的一个区间或是数列中的连续若干个数进行一种相同的处理。常规的做法一般依托于线性表这种...
  • txl16211
  • txl16211
  • 2015年04月29日 23:15
  • 2627

线段树的实现及其经典用法(C++实现)

线段树的实现及其经典用法(C++实现) 一、线段树的定义 首先,线段树是一棵完全二叉树。它的特点是:每个结点表示的是一个线段,或者说是一个区间。事实上,一棵线段树的根结点表示的是“整体”区间,...
  • u013149325
  • u013149325
  • 2014年11月25日 21:25
  • 2317

线段树模板--C++

无合并/* adrui's Segment Tree *///无区间合并的区间更新 & 查询 const int N = 100000 + 5;int ans[N 1)...
  • ADjky
  • ADjky
  • 2016年12月21日 19:25
  • 493
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:点到线段的最小距离(C++)
举报原因:
原因补充:

(最多只允许输入30个字)