У меня есть общая геометрия линейных линий, которая мне нужна для рисования спиралей. Сама линейная линия может пересекать себя в некоторых точках, но мне просто нужно свернуть вокруг внешней , а не в отверстиях, проведенных самой базовой линией.
Я думал, что смогу попробовать это, используя jsts.operation.buffer.BufferOp.bufferOp
( JSTS 2.0.3 ), например:
- Вычислить буфер на расстоянии dist от исходной строки (углы не должны быть скруглены, наоборот, чем резче, тем лучше).
- Получить последовательность координат внешнего кольца из вычисленной геометрии буфера.
- Сшивание спирали, вычисленной до сих пор (которая начинается с исходной линейной линии), к вычисленному внешнему кольцу, избегая при этом повторной вставки начальной / конечной точки (фактически, последний сегмент, соединяющий кольцо, наносит ущерб моей цели рисования спираль).
- Сполосните и повторите.
Если оставить в стороне "сшивающую" часть, у меня проблема с последовательностью координат в линейном кольце. Мне бы хотелось, чтобы начальная (или конечная) точка линейного кольца была несколько «близкой» к одному из концов основной линии, но результирующая последовательность (экспортированная как WKT и отрисованная через postgis) показывает отсутствие немного правее моей исходной строки (на самом деле, при навигации по источникам я заметил вызов некоторого subgraph.getRightmostCoordinate()
во время вычисления геометрии буфера, который, я думаю, может быть связан). Это означает, что Я не могу полагаться на последовательность, полученную методом JSTS getExteriorRing()
на его буферных полигонах , но мне нужно перемещаться и манипулировать им.
В частности, мне нужно:
- Удалите дублирующую начальную / конечную точку в последовательности (поэтому я не буду обрабатывать точку дважды).
- Получите точку в последовательности внешнего кольца буфера, которая является ближайшей к точке, к которой я намерен прошить последовательность.
- Понять ориентацию последовательности внешнего кольца буфера, возможно, чтобы обратить ее вспять, чтобы спираль продолжала двигаться в намеченном направлении.
Номер 1 тривиален.
Номер 2, я думал, что получу точку в последовательности, расстояние до точки стежка которой ближе всего к предполагаемому радиусу (т.е. предполагаемому расстоянию между шпилями), хотя это вызывает проблему выбора между возможно более чем одной точкой , которая связана с третьей проблемой.
Номер 3 звучит вычислительно дорого и неоднозначно, поскольку я не уверен, что существует даже однозначный способ определения «по часовой стрелке» в некоторых геометриях (например, в буфере, построенном вокруг линии в форме раковины улитки).
Мне не нужно, чтобы кривые на моей спирали были закруглены (на самом деле, чем резче, тем лучше), и подходы к этой проблеме могут быть лучше, чем использование буферной функции. Я был склонен использовать это, потому что мне нравится, как он обрабатывает неправильную геометрию при увеличении радиуса буфера, «поглощая» геометрию в большем многоугольнике, если область буфера будет пересекать базовый многоугольник в другом участке.