如何检查点Cx3,y3是否落在由两个点Ax1,y1和Bx2,y2形成的直线之间

问题描述

我有两个点A(x1,y1)和B(x2,y2),我需要检查点c(x3,y3)是否落在由点A和B形成的直线上。

A ------ C -------------------- B然后是C在A和B之间

A --------------------------- B C
在第二种情况下,C不在A和B之间。

解决方法

使用复数,我们定义了一个相似性转换,将A映射到0,将B映射到1:

W = (Z - Za) / (Zb - Za)

然后Wc = (Zc - Za) / (Zb - Za)是一个复数,应具有零个或很小的虚数值,并且实数值应介于0和1之间。

,

制作两个向量

cax = x1 - x3
cay = y1 - y3

cbx = x2 - x3
cby = y2 - y3

并检查它们之间的夹角是否为Pi

计算这些向量的点和叉积

dot = cax * cbx + cay * cby
cross = cax * cby - cay * cbx

如果cross为零且dot为负,则点C位于AB段上

dot < 0
abs(cross) < eps

其中eps是小数值,例如1e-6,以补偿浮点计算错误。

,

如果确定所有三个点都对齐,则可以使用矢量AC和AB之间的点积,以及矢量BA和BC之间的点积。

提醒:向量AB =(xB-xA,yB-yA) 提醒:dot(AB,AC)= xAB xAC + yAB yAC

如果dot(AB,AC)> 0,则表示C从A向B方向 如果dot(BA,BC)> 0,则表示C从B指向A的方向 如果同时满足以上两个条件,则表示C在A和B之间