Nájdite križovatku dvoch línií v Jave
1. Prehľad
V tomto rýchlom návode si ukážeme ako nájsť priesečník dvoch priamok definovaných lineárnymi funkciami vo forme sklonu-zachytenia.
2. Matematický vzorec križovatky
Akákoľvek priamka (okrem zvislej) v rovine môže byť definovaná lineárnou funkciou:
y = mx + b
kde m je sklon a b je y-prechod.
Pre zvislú čiaru m by sa rovnal nekonečnu, preto ho vylučujeme. Ak sú dve priamky rovnobežné, majú rovnaký sklon, to je rovnaká hodnota m.
Povedzme, že máme dva riadky. Prvá funkcia definuje prvý riadok:
y = m1x + b1
A druhá funkcia definuje druhý riadok:
y = m2x + b2
Chceme nájsť priesečník týchto priamok. Je zrejmé, že rovnica platí pre priesečník:
y1 = y2
Nahraďme y-premenné:
m1x + b1 = m2x + b2
Z vyššie uvedenej rovnice môžeme nájsť X-súradnica:
x (m1 - m2) = b2 - b1 x = (b2 - b1) / (m1 - m2)
Nakoniec nájdeme súradnicu y priesečníka:
y = m1x + b1
Prejdime teraz k implementačnej časti.
3. Implementácia Java
Po prvé, máme štyri vstupné premenné - ml, b1 pre prvý riadok a m2, b2 pre druhý riadok.
Po druhé, prevedieme vypočítaný priesečník na objekt java.awt.Point typu.
Napokon môžu byť riadky rovnobežné, preto urobme vrátenú hodnotu Voliteľné:
verejné Voliteľné vypočítaťIntersectionPoint (dvojité m1, dvojité b1, dvojité m2, dvojité b2) {if (m1 == m2) {návrat Optional.empty (); } dvojité x = (b2 - b1) / (m1 - m2); dvojité y = m1 * x + b1; Bodový bod = nový Bod (); point.setLocation (x, y); návrat Optional.of (bod); }
Teraz poďme zvoliť niektoré hodnoty a otestovať metódu pre paralelné a neparalelné čiary.
Zoberme si napríklad X- os (y = 0) ako prvý riadok a riadok definovaný y = x - 1 ako druhý riadok.
Pre druhú líniu sklon m rovná sa 1 čo znamená 45 stupňov a r-intercept sa rovná -1 čo znamená, že čiara zachytáva r-osa v bode (0, -1).
Je intuitívne jasné, že priesečník druhej čiary s X-osa musí byť (1,0):
Poďme to skontrolovať.
Najskôr sa uistite, že a Bod je prítomné, pretože čiary nie sú rovnobežné, a potom skontrolujte hodnoty X a r:
@Test public void givenNotParallelLines_whenCalculatePoint_thenPresent () {double m1 = 0; dvojnásobok bl = 0; dvojitý m2 = 1; dvojnásobok b2 = -1; Voliteľný bod = service.calculateIntersectionPoint (m1, b1, m2, b2); assertTrue (point.isPresent ()); assertEquals (point.get (). getX (), 1, 0,001); assertEquals (point.get (). getY (), 0, 0,001); }
Na záver vezmime dve rovnobežné čiary a uistite sa, že je vrátená hodnota prázdna:
@Test public void givenParallelLines_whenCalculatePoint_thenEmpty () {double m1 = 1; dvojnásobok bl = 0; dvojitý m2 = 1; dvojnásobok b2 = -1; Voliteľný bod = service.calculateIntersectionPoint (m1, b1, m2, b2); assertFalse (point.isPresent ()); }
4. Záver
V tomto tutoriáli sme si ukázali, ako vypočítať priesečník dvoch priamok.
Celý zdrojový kód je ako obvykle k dispozícii na serveri GitHub.