Java - Линия, растягивающаяся от (a, b) до (c, d), касается точки (x, y)? - PullRequest
5 голосов
/ 08 июня 2011

Я пишу инструмент на Java, который немного рисует на объекте Графика .

Но я застрял в проблеме, которую не знаю, как решить. Надеюсь, что кто-то может помочь.

Как определить, касается ли точка x, y на графическом объекте линии, которая простирается, например, от 200 200 до 392 144?

Звучит просто, но я в тупике ... помогите!

Ответы [ 7 ]

7 голосов
/ 08 июня 2011

Это на самом деле не имеет ничего общего с объектом Graphics. Это просто простая математика.

Ваша строка примера имеет формулу

1006 *http://hypftier.de/dump/SO-6276361-1.png

с t в [0, 1]. Итак, чтобы узнать, находится ли точка на прямой, просто решите систему линейных уравнений

1013 *http://hypftier.de/dump/SO-6276361-2.png

Если t одинаково для обоих уравнений в системе и между 0 и 1, у вас есть решение. Так что вам нужно рассчитать:

1022 *http://hypftier.de/dump/SO-6276361-3.png

Пока моя математика не подведет меня; это было какое-то время.

2 голосов
/ 08 июня 2011

Уже есть правильные ответы, но я думаю, что было бы более полезно иметь формулу, которая дает расстояние от любой точки до указанной линии. Затем вы можете просто проверить, равен ли он нулю, или в пределах любого допустимого отклонения. Следующее должно работать независимо от особых случаев, таких как вертикальные линии (бесконечный градиент).

Расстояние точки X от линии AB равно

1009 *http://hypftier.de/dump/SO-6276361-Ben-1.png

, где A , B и X - трехмерные векторы положения трех точек (просто установите z = 0, если вы работают только в 2D) и x - векторное произведение. Это приходит к

1024 *http://hypftier.de/dump/SO-6276361-Ben-2.png

, где A = (a, b), B = (c, d) и X = (x, y). Затем, чтобы проверить, что точка на самом деле находится внутри отрезка, а не где-нибудь еще на бесконечной линии, вы можете использовать скалярные произведения: расстояние X вдоль линии от A до B is

1041 *http://hypftier.de/dump/SO-6276361-Ben-3.png

т.е. * * тысяча сорок-четырь

1046 *http://hypftier.de/dump/SO-6276361-Ben-4.png

и это должно быть между 0 и http://hypftier.de/dump/SO-6276361-Ben-5.png

2 голосов
/ 08 июня 2011

Вы можете составить уравнение линии, соединяющей две точки.

Уравнение строки: y = mx+c

м - градиент: m = (y2-y1)/(x2-x1);

c - это y-перехват: c = y1 - m * x1;

Получив уравнение, вы можете проверить, лежит ли какая-либо точка на линии, подключив ее x-координату и проверив, совпадает ли y-координата из уравнения.

1 голос
/ 08 июня 2011
0 голосов
/ 08 июня 2011

Line2D API поможет вам. Смотрите метод ptLineDist (двойной PX, двойной PY). Возвращает 0.0, если точка лежит на прямой.

0 голосов
/ 08 июня 2011

Математически вы можете найти наклон двух точек и сравнить с наклоном новой точки для каждой из старых точек.

В Java вы можете использовать Line2D.contains (double x, double y);

Редактировать: люди в стеке переполнены так быстро. : -)

0 голосов
/ 08 июня 2011

Похоже, вам нужно найти уравнение линии между двумя точками.Оттуда вы можете использовать это уравнение, чтобы доказать, что если ваша точка коснется линии.Уравнение линии обычно записывается в виде y = mx + b, где m - наклон, а b - пересечение y.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...