2013-03-20 27 views
7

Il titolo dice tutto, Ive ha cercato in giro e non riusciva a trovare nulla che fosse dritto e al punto. Come prendere una linea con punti (x1, y1) & (x2, y2) e controllare la sua intersezione tra un rettangolo (xR, yR)? Ho visto nel pacchetto Line2D che c'erano alcuni metodi di intersezione ma non sono sicuro di come impostare tutto. Qualcuno può mostrarmi un modo corretto di configurarlo per verificare l'intersezione (collisione)?Come controllare l'intersezione tra una linea e un rettangolo?

+0

* "Grazie Dan" * Non includere i sig. nelle domande La collisione tra gli oggetti 'Area' può essere eseguita in modo relativamente semplice. Ecco [un esempio] (http://stackoverflow.com/a/14575043/418556). –

+0

Avviso. Poiché è possibile utilizzare genericamente la classe Area di Java per eseguire il rilevamento di collisioni/intersezioni per quasi tutti gli oggetti grafici 2D di Java, si può essere tentati di pensare che possa essere utilizzato per TUTTI gli oggetti grafici. Ma non può essere - perché se costruisci un'area per una 'linea' l'area della linea stessa inizia vuota. Quindi l'intersezione con qualsiasi altra area restituisce sempre vuoto, anche se la linea attraversa l'altra area. Sei stato avvertito! –

risposta

5

Utilizzo delle classi disponibili dall'API grafica 2D.

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)); 

Ciò che questo non vi dice, è dove ...

+0

Grazie, non ho bisogno di sapere dove, ho solo bisogno di sapere se lo fanno o non lo fanno. –

4

Un rettangolo è di 4 righe. È possibile calcolare l'intersezione tra la linea e le 4 linee del rettangolo.

date le equazioni di due linee, si intersecerebbero quando x e y sono uguali.

y = M1X + b1 y = m2x + b2

risolvendo l'equazione si dovrebbe ottenere:

x = b2 - b1/(m1 - m2);

Si noti che se m1 == m2, le linee sono parallele e non si intersecano mai, in questo caso fare attenzione alla divisione per 0.

Quindi, dato che si tratta di segmenti più grandi di linee infinite, controllare se l'intersezione cade all'interno dei segmenti (controllare se sia X che Y rientrano nei limiti di ciascun segmento).

+0

+1 solo perché sembra così bello – MadProgrammer

+0

Grazie :) Gioco male con la tua risposta :) Grazie –

+0

È un po 'più complicato di così: la rappresentazione y = mx + c non può gestire le linee verticali. – aaronsnoswell

4

restituisce null se le linee non si intersecano. Modificato qualche codice c da un'altra risposta a una domanda simile per renderlo Java. Non si è preso la briga di guardare come/perché funziona, ma fa il lavoro di cui avevo bisogno.

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

Appena controllato. Lavori. – Danon