Содержит ли ваш GeneralPath линейные сегменты или квадратичные или безье сегменты?Это очень важно.Алгоритм для прямой линии является наиболее простым:
Итерации по всем точкам на пути.Если две последовательные точки находятся на противоположных сторонах линии, у вас есть потенциальное пересечение.Затем вам нужно проверить, находится ли конечная точка отрезка линии внутри или снаружи фигуры относительно потенциального пересечения, которое вы получаете, решая для пересечения двух точек (линии и линии, образованной двумя последовательными точками) и проверяя,результат содержится в вашем отрезке линии.
К сожалению, изогнутые пути могут иметь две последовательные точки с фигурной скобкой между ними ")", через которую ваша линия может проходить, сохраняя при этом итерируемые точки на одном и том жебоковая сторона.Если вы можете получить формат с двумя конечными точками и одной (двойной) контрольной (-ыми) точкой (-ами), которые образуют ограничивающий треугольник (четырехугольник), вы можете получить простые простые решения (поскольку кривая гарантированно помещается внутри сформированного треугольника / квадрата).по трем / четырем точкам, пока линия не пересекает треугольник / квад, у вас все хорошо).К сожалению, в этом есть и уродливая часть - если линия действительно пересекает треугольник / квад, вам ничего не гарантировано и вам нужно проверить ближе.Как дважды неудачно, я не знаю техники, кроме нормализации системы координат и решения для нулей.И это то, что я хотел бы найти в книге, которую я не могу найти (или подожду, пока не появится еще один красивый SO плакат).
... на самом деле, поскольку свойства кривизны фигуринвариант при вращении, для более близкой контрольной части вы можете просто повернуть точки кривой (3 или 4) для выравнивания по оси.Тогда сделай свой худой прямоугольник.Это, вероятно, не самый чистый, но это самый очевидный трюк.
Если подумать, почему бы не сделать вращение всех точек на первом месте?Вся проблема пересечения инвариантна относительно вращения.Это сэкономило бы много кода.Выровняйте линию по оси, примените преобразование к фигуре и сделайте трюк с нахальным прямоугольником.