您的位置:首页 > 编程语言 > Delphi

用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
  • 收藏
  • 分享
  • 文章举报
coastarica99 发布了1 篇原创文章 · 获赞 0 · 访问量 98 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: