用Delphi 向量算法 判断点是否在线上
2020-02-15 12:14
232 查看
用Delphi 向量算法 判断点是否在线上
Delphi 10.2 有一个向量数学单元
uses math.vector
就可以可以很方便地进行向量计算
向量单元介绍看这里 https://blog.csdn.net/vbfgm/article/details/79624096
周贵云提供了一个向量公式用于判断点与线的关系,非常简洁
点到线段的最短距离算法
http://blog.sina.com.cn/s/blog_5d5c80840101bnhw.html
使用他提供的公式,用delphi的向量单元,可以构建一个判断函数实现点与线段关系的判断
代码如下 //计算点是否在线上的向量方法,如果在线上,则算出中间点 function IsPointOnLine(pa,pb,pp:TPoint;var middle :TPoint;Tolerance:integer = 0):boolean; //http://blog.sina.com.cn/s/blog_5d5c80840101bnhw.html var va,vb,vp,vab,vap,vac,vpc,vmiddle:TVector; r:double; begin result := false; va :=vector(pa); //点转为二维向量 vb :=vector(pb); vp :=vector(pp); vab := vb-va; vap :=vp-va; vac := (vab.DotProduct(vap)/sqr(vab.Length))*vab; //求出ac 向量 vpc := vac-vap;//求出pc向量 r:= vac.Length/vab.Length; //计算r if (r >= 0) and (r<= 1) then // 如果落在线段上 if NewRoundTo(vpc.Length,-3) <= Tolerance then //那么就判断与线段的距离是否足够近 //length 总是非零的,这并非浮点数换算问题,而是屏幕上的线本身就是梯形连续而成,因此取整到千分之一 begin vmiddle :=va+vab/2; middle := PointF(vmiddle).Round;//计算中间点:向量转换为浮点数的屏幕点,在取整为屏幕点 result := true; end; end;
经过测试OK
- 点赞 20000
- 收藏
- 分享
- 文章举报
相关文章推荐
- Delphi 删除控件问题
- 继续Delphi调用Wcf
- Delphi 调用WCF 搞定啦
- Quick Report 说明 for delphi 7
- DELPHI7下用superobject读取中国天气网的JSON数据的天气预报
- 刚学 Delphi 请多指教
- delphi学习总结
- Delphi中的记录
- Delphi中的Free和Nil之理解
- delphi简单字符的加密与解密
- Delphi控件开发基础篇
- 关于DELPHI XE4 开发 IOS APP问题
- Delphi 封装(2)类的封装
- delphi中如何让主窗体在程序运行之初不显示
- 使用Delphi内置函数读写INI文件[转]
- delphi实现FTP上传与下载
- 关于Delphi中预编译指令的使用方法
- Delphi自动化控制Excel
- Delphi XE Refactor重构功能简单说明
- Delphi中Frame的使用方法