我有3分和他们的坐标。如果第三点位于创建直线并且靠近直线的位置之间,我想要找到其中两个之间的线。在图1中示出了我可以使用公式来查找点是否共线的情况。在图2中,A和B之间有一条直线。我想检查范围内的点,例如15px,并发现C点位于A和B之间,靠近该线并忽略D点,因为它很远从线上。
答案 0 :(得分:4)
点 C 与线段 AB 之间的距离是vector(A,C)
length的cross_product unit_vector(A,B)
}}。
也就是说(伪代码),
def vec_length(x,y) = sqrt(x*x + y*y)
def unitvec(ax,ay,bx,by) = (dx/m, dy/m)
where dx = bx - ax
dy = by - ay
m = vec_length(dx,dy)
def dist_segm(cx,cy,ax,ay,ux,uy) = abs( dx*uy - dy*ux )
where dx = cx - ax
dy = cy - ay
要确定 C 是否在“ A 和 B 之间”,您可以计算dot_product
( vector(A,C), unit_vector(A,B) )
和看它是否小于vector_length(A,B)
(但是积极的)。无论如何,您计算vector_length(A,B)
作为计算unit_vector(A,B)
的一部分。
这种方式效率最高。
答案 1 :(得分:3)
将点C
正交投影到线AB
上,找到投影点P
:距离线C
最近的AB
点。现在,您需要做的就是使用段CP
的长度来确定该行与C
的接近程度。并使用与P
和A
相关的B
位置来确定C
是否在“A
和B
之间”。
点到线上的正交投影是计算几何中的标准基元操作。有关示例,请参阅Wolfram World。
我这样做:
AB
的法线向量为(By - Ay, -(Bx - Ax))
将此向量添加到点C
并获取点C'
C'x = Cx + By - Ay
C'y = Cy - Bx + Ax
找到第AB
行的intersection和第CC'
行。交点是投影点P
。