2009-08-30 44 views

答えて

4

このコードは、このトリックを行う必要があります。線が辺と交差する場所を確認し、それが正方形の幅内にあるかどうかを確認します。 intesectionの数が返されます。

float CalcY(float xval, float x0, float y0, float x1, float y1) 
{ 
    if(x1 == x0) return NaN; 
    return y0 + (xval - x0)*(y1 - y0)/(x1 - x0); 
} 

float CalcX(float yval, float x0, float y0, float x1, float y1) 
{ 
    if(x1 == x0) return NaN; 
    return x0 + (yval - y0)*(y1 - y0)/(x1 - x0); 
} 

int LineIntersectsSquare(int x0, int y0, int x1, int y1, int left, int top, int right, int bottom) 
{ 
    int intersections = 0; 
    if(CalcX(bottom, x0, y0, x1, y1) < right && CalcX(bottom, x0, y0, x1, y1) > left ) intersections++; 
    if(CalcX(top , x0, y0, x1, y1) < right && CalcX(top , x0, y0, x1, y1) > left ) intersections++; 
    if(CalcY(left , x0, y0, x1, y1) < top && CalcY(left , x0, y0, x1, y1) > bottom) intersections++; 
    if(CalcY(right , x0, y0, x1, y1) < top && CalcY(right , x0, y0, x1, y1) > bottom) intersections++; 
    return intersections; 
} 

NB:このコードは、理論的であり、それは

+1

私はCalcXがx0 +(yval - y0)*(x1 - x0)/(y1 - y0)を返す必要があると思います。 –

1

これは、ベクトルをキャストして交差する辺の数を数えることで実行できます。

交差するエッジが偶数の場合は、オブジェクトの外側にあり、交差するエッジが奇数の場合は内側です。

これはすべての閉じたポリゴンで機能します。

+0

しかし、問題は、線が矩形に含まれているかどうかではなく、線と矩形が交差するかどうかです。 – Eric

+0

その場合は、エッジを探すだけです。 – FlySwat

+0

最初は何をしなければならなかったか。元の質問は、 "線が四角形のどの辺と交差しているかをどうすれば確認できますか?"そして、あなたはちょうど "どんな縁を探す"と言った。 – Eric

0

をテストされていないと、正しくない可能性があります。ここの方法だ:
- X-COORD
で四角の頂点を並べ替えます - X-COORD
によって線の終点ソート - (X-COORDによって)真ん中の2つの各ラインのMINX端から角度を計算する正方形の頂点を
- ライン
の角度を計算する - 行のif角度は可能な範囲内ですあなたがしなければならないのは、長さのチェックです。ラインのmaxXの終わり>正方形のminXの頂点です。

この場合、正方形が線に直接面していると、正方形の最初の辺を確認してください。

関連する問題