Calcola la distanza tra due punti in Java

1. Panoramica

In questo rapido tutorial, mostreremo come calcolare la distanza tra due punti in Java.

2. La formula matematica della distanza

Supponiamo di avere due punti su un piano: il primo punto A ha le coordinate (x1, y1) e il secondo punto B ha le coordinate (x2, y2). Vogliamo calcolare AB, la distanza tra i punti.

Per prima cosa, costruiamo un triangolo rettangolo con l'ipotenusa AB:

Secondo il teorema di Pitagora, la somma dei quadrati delle lunghezze delle gambe del triangolo è uguale al quadrato della lunghezza dell'ipotenusa del triangolo: AB2 = AC2 + CB2 .

In secondo luogo, calcoliamo AC e CB.

Ovviamente:

AC = y2 - y1

Allo stesso modo:

BC = x2 - x1

Sostituiamo le parti dell'equazione:

distance * distance = (y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1)

Infine, dall'equazione sopra possiamo calcolare la distanza tra i punti:

distance = sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1))

Passiamo ora alla parte implementativa.

3. Implementazione Java

3.1. Utilizzando Plain Formula

Sebbene i pacchetti java.lang.Math e java.awt.geom.Point2D forniscano soluzioni pronte, per prima cosa implementiamo la formula sopra così com'è:

public double calculateDistanceBetweenPoints( double x1, double y1, double x2, double y2) { return Math.sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1)); }

Per testare la soluzione, prendiamo il triangolo con le gambe 3 e 4 (come mostrato nell'immagine sopra). È chiaro che il numero 5 è adatto come valore dell'ipotenusa:

3 * 3 + 4 * 4 = 5 * 5

Controlliamo la soluzione:

@Test public void givenTwoPoints_whenCalculateDistanceByFormula_thenCorrect() { double x1 = 3; double y1 = 4; double x2 = 7; double y2 = 1; double distance = service.calculateDistanceBetweenPoints(x1, y1, x2, y2); assertEquals(distance, 5, 0.001); }

3.2. Utilizzo del pacchetto java.lang.Math

Se il risultato della moltiplicazione nel metodo prepareDistanceBetweenPoints () è troppo grande, può verificarsi un overflow. A differenza di questo, il metodo Math.hypot () impedisce l'overflow o l'underflow intermedio:

public double calculateDistanceBetweenPointsWithHypot( double x1, double y1, double x2, double y2) { double ac = Math.abs(y2 - y1); double cb = Math.abs(x2 - x1); return Math.hypot(ac, cb); }

Prendiamo gli stessi punti di prima e controlliamo che la distanza sia la stessa:

@Test public void givenTwoPoints_whenCalculateDistanceWithHypot_thenCorrect() { double x1 = 3; double y1 = 4; double x2 = 7; double y2 = 1; double distance = service.calculateDistanceBetweenPointsWithHypot(x1, y1, x2, y2); assertEquals(distance, 5, 0.001); }

3.3. Utilizzo del pacchetto java.awt.geom.Point2D

Infine, calcoliamo la distanza con il metodo Point2D.distance () :

public double calculateDistanceBetweenPointsWithPoint2D( double x1, double y1, double x2, double y2) { return Point2D.distance(x1, y1, x2, y2); }

Ora testiamo il metodo allo stesso modo:

@Test public void givenTwoPoints_whenCalculateDistanceWithPoint2D_thenCorrect() { double x1 = 3; double y1 = 4; double x2 = 7; double y2 = 1; double distance = service.calculateDistanceBetweenPointsWithPoint2D(x1, y1, x2, y2); assertEquals(distance, 5, 0.001); }

4. Conclusione

In questo tutorial, abbiamo mostrato alcuni modi per calcolare la distanza tra due punti in Java.

Come sempre, il codice utilizzato negli esempi è disponibile su GitHub.