不用三角函数求点到线段距离的算法

yjukh 2010-01-19 02:42:29
加精
自己想出来的,可能很多人已经会用,但希望对某些朋友有帮助。





double GetPointDistance(CPoint p1, CPoint p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
float GetNearestDistance(CPoint PA, CPoint PB, CPoint P3)
{

//----------图2--------------------
float a,b,c;
a=GetPointDistance(PB,P3);
if(a<=0.00001)
return 0.0f;
b=GetPointDistance(PA,P3);
if(b<=0.00001)
return 0.0f;
c=GetPointDistance(PA,PB);
if(c<=0.00001)
return a;//如果PA和PB坐标相同,则退出函数,并返回距离
//------------------------------


if(a*a>=b*b+c*c)//--------图3--------
return b;
if(b*b>=a*a+c*c)//--------图4-------
return a;



//图1
float l=(a+b+c)/2; //周长的一半
float s=sqrt(l*(l-a)*(l-b)*(l-c)); //海伦公式求面积
return 2*s/c;
}


...全文
3767 139 打赏 收藏 转发到动态 举报
写回复
用AI写文章
139 条回复
切换为时间正序
请发表友善的回复…
发表回复
ricky60 2010-05-24
  • 打赏
  • 举报
回复
up up up
mhc20033167 2010-02-07
  • 打赏
  • 举报
回复
支持下!
swenfang 2010-02-05
  • 打赏
  • 举报
回复
LZ,我估计你这个方法是效率最差的方法了,没有人会用你这个方法的,特别是在图形处理领域,华而不实,
chzhk007 2010-02-04
  • 打赏
  • 举报
回复
研究这种算法能顶什么用呢?
jacquesgw 2010-01-26
  • 打赏
  • 举报
回复
强帖。不错
用户 昵称 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 135 楼 yjukh 的回复:]
引用 133 楼 jennyvenus 的回复:
一点没看,是点到直线的距离吗?


是到线段,不是直线,直线直接做垂线就可以了。
[/Quote]

既然到直线的距离可以算,那么到线段的距离就是点到直线,点到两端点这三个值中选最小,这样也不用三角函数吧。
yjukh 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 133 楼 jennyvenus 的回复:]
一点没看,是点到直线的距离吗?

[/Quote]
是到线段,不是直线,直线直接做垂线就可以了。
rover___ 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 78 楼 favorwqy 的回复:]
效率太低了,向量才是王道,三点坐标(x0,y0)(x1,y1)(x2,y2),面积=((x1-x0)*(y2-y0)-(x2-x0)*(y1-y0))/2
[/Quote]
比楼主强多了,这个帖有点误人。。。。
dengronghua85 2010-01-25
  • 打赏
  • 举报
回复
支持
yjukh 2010-01-24
  • 打赏
  • 举报
回复
[Quote=引用 125 楼 tian991157954 的回复:]
if(a*a>=b*b+c*c)//--------图3-------- return b; 这里不太对,Pa和Pb又不成直角,怎么能用P到A的距离代替距离呢? if(b*b>=a*a+c*c)//--------图4------- return a; 也有同样的问题
[/Quote]
求的不是垂线距离,如果那样就成了到直线的距离了。线段是有首尾点的。

这个算法我是用在拾取线段的程序里的,由于我用的程序中没有涉及三维图形,所以没考虑三维的算法。
标志图3、图4的程序是用来判断是锐角还是钝角三角形,我自己感觉这样好理解一些,至于是否最快却没有考虑。

求面积的确可以用矢量法:
[Quote=引用 78 楼 favorwqy 的回复:]
向量才是王道,三点坐标(x0,y0)(x1,y1)(x2,y2),面积=((x1-x0)*(y2-y0)-(x2-x0)*(y1-y0))/2
[/Quote]
zhuxiongliang 2010-01-24
  • 打赏
  • 举报
回复
牛!!!
用户 昵称 2010-01-24
  • 打赏
  • 举报
回复
一点没看,是点到直线的距离吗?
maoeryatoumisu 2010-01-24
  • 打赏
  • 举报
回复
厉害
huanyuxiake 2010-01-24
  • 打赏
  • 举报
回复
不懂,曾点分!
qq362798001 2010-01-24
  • 打赏
  • 举报
回复
多谢楼主,辛苦了!!!!!!!!!!
cuixiping 2010-01-23
  • 打赏
  • 举报
回复
不好意思,笔误了,“端点A的坐标(x1,y1,z1)、端点B的坐标(x1,y1,z1)。 ”应该是改为“端点A的坐标(x1,y1,z1)、端点B的坐标(x2,y2,z2)。 ”
cuixiping 2010-01-23
  • 打赏
  • 举报
回复
楼主都没有说题目的条件,算个屁呀。

首先,三维立体的坐标嘛,不一定是二维平面的呀。
怎么这么多人都不考虑三维立体几何呢??


我来补充条件。

已知空间内某点O的坐标(x0,y0,z0),某线段AB,端点A的坐标(x1,y1,z1)、端点B的坐标(x1,y1,z1)。
求点O到线段AB的最短距离S。

