Страницы

Поиск по вопросам

понедельник, 25 февраля 2019 г.

Как по имеющимся координатам начала и конца двух линий узнать пересекаются ли они? Аналог Line2D.intersectsLine на Android

Дано:
Координаты 4 (A, B, C, D) точек на плоскости (int x, int y).
Задача:
Узнать пересекутся ли линии, A-B и C-D.
Проблема:
Как я понял из гугла, то в java есть класс Line2D, а у него метод intersectsLine(Line2D line) возвращающий то, что надо. Но в андроиде нема пакета java.awt.geom. Нашёл на gitHub порт библиотеки сей, но он древний и почти без звёзд и заброшен.
Вопрос:
Так таки есть ли готовые решения сей задачи или надо вспоминать геометрию и собирать велосипед?


Ответ

Вот вам код из java.awt.geom.Line2D.linesIntersect, он ссылается только на один метод java.awt.geom.Line2D.relativeCCW
public static boolean linesIntersect(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) {
boolean r1 = relativeCCW(x1, y1, x2, y2, x3, y3) * relativeCCW(x1, y1, x2, y2, x4, y4) <= 0;
boolean r2 = relativeCCW(x3, y3, x4, y4, x1, y1) * relativeCCW(x3, y3, x4, y4, x2, y2) <= 0; return r1 && r2; }
public static int relativeCCW(double x1, double y1, double x2, double y2, double px, double py) { x2 -= x1; y2 -= y1; px -= x1; py -= y1; double ccw = px * y2 - py * x2; if (ccw == 0.0) { ccw = px * x2 + py * y2; if (ccw > 0.0) { px -= x2; py -= y2; ccw = px * x2 + py * y2; if (ccw < 0.0) { ccw = 0.0; } } } return (ccw < 0.0) ? -1 : ((ccw > 0.0) ? 1 : 0); }

Комментариев нет:

Отправить комментарий