3

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

共线

4

2 回答 2

4

C到线段AB的距离是与的积的长度vector(A,C)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是否“介于” AB之间,您可以计算并查看它是否小于(但为正)。作为计算的一部分,你无论如何都要计算。dot_product( vector(A,C), unit_vector(A,B) )vector_length(A,B)vector_length(A,B)unit_vector(A,B)

这种方式是计算效率最高的。

于 2012-07-23T06:19:52.173 回答
3

将点正交投影C到直线上AB,找到投影点P:距离C直线最近的点AB。现在,您需要做的就是使用线段的长度CP来确定C与线的距离。并使用P与关系到A和的位置B来确定是否C“介于”A和之间B

点到直线上的正交投影是计算几何中的标准基本操作。例如,参见Wolfram World

我会这样做:

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

    C'x = Cx + By - Ay
    C'y = Cy - Bx + Ax
    
  3. 找到line和 line的交点。交点就是你的投影点。ABCC'P

于 2012-07-23T02:29:32.847 回答