2012-07-22 39 views
2

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

collinear

回答

3

执行点C的正交投影线AB并找到投影点P:最接近C点线AB的。现在,您需要做的就是使用段CP的长度来确定C离线的距离。并且使用关于ABP的位置来确定C是否是“在”AB之间。

点到线上的正交投影是计算几何中的标准原始操作。举一个例子,参见Wolfram World

我会做这种方式:

  1. 线AB的法向量是(By - Ay, -(Bx - Ax))
  2. 加入这个向量指向C并获得点C'

    C'x = Cx + By - Ay 
    C'y = Cy - Bx + Ax 
    
  3. 找到线ABintersection和线CC'。交点是您的投影点P

4

Ç从线段AB 的距离的vector(A,C)cross_productunit_vector(A,B)length

也就是说(在伪代码),

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 

要找出Ç是否“之间” 一个就可以计算出dot_product(vector(A,C), unit_vector(A,B)),看看它是否比vector_length(A,B)小(但是积极的)。无论如何,你计算vector_length(A,B)作为计算unit_vector(A,B)的一部分。

这种方式在计算上效率最高。