问题描述
我有两个点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之间