2011-05-20 32 views
10

我有兩個點A和B,它們定義了設備屏幕上的線段加上另一個點C.使用易於編碼的高效和簡短算法(最好使用標準數學庫),我該如何檢查線段AB是否在距離C的距離R內?檢查線段距點

我知道有一種簡單的方法可以找到從一個點到一條線的最短距離,但它假設這條線是無限長的。我擁有的是具有兩個端點的線段。

我認爲這是在數學SE發佈,但決定不是因爲我不想得到所有這些長數學公式作爲答案在https://math.stackexchange.com/questions/2837/how-to-tell-if-a-line-segment-intersects-with-a-circle。我需要的是一個高效可讀的計算機算法,而不是一個正式的數學定理。

P/S:我有需要實現以下目的-C方法骨架:

由於從veredesmarald回答(我已經接受:

typedef struct { 
    CGPoint a; 
    CGPoint b; 
} CGLineSegment; 

+ (BOOL)isLineSegment:(CGLineSegment)line withinRadius:(CGFloat)radius fromPoint:(CGPoint)point { 

} 

隨溶液EDIT )我已經實現了這個方法,把它作爲其他人的參考:

+ (BOOL)isLineSegment:(CGLineSegment)line withinRadius:(CGFloat)radius fromPoint:(CGPoint)point { 
    CGPoint v = CGPointMake(line.b.x - line.a.x, line.b.y - line.a.y); 
    CGPoint w = CGPointMake(point.x - line.a.x, point.y - line.a.y); 
    CGFloat c1 = dotProduct(w, v); 
    CGFloat c2 = dotProduct(v, v); 
    CGFloat d; 
    if (c1 <= 0) { 
     d = distance(point, line.a); 
    } 
    else if (c2 <= c1) { 
     d = distance(point, line.b); 
    } 
    else { 
     CGFloat b = c1/c2; 
     CGPoint Pb = CGPointMake(line.a.x + b * v.x, line.a.y + b * v.y); 
     d = distance(point, Pb); 
    } 
    return d <= radius; 
} 

CGFloat distance(const CGPoint p1, const CGPoint p2) { 
    return sqrt(pow(p2.x - p1.x, 2) + pow(p2.y - p1.y, 2)); 
} 

CGFloat dotProduct(const CGPoint p1, const CGPoint p2) { 
    return p1.x * p2.x + p1.y * p2.y; 
} 
+0

在能夠將其翻譯爲代碼之前,您必須具備(並且最好理解!)涉及的數學。 – 2011-05-20 07:17:23

+0

@巴特基爾斯這是真的,但我正在尋找數學,而不是公式,正如我在我的問題中強調的那樣。我對簡單到中等幾何數學沒有問題。 – Lukman 2011-05-20 07:20:56

回答

7

當我不得不實施一個會議HOD確定爲圖形分配的時間間隔從一個點的距離,我找到了這個網頁內容非常豐富:About Lines and Distance of a Point to a Line

特別是,一個點的部分距離光線或段應該是你的興趣。從物品

僞代碼(其中·是點積和d()是兩個點之間的距離):

distance(Point P, Segment P0:P1) 
{ 
     v = P1 - P0 
     w = P - P0 
     if ((c1 = w·v) <= 0) 
      return d(P, P0) 
     if ((c2 = v·v) <= c1) 
      return d(P, P1) 
     b = c1/c2 
     Pb = P0 + bv 
     return d(P, Pb) 
} 

這種方法依賴於點積以確定該垂直的底部是的區間內,如果不是哪個終點更近。

+0

有趣的是,在另一個答案中描述的算法的這種實現看起來不像是這樣;-) +1,因爲它是正確的。 – danyowdee 2011-05-20 07:52:30

+0

它的工作原理!謝謝!我已經在問題中添加了我的objective-c實現,作爲其他人的參考:) – Lukman 2011-05-20 14:41:34