如何检测点是否位于段

时间:2013-03-06 00:38:49

标签: c geometry computational-geometry

目前,我可以使用以下代码检测该点是否属于某个线段:

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) point =(10,20)

此返回FALSE。

如何解决?

2 个答案:

答案 0 :(得分:2)

垂直线将导致程序除以零。我很惊讶你得到任何输出 - 我原本预计它会崩溃。由于它没有崩溃,您可能会NaN进入slope,这会导致其他问题。您可能希望使用与当前使用的算法不同的算法 - 例如,不需要您计算斜率的算法。

答案 1 :(得分:1)

如果直线是垂直的,则需要检查相关点的x坐标。如果该点的x坐标与垂直线段的x坐标相同 - 那么检查该点的y坐标是否在垂直线段的y坐标之间。