определить, находится ли линия полностью в форме path2d (в Java) - PullRequest
1 голос
/ 14 июня 2011

Я ищу самый простой / быстрый (в вычислительном отношении) способ определения того, содержит ли фигура, в частности объект GeneralPath, какой-либо заданный отрезок (типа Line2D.Double).

GeneralPath имеет методы, чтобы определить, содержится ли точка или прямоугольник , но не линия (которую я могу найти).Линия может быть наклонной, поэтому я не могу просто смоделировать действительно тонкий прямоугольник.Одна точка на линии обязательно будет внутри фигуры, но мне нужно проверить оставшуюся часть отрезка.Потенциально, я мог бы также проверить, пересекает ли линия какие-либо граничные ребра, но я не уверен, как это выглядело бы, просто учитывая форму и линию.

Ответы [ 2 ]

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

Содержит ли ваш GeneralPath линейные сегменты или квадратичные или безье сегменты?Это очень важно.Алгоритм для прямой линии является наиболее простым:

Итерации по всем точкам на пути.Если две последовательные точки находятся на противоположных сторонах линии, у вас есть потенциальное пересечение.Затем вам нужно проверить, находится ли конечная точка отрезка линии внутри или снаружи фигуры относительно потенциального пересечения, которое вы получаете, решая для пересечения двух точек (линии и линии, образованной двумя последовательными точками) и проверяя,результат содержится в вашем отрезке линии.

К сожалению, изогнутые пути могут иметь две последовательные точки с фигурной скобкой между ними ")", через которую ваша линия может проходить, сохраняя при этом итерируемые точки на одном и том жебоковая сторона.Если вы можете получить формат с двумя конечными точками и одной (двойной) контрольной (-ыми) точкой (-ами), которые образуют ограничивающий треугольник (четырехугольник), вы можете получить простые простые решения (поскольку кривая гарантированно помещается внутри сформированного треугольника / квадрата).по трем / четырем точкам, пока линия не пересекает треугольник / квад, у вас все хорошо).К сожалению, в этом есть и уродливая часть - если линия действительно пересекает треугольник / квад, вам ничего не гарантировано и вам нужно проверить ближе.Как дважды неудачно, я не знаю техники, кроме нормализации системы координат и решения для нулей.И это то, что я хотел бы найти в книге, которую я не могу найти (или подожду, пока не появится еще один красивый SO плакат).

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

Если подумать, почему бы не сделать вращение всех точек на первом месте?Вся проблема пересечения инвариантна относительно вращения.Это сэкономило бы много кода.Выровняйте линию по оси, примените преобразование к фигуре и сделайте трюк с нахальным прямоугольником.

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

Если я не пропустил что-то, почему вы не можете проверить, содержит ли путь x1, y1 и x2, y2 и AND два следующим образом:

generalPath.contains(line.getX1(),line.getY1()) &&
generalPath.contains(line.getX2(),line.getY2()) 
...