我有三个点及其坐标。两个点之间有一条线,我想找到第三个点是否位于这条连线中间并且靠近这条线。在图1中,可以使用公式来确定点是否共线。在图2中,A和B之间有一条直线。我想检查范围内的点,比如说15像素,并找到点C是否在A和B之间,并且靠近这条线,而忽略点D,因为它离这条线很远。
A,C
)与单位向量(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
点积
(向量(A,C),单位向量(A,B))
并查看它是否小于向量长度(A,B)
(仍为正数)。在计算单位向量(A,B)
时,您无论如何都要计算向量长度(A,B)
。这是最高效的方法。C
在线段 AB
上的正交投影,并找到投影点 P
:线段 AB
上离点 C
最近的点。现在,您只需要使用线段 CP
的长度来确定点 C
离线段有多近。并使用 P
相对于 A
和 B
的位置来确定点 C
是否处于 A
和 B
之间。
将点投影到直线上是计算几何中的标准原始操作之一。请参见 Wolfram World 等网站以了解更多信息。
我会这样做:
AB
is (By - Ay, -(Bx - Ax))
Add this vector to point C
and obtain point C'
C'x = Cx + By - Ay
C'y = Cy - Bx + Ax
Find the intersection of line AB
and line CC'
. The intersection point is your projection point P
.