2013-03-06 51 views
0

目前我可以檢測點是否屬於用下面的代碼線段:如何檢測,如果點位於段

uint8_t point_lies_onSegment(const POINT2D *point, const POINT2D *linea, const POINT2D *lineb) { 
double slope, intercept; 
    double px, py; 
    double left, top, right, bottom; // Bounding Box For Line Segment 
    double dx, dy; 

px = point->x; 
py = point->y; 

dx = lineb->x - linea->x; 
dy = lineb->y - linea->y; 

    slope = dy/dx; 
    // y = mx + c 
    // intercept c = y - mx 
    intercept = linea->y - slope * linea->x; // which is same as y2 - slope * x2 

    // For Bounding Box 
    if(linea->x < lineb->x) { 
    left = linea->x; 
    right = lineb->x; 
    } else { 
    left = lineb->x; 
    right = linea->x; 
    } 
    if(linea->y < lineb->y) { 
    top = linea->y; 
    bottom = lineb->y; 
    } else { 
    top = linea->y; 
    bottom = lineb->y; 
    } 

    //"Equation of the line: %.2f X %c %.2f\n", slope, ((intercept < 0) ? ' ' : '+'), intercept; 

    if(slope * px + intercept > (py - FP_TOLERANCE) && 
    slope * px + intercept < (py + FP_TOLERANCE)) { 
     if(px >= left && px <= right && 
      py >= top && py <= bottom) { 
      return VG_TRUE; 
     } 
     else 
     return VG_FALSE; 
    } 
    else 
    return VG_FALSE; 
} 

但是,如果該行是垂直預期這是行不通的。 例如:

線段=(10,10) - (10,30) 點=(10,20)

此返回FALSE。

如何解決?

回答

1

如果該線是垂直的,則需要檢查相關點的x座標。如果該點的x座標與垂直線段的x座標相同,則檢查該點的y座標是否在垂直線段的y座標之間。

+0

我添加以下代碼: \t如果(FP_EQUALS(DX,0.0)){ \t \t如果(PY <= lineb->ý&& PY> = linea-> y)等 \t \t \t返回VG_TRUE; \t \t else \t \t \t return VG_FALSE; \t}它現在有效。謝謝。 – 2013-03-06 02:38:09

2

垂直線將導致您的程序除以零。我很驚訝你會得到任何輸出 - 我曾預料它只會崩潰。由於它不會崩潰,因此您可能會將NaN轉換爲slope,這會導致您的其他問題。例如,您可能想要使用與當前使用的算法不同的算法 - 例如,不要求您計算斜率。

+0

哪種算法不同? – 2013-03-06 01:51:48

+0

卡拉羅在他的回答中暗示了一個,還有很多其他人。我敢肯定,如果你有一點谷歌,你會打開一些東西。 – 2013-03-06 02:02:56

+0

我做了什麼卡拉羅建議和工作。謝謝。 – 2013-03-06 02:37:18