2012-07-22 48 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)的一部分。

這種方式在計算上效率最高。