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 を返します。

の解き方?

4

2 に答える 2

2

縦線があると、プログラムはゼロで除算されます。なんらかの出力が得られたことに驚いています。クラッシュするだけだと思っていました。クラッシュしていないため、 にNaN陥る可能性が高くslope、残りの問題が発生します。おそらく、現在使用しているアルゴリズムとは異なるアルゴリズムを使用したいと思うでしょう。たとえば、勾配を計算する必要がないものなどです。

于 2013-03-06T00:49:31.113 に答える
1

線が垂直の場合は、問題の点の x 座標を確認する必要があります。ポイントの x 座標が垂直線分の x 座標と同じ場合、ポイントの y 座標が垂直線分の y 座標の間にあるかどうかを確認します。

于 2013-03-06T00:49:47.527 に答える