2013-03-20 19 views
7

タイトルはそれをすべて言っている、私は周りを検索していたし、まっすぐでポイントに何かを見つけることができませんでした。どのようにして点(x1、y1)&(x2、y2)の線をとって、矩形(xR、yR)の交点を調べるのですか?私はLine2Dパッケージでいくつかの交差法があるが、それをすべて設定する方法がわからないことを知った。誰かが私に交差点(衝突)をチェックするための正しい設定方法を教えてもらえますか?線と四角形の交差を確認する方法は?

+0

* "ありがとう ダン" * sigを含めないでください。質問で。 「エリア」オブジェクト間の衝突は比較的容易に行うことができる。ここに[例](http://stackoverflow.com/a/14575043/418556)があります。 –

+0

警告。ほぼすべてのJava 2Dグラフィックオブジェクトに対して、JavaのAreaクラスを使用して衝突/交差検出を一般的に行うことができるため、すべてのグラフィックオブジェクトに使用できると思われがちです。しかし、それはできません。なぜなら、あなたが '行'の領域を構築すると、行自体の領域が空になるからです。そのため、たとえ線があなたの他の領域にまたがっても、他の領域との交差点は常に空に戻ります。あなたは警告されています! –

答えて

5

2DグラフィックスAPIの使用可能なクラスを使用します。

これはあなたを教えてくれない何
Rectangle r1 = new Rectangle(100, 100, 100, 100); 
Line2D l1 = new Line2D.Float(0, 200, 200, 0); 
System.out.println("l1.intsects(r1) = " + l1.intersects(r1)); 

は、線が交差していない場合

+0

ありがとう、私は知っている必要はありませんどこで、ちょうど彼らがやっていないかどうかを知る必要があります。 –

4

矩形は4行です。ラインと四角形の4ラインとの交差を計算することができます。

与えられた2つの線の方程式は、xとyが等しいときに交差します。方程式を解く

Y = M1X + B1 Y = M2X + B2

あなたが得る必要があります。

X = B2 - B1 /(M1 - M2)。

m1 == m2の場合、線は平行であり、交差しないことに注意してください。この場合は、0で除算されていることに注意してください。

次に、無限線よりも大きいセグメントを扱っているため、セグメント内で交差がなくなるかどうかを確認します(XとYの両方が各セグメントの境界内にあるかどうかを確認してください)。

+0

+1ちょうどいいように見えるので – MadProgrammer

+0

ありがとうございました:) あなたの答えでうまくいきません:)ありがとう –

+0

y = mx + c表現では縦線を扱うことができません。 – aaronsnoswell

4

はnullを返しところ...です。それをJavaにするために、同様の質問への別の応答からいくつかのCコードを修正しました。どのように/なぜそれがうまくいくのかを調べるのに気にしなかったが、私がそれを必要とした仕事はある。

static Point get_line_intersection(Line2D.Double pLine1, Line2D.Double pLine2) 
{ 
    Point 
     result = null; 

    double 
     s1_x = pLine1.x2 - pLine1.x1, 
     s1_y = pLine1.y2 - pLine1.y1, 

     s2_x = pLine2.x2 - pLine2.x1, 
     s2_y = pLine2.y2 - pLine2.y1, 

     s = (-s1_y * (pLine1.x1 - pLine2.x1) + s1_x * (pLine1.y1 - pLine2.y1))/(-s2_x * s1_y + s1_x * s2_y), 
     t = (s2_x * (pLine1.y1 - pLine2.y1) - s2_y * (pLine1.x1 - pLine2.x1))/(-s2_x * s1_y + s1_x * s2_y); 

    if (s >= 0 && s <= 1 && t >= 0 && t <= 1) 
    { 
     // Collision detected 
     result = new Point(
      (int) (pLine1.x1 + (t * s1_x)), 
      (int) (pLine1.y1 + (t * s1_y))); 
    } // end if 

    return result; 
} 
+0

ちょうどチェックしました。作品。 – Danon

関連する問題