点在直线附近

3
我有三个点及其坐标。两个点之间有一条线,我想找到第三个点是否位于这条连线中间并且靠近这条线。在图1中,可以使用公式来确定点是否共线。在图2中,A和B之间有一条直线。我想检查范围内的点,比如说15像素,并找到点C是否在A和B之间,并且靠近这条线,而忽略点D,因为它离这条线很远。
2个回答

4
C点到线段AB的距离是向量(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

要判断C是否在AB之间,您可以计算点积(向量(A,C),单位向量(A,B))并查看它是否小于向量长度(A,B)(仍为正数)。在计算单位向量(A,B)时,您无论如何都要计算向量长度(A,B)。这是最高效的方法。

3
执行点 C 在线段 AB 上的正交投影,并找到投影点 P:线段 AB 上离点 C 最近的点。现在,您只需要使用线段 CP 的长度来确定点 C 离线段有多近。并使用 P 相对于 AB 的位置来确定点 C 是否处于 AB 之间。

将点投影到直线上是计算几何中的标准原始操作之一。请参见 Wolfram World 等网站以了解更多信息。

我会这样做:

  1. The normal vector of line AB is (By - Ay, -(Bx - Ax))
  2. Add this vector to point C and obtain point C'

    C'x = Cx + By - Ay
    C'y = Cy - Bx + Ax
    
  3. Find the intersection of line AB and line CC'. The intersection point is your projection point P.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接