0

重複の可能性:
2 つの線が交差しているかどうかを調べます

2 つの行が関数に渡された場合、それらが交差しているかどうかをどのように推測できますか? 各線は 2 つのオブジェクトの形をしているCPointので、合計で 4 つのポイントがあります。以下は私が思いついたものです。各線の傾きと Y 切片を計算し、それらから交点を計算します。次に、交点がセグメント上にあるかどうかを確認します。はいの場合は false を返します。いいえ、つまり交差しない場合は、true を返します。しかし、それは多くの問題を示しています。これを行うためのより簡単で効率的な方法はありますか?

注 :勾配と Y 切片に使用するデータ型がよくわかりませんでした。

bool CShortestPathFinderDoc::edgeTest(CPoint P,CPoint P2,CPoint E,CPoint E2)
{
 bool status=true;
 double m1,m2;  //slopes
     double b1,b2;     //y-intercepts
 double y,x;     //intersection point

 m1=((double)P.y-P2.y)/((double)P.x-P2.x);   
 m2=((double)E.y - E2.y)/( (double)E.x - E2.x);    

 if(m1 == m2)    //if lines are colinear
    return true;


 b1=P.y-(m1*P.x)                         // Get the..
 b2=E->y - (m2*E.x);            //    Y-intercepts.

 x=(b2-b1)/(m1-m2);
 y=m1*x + b1;         //x,y is the intersection point!!!

 if((x<P2.x && x>P.x))             //if intersection point lies on line!!!!!
  {
    if(P2.y > P.y)
        if(y<P2.y && y>P.y)
            status=false;
            if(P2.y < P.y)
        if(y<P.y && y>P2.y)
                status=false;       
  }

 return status;
 }
4

2 に答える 2

0

線分の交点が探しているものです。おそらく、必要に応じてスイープ ライン アルゴリズムを適応させることができます。

ところで: 上記のコード スニペットでは、2 つの 2D ラインが平行かどうかを調べるために、入力ポイントによって定義されたベクトルからスカラー積を計算するだけで済みます。

于 2013-01-23T13:11:52.120 に答える
0

Wolfram には必要なものがすべて揃っています。具体的には、Line-Line Distance、つまり行間の距離です。ラインがゼロ (+-イプシロン) の場合、それらは交差します。

于 2013-01-23T11:35:40.093 に答える