Pronađite presjek dviju linija u Javi
1. Pregled
U ovom ćemo brzom uputstvu pokazati kako pronaći točku presjeka dviju linija definiranih linearnim funkcijama u obliku presjeka kosine.
2. Matematička formula presijecanja
Bilo koja ravna crta (osim okomite) na ravnini može se definirati linearnom funkcijom:
y = mx + b
gdje m je nagib i b je presjek y.
Za okomitu crtu, m bi bilo jednako beskonačnosti, zato ga i isključujemo. Ako su dvije crte paralelne, imaju isti nagib, to je jednaka vrijednost m.
Recimo da imamo dva retka. Prva funkcija definira prvi redak:
y = m1x + b1
A druga funkcija definira drugi redak:
y = m2x + b2
Želimo pronaći točku presjeka ovih linija. Očito je da jednadžba vrijedi za točku presjeka:
y1 = y2
Zamijenimo y-varijable:
m1x + b1 = m2x + b2
Iz gornje jednadžbe možemo pronaći x-Koordinirati:
x (m1 - m2) = b2 - b1 x = (b2 - b1) / (m1 - m2)
Konačno, možemo pronaći y-koordinatu točke presijecanja:
y = m1x + b1
Krenimo sada na provedbeni dio.
3. Implementacija Jave
Prvo, imamo četiri ulazne varijable - m1, b1 za prvi redak i m2, b2 za drugi redak.
Drugo, izračunatu točku presjeka pretvorit ćemo u objekt java.awt.Point tip.
Konačno, crte mogu biti paralelne, stoga napravimo vraćenu vrijednost Neobvezno:
javno Neobavezno izračunajIntersectionPoint (dvostruko m1, dvostruko b1, dvostruko m2, dvostruko b2) {if (m1 == m2) {return Izborno.empty (); } dvostruki x = (b2 - b1) / (m1 - m2); dvostruki y = m1 * x + b1; Točka točka = nova točka (); point.setLocation (x, y); return Neobvezno.of (point); }
Odaberite sada neke vrijednosti i testirajmo metodu za paralelne i neparalelne linije.
Na primjer, uzmimo x-os (y = 0) kao prvi redak, a redak definiran s y = x - 1 kao drugi redak.
Za drugu liniju, nagib m jednako je 1 što znači 45 stupnjeva i g-prekid je jednak -1 što znači da linija presijeca g-os u točki (0, -1).
Intuitivno je jasno da je točka presjeka druge crte s x-os mora biti (1,0):
Provjerimo.
Prvo, pobrinimo se da a Točka je prisutan, jer crte nisu paralelne, a zatim provjerite vrijednosti x i g:
@Test javna praznina givenNotParallelLines_whenCalculatePoint_thenPresent () {double m1 = 0; dvostruki b1 = 0; dvostruki m2 = 1; dvostruki b2 = -1; Neobvezna točka = service.calculateIntersectionPoint (m1, b1, m2, b2); assertTrue (point.isPresent ()); assertEquals (point.get (). getX (), 1, 0,001); assertEquals (point.get (). getY (), 0, 0,001); }
Na kraju, uzmimo dvije paralelne crte i provjerimo je li vraćena vrijednost prazna:
@Test javna praznina givenParallelLines_whenCalculatePoint_thenEmpty () {double m1 = 1; dvostruki b1 = 0; dvostruki m2 = 1; dvostruki b2 = -1; Neobvezna točka = service.calculateIntersectionPoint (m1, b1, m2, b2); assertFalse (point.isPresent ()); }
4. Zaključak
U ovom uputstvu pokazali smo kako izračunati točku presjeka dviju linija.
Kao i obično, cjeloviti izvorni kod dostupan je na GitHubu.