Trova l'intersezione di due linee in Java

1. Panoramica

In questo rapido tutorial, mostreremo come trovare il punto di intersezione di due linee definite dalle funzioni lineari nella forma di intercetta di pendenza.

2. La formula matematica dell'intersezione

Qualsiasi linea retta (eccetto la verticale) su un piano può essere definita dalla funzione lineare:

y = mx + b

dove m è la pendenza eb è l'intercetta y.

Per una linea verticale, m sarebbe uguale a infinito, ecco perché lo escludiamo. Se due rette sono parallele, hanno la stessa pendenza, cioè lo stesso valore di m .

Diciamo che abbiamo due linee. La prima funzione definisce la prima riga:

y = m1x + b1

E la seconda funzione definisce la seconda riga:

y = m2x + b2

Vogliamo trovare il punto di intersezione di queste linee. Ovviamente l'equazione è vera per il punto di intersezione:

y1 = y2

Sostituiamo le variabili y :

m1x + b1 = m2x + b2

Dall'equazione sopra possiamo trovare la coordinata x :

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

Infine, possiamo trovare la coordinata y del punto di intersezione:

y = m1x + b1

Passiamo ora alla parte implementativa.

3. Implementazione Java

In primo luogo, abbiamo quattro variabili di input: m1, b1 per la prima riga e m2, b2 per la seconda riga.

In secondo luogo, convertiremo il punto di intersezione calcolato nell'oggetto di tipo java.awt.Point .

Infine, le linee possono essere parallele, quindi rendiamo il valore restituito Opzionale :

public Optional calculateIntersectionPoint( double m1, double b1, double m2, double b2) { if (m1 == m2) { return Optional.empty(); } double x = (b2 - b1) / (m1 - m2); double y = m1 * x + b1; Point point = new Point(); point.setLocation(x, y); return Optional.of(point); }

Ora scegliamo alcuni valori e testiamo il metodo per linee parallele e non parallele.

Ad esempio, prendiamo l' asse x ( y = 0 ) come prima riga e la riga definita da y = x - 1 come seconda riga.

Per la seconda linea, la pendenza m è uguale a 1 che significa 45 gradi, e l' intercetta y è uguale a -1, il che significa che la linea intercetta l' asse y nel punto (0, -1).

È intuitivo chiaro che il punto di intersezione della seconda linea con l' asse x deve essere (1,0 ):

Controlliamolo.

Innanzitutto, assicuriamoci che sia presente un punto , poiché le linee non sono parallele, quindi controlla i valori di x e y :

@Test public void givenNotParallelLines_whenCalculatePoint_thenPresent() { double m1 = 0; double b1 = 0; double m2 = 1; double b2 = -1; Optional point = service.calculateIntersectionPoint(m1, b1, m2, b2); assertTrue(point.isPresent()); assertEquals(point.get().getX(), 1, 0.001); assertEquals(point.get().getY(), 0, 0.001); }

Infine, prendiamo due linee parallele e assicuriamoci che il valore restituito sia vuoto:

@Test public void givenParallelLines_whenCalculatePoint_thenEmpty() { double m1 = 1; double b1 = 0; double m2 = 1; double b2 = -1; Optional point = service.calculateIntersectionPoint(m1, b1, m2, b2); assertFalse(point.isPresent()); }

4. Conclusione

In questo tutorial, abbiamo mostrato come calcolare il punto di intersezione di due linee.

Come al solito, il codice sorgente completo è disponibile su GitHub.