Прямоугольная спираль с JSTS - PullRequest
0 голосов
/ 05 марта 2019

У меня есть общая геометрия линейных линий, которая мне нужна для рисования спиралей. Сама линейная линия может пересекать себя в некоторых точках, но мне просто нужно свернуть вокруг внешней , а не в отверстиях, проведенных самой базовой линией.

Я думал, что смогу попробовать это, используя jsts.operation.buffer.BufferOp.bufferOp ( JSTS 2.0.3 ), например:

  • Вычислить буфер на расстоянии dist от исходной строки (углы не должны быть скруглены, наоборот, чем резче, тем лучше).
  • Получить последовательность координат внешнего кольца из вычисленной геометрии буфера.
  • Сшивание спирали, вычисленной до сих пор (которая начинается с исходной линейной линии), к вычисленному внешнему кольцу, избегая при этом повторной вставки начальной / конечной точки (фактически, последний сегмент, соединяющий кольцо, наносит ущерб моей цели рисования спираль).
  • Сполосните и повторите.

Если оставить в стороне "сшивающую" часть, у меня проблема с последовательностью координат в линейном кольце. Мне бы хотелось, чтобы начальная (или конечная) точка линейного кольца была несколько «близкой» к одному из концов основной линии, но результирующая последовательность (экспортированная как WKT и отрисованная через postgis) показывает отсутствие немного правее моей исходной строки (на самом деле, при навигации по источникам я заметил вызов некоторого subgraph.getRightmostCoordinate() во время вычисления геометрии буфера, который, я думаю, может быть связан). Это означает, что Я не могу полагаться на последовательность, полученную методом JSTS getExteriorRing() на его буферных полигонах , но мне нужно перемещаться и манипулировать им.

В частности, мне нужно:

  1. Удалите дублирующую начальную / конечную точку в последовательности (поэтому я не буду обрабатывать точку дважды).
  2. Получите точку в последовательности внешнего кольца буфера, которая является ближайшей к точке, к которой я намерен прошить последовательность.
  3. Понять ориентацию последовательности внешнего кольца буфера, возможно, чтобы обратить ее вспять, чтобы спираль продолжала двигаться в намеченном направлении.

Номер 1 тривиален.

Номер 2, я думал, что получу точку в последовательности, расстояние до точки стежка которой ближе всего к предполагаемому радиусу (т.е. предполагаемому расстоянию между шпилями), хотя это вызывает проблему выбора между возможно более чем одной точкой , которая связана с третьей проблемой.

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

Мне не нужно, чтобы кривые на моей спирали были закруглены (на самом деле, чем резче, тем лучше), и подходы к этой проблеме могут быть лучше, чем использование буферной функции. Я был склонен использовать это, потому что мне нравится, как он обрабатывает неправильную геометрию при увеличении радиуса буфера, «поглощая» геометрию в большем многоугольнике, если область буфера будет пересекать базовый многоугольник в другом участке.

...