2012-10-16 69 views
4

的端點之間要找到如果點上包含兩個點的指定行我做以下檢查:查找點接近,該線

-(Boolean)isOnLine:(Line*) line point:(CGPoint) point{ 
    //If between two dots: 
    if (((line.first.x <= point.x && point.x <= line.last.x)||(line.first.x >= point.x && point.x >= line.last.x))&&((line.first.y<=point.y && point.y<= line.last.y)||(line.first.y>=point.y && point.y>=line.last.y))) {  
     //Calculate distance: 
     double dist = (((double)point.y - line.first.y))/(0.00001+((double)(point.x - line.first.x)))- ((double)(line.last.y - line.first.y))/(0.00001+((double)(line.last.x - line.first.x))); 
     NSLog(@"Dist to line: %f", fabs(dist)); 
     return fabs(dist) <0.5; 
    }else 
     return NO; 
    } 
} 

不知何故,但是,功能不與垂直線一起工作。我的猜測是if語句在某種意義上是無效的。

+0

只是一個快速的想法,有你雖然扭轉了這個問題,即,如果ydiff > xdiff交換x和y? –

回答

2

我沒有看到你的代碼仔細,所以我不完全知道你在做什麼,但FYI做此操作的最簡單方法是找到行的點的一端的距離,找到線的另一端到點的距離,然後添加這些距離並與線的長度進行比較。

喜歡的東西:

Boolean isOnLine(line, point) { 
    var dist1 = dist(line.first, point) 
    var dist2 = dist(line.last, point) 
    return abs(line.length - (dist1 + dist2)) < .5 
} 

對於我猜CoreGraphics中的DIST()函數的規定,但如果沒有它只是基本的三角。

+0

完美無瑕!謝謝 – developDavid

1

解釋爲什麼它不起作用是你正在比較兩個三角形角度的切線--儘管有註釋和變量名稱,但你根本沒有計算距離。

現在,作爲角度接近90度的正切的幅度增加迅速,直到它達到無窮大90度本身。在90度時,x座標的差值爲零,你最終會得到一個被零除錯誤的地方,它不會在0.00001常數中加入以避免它。雖然近90兩條切線之間的相對差異可能是小絕對差可以甚至非常接近的角度會很大,因此您< 0.5測試失敗。

所以,你需要另一種方法。一種是計算從點到兩個端點的距離以及線自身的長度,並比較 - 如果距離點的兩個距離的總和大於線的長度,則三個點形成三角形如果不是它們是共線的。 (如果總和不足,你已經陷入了另一個維度......)。

可以計算使用Pythagorus的線的長度:SQRT((X1 - X2)^ 2 +(Y1 - Y2)^ 2)。

2

下面是我實現的jhockings的解決方案

return abs([line length] - 
    (sqrt((line.first.x - point.x)*(line.first.x - point.x) 
    + (line.first.y - point.y)*(line.first.y - point.y)) 
    + sqrt((line.last.x - point.x)*(line.last.x - point.x) 
    + (line.last.y - point.y)*(line.last.y - point.y)))) < .5; 
2

另一個(我)實現@jhocking解決方案:

- (BOOL)isPoint:(CGPoint)origin nearToLineSegmentPointA:(CGPoint)pointA pointB:(CGPoint)pointB withMarginOfError:(CGFloat)marginOfError { 
    CGFloat distanceAP = [self distanceBetweenPointA:origin pointB:pointA]; 
    CGFloat distanceBP = [self distanceBetweenPointA:origin pointB:pointB]; 
    CGFloat distanceAB = [self distanceBetweenPointA:pointA pointB:pointB]; 

    if (fabsf(distanceAB - distanceAP - distanceBP) < marginOfError) { 
     return YES; 
    } else { 
     return NO; 
    } 
} 

- (CGFloat)distanceBetweenPointA:(CGPoint)pointA pointB:(CGPoint)pointB { 
    return sqrtf(powf((pointA.x - pointB.x), 2.f) + powf((pointA.y - pointB.y), 2.f)); 
} 
+0

太棒了,適合我。 –