几种情况要考虑的:
1、如果点O在线段AB上,那么距离是S=0。
2、如果点O不在线段AB上,但在线段AB的延长线上,那么距离是点O到较近端点的距离,S=Min(OA,OB)。
3、如果点O既不在线段上,也不在线段的延长线上,则点O与AB组成三角形OAB。
3.1 如果角∠OAB≥90°,则S=OA
3.2 如果角∠OBA≥90°,则S=OB
3.3 如果角∠OAB<90°且角∠OBA<90°,则S=点O到AB的垂线段的长度。

根据立体几何的知识进行计算。
或者先计算把三维坐标转换成二维坐标,再按平面几何知识算。
aqqwrpggame 2010-01-23
  • 打赏
  • 举报
回复
我的思路是这样的:
1.已知点P(x1,y1), 线段的2端点A(x2,y2),B(x3,y3)
2.解:
1).求P到A,B2点的距离。长度分别是LPA, LPB
2).求与线段AB平行的单位向量(方向无所谓)V1.
3).求pA(或pB)在v1上的投影向量。L1(或L2)
4).根据L1,PA的长度可以得到P到直线AB的距离d=(LPA*LPA-L1*L1)^0.5
5).判断d,LPA,LPB这3个数那个最小,最小的就是p到AB的距离。

naturalwen 2010-01-23
  • 打赏
  • 举报
回复
if(a*a>=b*b+c*c)//--------图3-------- return b; 这里不太对,Pa和Pb又不成直角,怎么能用P到A的距离代替距离呢? if(b*b>=a*a+c*c)//--------图4------- return a; 也有同样的问题
mageclhj 2010-01-23
  • 打赏
  • 举报
