Намерете пресичането на две линии в Java

1. Общ преглед

В този бърз урок ще покажем как да намерим точката на пресичане на две линии, дефинирани от линейните функции във формата на пресичане на наклон.

2. Математическата формула на пресичането

Всяка права линия (с изключение на вертикална) на равнина може да бъде дефинирана от линейната функция:

y = mx + b

където m е наклонът, а b е y-пресечната точка.

За вертикална линия m би било равно на безкрайност, затова го изключваме. Ако две линии са успоредни, те имат един и същ наклон, което е една и съща стойност на m .

Да кажем, че имаме два реда. Първата функция определя първия ред:

y = m1x + b1

И втората функция определя втория ред:

y = m2x + b2

Искаме да намерим точката на пресичане на тези линии. Очевидно уравнението е вярно за точката на пресичане:

y1 = y2

Нека заместим y- променливи:

m1x + b1 = m2x + b2

От горното уравнение можем да намерим координатата x :

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

И накрая, можем да намерим y-координата на точката на пресичане:

y = m1x + b1

Нека сега преминем към частта за изпълнение.

3. Внедряване на Java

Първо, имаме четири входни променливи - m1, b1 за първия ред и m2, b2 за втория ред.

На второ място, ще преобразуваме изчислената точка на пресичане в обекта от типа java.awt.Point .

И накрая, редовете могат да бъдат успоредни, следователно нека направим върнатата стойност по избор :

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); }

Сега нека да изберем някои стойности и да тестваме метода за паралелни и непаралелни линии.

Например, нека вземем x- оста ( y = 0 ) като първи ред, а линията, дефинирана от y = x - 1, като втори ред.

За втората линия наклонът m е равен на 1, което означава 45 градуса, а y -прихващането е равно на -1, което означава, че линията пресича оста на y в точката (0, -1).

Интуитивно е ясно, че точката на пресичане на втората линия с оста x трябва да бъде (1,0 ):

Нека го проверим.

Първо, нека се уверим, че има точка , тъй като линиите не са успоредни, и след това проверете стойностите на x и 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); }

И накрая, нека вземем две успоредни линии и се уверете, че върнатата стойност е празна:

@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. Заключение

В този урок показахме как да изчислим точката на пресичане на две линии.

Както обикновено, пълният изходен код е достъпен в GitHub.