点放置在线附近

时间:2012-07-22 23:02:46

标签: math geometry line point

我有3分和他们的坐标。如果第三点位于创建直线并且靠近直线的位置之间,我想要找到其中两个之间的线。在图1中示出了我可以使用公式来查找点是否共线的情况。在图2中,A和B之间有一条直线。我想检查范围内的点,例如15px,并发现C点位于A和B之间,靠近该线并忽略D点,因为它很远从线上。

collinear

2 个答案:

答案 0 :(得分:4)

C 与线段 AB 之间的距离是vector(A,C) lengthcross_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的接近程度。并使用与PA相关的B位置来确定C是否在“AB之间”。

点到线上的正交投影是计算几何中的标准基元操作。有关示例,请参阅Wolfram World

我这样做:

  1. AB的法线向量为(By - Ay, -(Bx - Ax))
  2. 将此向量添加到点C并获取点C'

    C'x = Cx + By - Ay
    C'y = Cy - Bx + Ax
    
  3. 找到第AB行的intersection和第CC'行。交点是投影点P