3

ラインがポリゴンでインターセプトされているかどうかを確認する方法

4

4 に答える 4

3

質問は少しあいまいですが、とにかく試してみましょう:

線上の点 (x,y) が方程式 Ax + By + C = 0 で定義されていると仮定します。その場合、点 (x,y) が線上にあるかどうかは、Ax + By + C を評価することで明らかに判断できます。ポイントが線上にない場合、Ax + By + C の記号は、ポイントが線のどちら側にあるかを示します。したがって、多角形の各頂点 (x,y) の式 Ax + By + C の符号を検査することにより、多角形のすべての点が線の同じ側にあるかどうかを判断できます。

(少し異なる問題は、多角形が線分と交差するかどうかを判断することです。)

于 2009-05-08T04:48:41.250 に答える
3

いくつかのWebページにあるこの実装から合理的な答えを読むことができます

Point  * intersection2(Point * _line1, Point * _line2) {

Point  p1,p2,p3,p4;
p1=_line1[0]; p3=_line2[0];
p2=_line1[1]; p4=_line2[1];

// Store the values for fast access and easy
// equations-to-code conversion
double x1 = p1.x, x2 = p2.x, x3 = p3.x, x4 = p4.x;
double y1 = p1.y, y2 = p2.y, y3 = p3.y, y4 = p4.y;

double A1 = y2-y1;
double B1 = x1-x2;
double C1 = (A1*x1)+(B1*y1);

double A2 = y4-y3;
double B2 = x3-x4;
double C2 = A2*x3+B2*y3;

double det = A1*B2 - A2*B1;

if (det==0){
    return NULL;
}else{
    // Return the point of intersection
    Point  * ret = new CvPoint2D64f ();
    ret->x = (B2*C1 - B1*C2)/det;
    ret->y = (A1*C2 - A2*C1)/det;
    return ret;

}

}

参照。C++ の例: ジオメトリの概念 線の交点とその応用、2D 図面 サイト ucancode の lbackstrom による

于 2009-05-21T11:12:09.707 に答える
0

まさにあなたが望むものに応じて (今週そのコードを書いたばかりなので、線分を想定します)、2 つの部分に分けて取得できます。

まず、行を次のようにエンコードすることをお勧めします

a*X + b*Y - c = 0

そのフォームにはX=5、 、Y=4またはのような行のコーナーケースがないためX=3*Yです。

  • 線が多角形のいずれかの辺と交差するかどうかをテストします
    • 両方の線の端がもう一方の線の反対側にあるかどうかをテストします。提案された形式は、LHS の極性をチェックするだけでこれを簡単にします。
  • 線上の点が多角形の内側にあるかどうかをテストします
    • 入力ラインのあるポイントからポリゴンの外側までのラインが、奇数のポイントでポリゴンを横断するかどうかをテストします。複数の場所から同じポイントが表示されているかどうかを確認する必要があることに注意してください。FP エラーのため、これは完全一致テストでは実行できません。
于 2009-05-08T05:15:42.120 に答える
0

その情報を見つけるには、座標グラフ上の多角形の点と、線の傾きと x および y 切片が必要です。そこからは簡単な計算です。

于 2009-05-07T05:17:45.603 に答える