Zoek de kruising van twee lijnen in Java

1. Overzicht

In deze korte tutorial laten we het zien hoe het snijpunt van twee lijnen bepaald door de lineaire functies te vinden in het hellings-onderscheppingsformulier.

2. De wiskundige formule van kruispunt

Elke rechte lijn (behalve verticaal) op een vlak kan worden gedefinieerd door de lineaire functie:

y = mx + b

waar m is de helling en b is het y-snijpunt.

Voor een verticale lijn, m zou gelijk zijn aan oneindig, daarom sluiten we het uit. Als twee lijnen parallel zijn, hebben ze dezelfde helling, dat is dezelfde waarde van m.

Laten we zeggen dat we twee regels hebben. De eerste functie definieert de eerste regel:

y = m1x + b1

En de tweede functie definieert de tweede regel:

y = m2x + b2

We willen het snijpunt van deze lijnen vinden. Het is duidelijk dat de vergelijking waar is voor het snijpunt:

y1 = y2

Laten we vervangen y-variabelen:

m1x + b1 = m2x + b2

Uit de bovenstaande vergelijking kunnen we de X-coördineren:

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

Ten slotte kunnen we de y-coördinaat van het snijpunt vinden:

y = m1x + b1

Laten we nu verder gaan met het implementatiegedeelte.

3. Java-implementatie

Ten eerste hebben we vier invoervariabelen - m1, b1 voor de eerste regel, en m2, b2 voor de tweede regel.

Ten tweede zullen we het berekende snijpunt omzetten in het object van java.awt.Point type.

Ten slotte kunnen lijnen parallel zijn, dus laten we de geretourneerde waarde maken Optioneel:

public Optioneel berekenIntersectionPoint (dubbel m1, dubbel b1, dubbel m2, dubbel b2) {if (m1 == m2) {return Optioneel.empty (); } dubbele x = (b2 - b1) / (m1 - m2); dubbele y = m1 * x + b1; Punt punt = nieuw punt (); point.setLocation (x, y); return Optioneel.of (punt); }

Laten we nu enkele waarden kiezen en de methode testen voor parallelle en niet-parallelle lijnen.

Laten we bijvoorbeeld de X-as (y = 0) als de eerste regel, en de regel gedefinieerd door y = x - 1 als de tweede regel.

Voor de tweede regel, de helling m is gelijk aan 1 wat betekent 45 graden, en de y-intercept is gelijk aan -1 wat betekent dat de lijn de y-as in het punt (0, -1).

Het is intuïtief duidelijk dat het snijpunt van de tweede lijn met de X-as moet zijn (1,0):

Laten we eens kijken.

Laten we er eerst voor zorgen dat a Punt aanwezig is, aangezien de lijnen niet parallel zijn, en controleer vervolgens de waarden van X en y:

@Test openbare leegte gegevenNotParallelLines_whenCalculatePoint_thenPresent () {dubbele m1 = 0; dubbele b1 = 0; dubbel m2 = 1; dubbele b2 = -1; Optioneel punt = service.calculateIntersectionPoint (m1, b1, m2, b2); assertTrue (point.isPresent ()); assertEquals (point.get (). getX (), 1, 0.001); assertEquals (point.get (). getY (), 0, 0.001); }

Laten we tot slot twee parallelle lijnen nemen en ervoor zorgen dat de geretourneerde waarde leeg is:

@Test openbare leegte gegevenParallelLines_whenCalculatePoint_thenEmpty () {dubbele m1 = 1; dubbele b1 = 0; dubbel m2 = 1; dubbele b2 = -1; Optioneel punt = service.calculateIntersectionPoint (m1, b1, m2, b2); assertFalse (point.isPresent ()); }

4. Conclusie

In deze zelfstudie hebben we laten zien hoe u het snijpunt van twee lijnen kunt berekenen.

Zoals gewoonlijk is de volledige broncode beschikbaar op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found