Я понял, как это сделать, но это сложно. Вот скриншот примера, который я сделал.
Мне понадобилось три класса для этого.
класс Line
, который описывает бесконечную линию с использованием коэффициентов a
, b
, c
для уравнения a*x+b*y+c=0
. Конструктор берет два PointF
и вычисляет коэффициенты. Линия имеет «центр», который является точкой, ближайшей к началу координат. Любая точка вдоль линии может быть описана как расстояние от «центра» вдоль направления линии.
класс LineSeg
, который описывает отрезок линии, определяя линию, а также начальное и конечное расстояние от центра линии (см. Выше).
class PolyLine
, который является просто набором LineSeg
и может быть инициализирован списком PointF
. Я добавил опцию для описания замкнутой ломаной линии, добавив отрезок к начальной точке в конце.
Смещение бесконечной линии вычисляется путем взятия точки на линии и ее перемещения в направлении, перпендикулярном линии, а затем расчета нового коэффициента c
через эту точку в том же направлении (c -> c + offset*sqrt(a^2+b^2)
). Результирующая бесконечная линия «обрезается» соседними линиями путем нахождения их точек пересечения.
Полностью объяснить сложно, но вы можете свободно изучать исходный код и задавать вопросы. Исходный код проекта доступен здесь .
ПРИМЕЧАНИЕ. Расстояние линии с уравнением a*x+b*y+c=0
до начала координат distance = c/sqrt(a^2+b^2)
. Таким образом, чтобы сместить линию, вам нужен новый c
, в результате чего новое расстояние будет distance+offset