回复
很有价值,受教!!!太感谢了!!!!
加载更多回复(119)
在有关算法的书中,有一些叙述非常严谨,但不够全面;另一些涉及了大量的题材,但又缺乏严谨性。本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。全书各章自成体系,可以作为独立的学习单元;算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂;说明和解释力浅显易懂,不失深度和数学严谨性。 --------------------------------------------------------------- 目录 Introduction to Algorithms, Third Edition 出版者的话 译者序 前言 第一部分 基础知识 第1章 算法在计算中的作用  1.1 算法  1.2 作为一种技术的算法  思考题  本章注记 第2章 算法基础  2.1 插入排序  2.2 分析算法  2.3 设计算法   2.3.1 分治法   2.3.2 分析分治算法  思考题  本章注记 第3章 函数的增长  3.1 渐近记号  3.2 标准记号与常用函数  思考题  本章注记 第4章 分治策略  4.1 最大子数组问题  4.2 矩阵乘法的Strassen算法  4.3 用代入法解递归式  4.4 用递归树方法解递归式  4.5 用主方法解递归式  4.6 证明主定理   4.6.1 对b的幂证明主定理   4.6.2 向下取整和向上取整  思考题  本章注记 第5章 概率分析和随机算法  5.1 雇用问题  5.2 指示器随机变量  5.3 随机算法  ?5.4 概率分析和指示器随机变量的进一步使用   5.4.1 生日悖论   5.4.2 球与箱子   5.4.3 特征序列   5.4.4 在线雇用问题  思考题  本章注记 第二部分 排序和顺序统计量 第6章 堆排序  6.1 堆  6.2 维护堆的性质  6.3 建堆  6.4 堆排序算法  6.5 优先队列  思考题  本章注记 第7章 快速排序  7.1 快速排序的描述  7.2 快速排序的性能  7.3 快速排序的随机化版本  7.4 快速排序分析   7.4.1 最坏情况分析   7.4.2 期望运行时间  思考题  本章注记 第8章 线性时间排序  8.1 排序算法的下界  8.2 计数排序  8.3 基数排序  8.4 桶排序  思考题  本章注记 第9章 中位数和顺序统计量  9.1 最小值和最大值  9.2 期望为线性时间的选择算法  9.3 最坏情况为线性时间的选择算法  思考题  本章注记 第三部分 数据结构 第10章 基本数据结构  10.1 栈和队列  10.2 链表  10.3 指针和对象的实现  10.4 有根树的表示  思考题  本章注记 第11章 散列表  11.1 直接寻址表  11.2 散列表  11.3 散列函数   11.3.1 除法散列法   11.3.2 乘法散列法   11.3.3 全域散列法  11.4 开放寻址法  11.5 完全散列  思考题  本章注记 第12章 二叉搜索树  12.1 什么是二叉搜索树  12.2 查询二叉搜索树  12.3 插入和删除  12.4 随机构建二叉搜索树  思考题  本章注记 第13章 红黑树  13.1 红黑树的性质  13.2 旋转  13.3 插入  13.4 删除  思考题  本章注记 第14章 数据结构的扩张  14.1 动态顺序统计  14.2 如何扩张数据结构  14.3 区间树  思考题  本章注记 第四部分 高级设计和分析技术 第15章 动态规划  15.1 钢条切割  15.2 矩阵链乘法  15.3 动态规划原理  15.4 最长公共子序列  15.5 最优二叉搜索树  思考题  本章注记 第16章 贪心算法  16.1 活动选择问题  16.2 贪心算法原理  16.3 赫夫曼编码  16.4 拟阵和贪心算法  16.5 用拟阵解任务调度问题  思考题  本章注记 第17章 摊还分析  17.1 聚合分析  17.2 核算法  17.3 势能法  17.4 动态表   17.4.1 表扩张   17.4.2 表扩张和收缩  思考题  本章注记 第五部分 高级数据结构 第18章 B树  18.1 B树的定义  18.2 B树上的基本操作  18.3 从B树中删除关键字  思考题  本章注记 第19章 斐波那契堆  19.1 斐波那契堆结构  19.2 可合并堆操作  19.3 关键字减值和删除一个结点  19.4 最大度数的界  思考题  本章注记 第20章 van Emde Boas树  20.1 基本方法  20.2 递归结构   20.2.1 原型van Emde Boas结构   20.2.2 原型van Emde Boas结构上的操作  20.3 van Emde Boas树及其操作   20.3.1 van Emde Boas树   20.3.2 van Emde Boas树的操作  思考题  本章注记 第21章 用于不相交集合的数据结构  21.1 不相交集合的操作  21.2 不相交集合的链表表示  21.3 不相交集合森林  *21.4 带路径压缩的按秩合并的分析  思考题  本章注记 第六部分 图算法 第22章 基本的图算法  22.1 图的表示  22.2 广度优先搜索  22.3 深度优先搜索  22.4 拓扑排序  22.5 强连通分量  思考题  本章注记 第23章 最小生成树  23.1 最小生成树的形成  23.2 Kruskal算法和Prim算法  思考题  本章注记 第24章 单源最短路径  24.1 Bellman?Ford算法  24.2 有向无环图中的单源最短路径问题  24.3 Dijkstra算法  24.4 差分约束和最短路径  24.5 最短路径性质的证明  思考题  本章注记 第25章 所有结点对的最短路径问题  25.1 最短路径和矩阵乘法  25.2 Floyd?Warshall算法  25.3 用于稀疏图的Johnson算法  思考题  本章注记 第26章 最大流  26.1 流网络  26.2 Ford\Fulkerson方法  26.3 最大二分匹配  26.4 推送重贴标签算法  26.5 前置重贴标签算法  思考题  本章注记 第七部分 算法问题选编 第27章 多线程算法  27.1 动态多线程基础  27.2 多线程矩阵乘法  27.3 多线程归并排序  思考题  本章注记 第28章 矩阵运算  28.1 解线性方程组  28.2 矩阵逆  28.3 对称正定矩阵和最小二乘逼近  思考题  本章注记 第29章 线性规划  29.1 标准型和松弛型  29.2 将问题表达为线性规划  29.3 单纯形算法  29.4 对偶性  29.5 初始基本可行解  思考题  本章注记 第30章 多项式与快速傅里叶变换  30.1 多项式的表示  30.2 DFT与FFT  30.3 高效FFT实现  思考题  本章注记 第31章 数论算法  31.1 基础数论概念  31.2 最大公约数  31.3 模运算  31.4 解模线性方程  31.5 中国余数定理  31.6 元素的幂  31.7 RSA公钥加密系统  31.8 素数的测试  31.9 整数的因子分解  思考题  本章注记 第32章 字符串匹配  32.1 朴素字符串匹配算法  32.2 Rabin\Karp算法  32.3 利用有限自动机进行字符串匹配  32.4 Knuth?Morris?Pratt算法  思考题  本章注记 第33章 计算几何学  33.1 线段的性质  33.2 确定任意一对线段是否相交  33.3 寻找凸包  33.4 寻找最近点对  思考题  本章注记 第34章 NP完全性  34.1 多项式时间  34.2 多项式时间的验证  34.3 NP完全性与可归约性  34.4 NP完全性的证明  34.5 NP完全问题   34.5.1 团问题   34.5.2 顶点覆盖问题   34.5.3 哈密顿回路问题   34.5.4 旅行商问题   34.5.5 子集和问题  思考题  本章注记 第35章 近似算法  35.1 顶点覆盖问题  35.2 旅行商问题  35.2.1 满足三角不等式的旅行商问题  35.2.2 一般旅行商问题  35.3 集合覆盖问题  35.4 随机化和线性规划  35.5 子集和问题  思考题  本章注记 第八部分 附录:数学基础知识 附录A 和  A.1 和公式及其性质  A.2 确定和时间的界  思考题  附录注记 附录B 集合等离散数学内容  B.1 集合  B.2 关系  B.3 函数  B.4 图  B.5 树   B.5.1 自由树   B.5.2 有根树和有序树   B.5.3 二叉树和位置树  思考题  附录注记 附录C 计数与概率  C.1 计数  C.2 概率 C.3 离散随机变量  C.4 几何分布与二项分布  *C.5 二项分布的尾部  思考题  附录注记 附录D 矩阵  D.1 矩阵与矩阵运算  D.2 矩阵基本性质  思考题  附录注记

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