Путь в коридоре по пути и ширине линии - PullRequest
0 голосов
/ 16 мая 2018

Мне нужно написать функцию, которая генерирует путь коридора по пути и ширине линии.

Например, у меня есть массив координат полилинии:

var coords = [
  50, 50,
  150, 50,
  250, 100,
  220, 200,
  350, 100,
];

https://i.stack.imgur.com/FCCxb.png

Затем я использую функцию для получения пути коридора:

var width = 10;
var corridorPath = getCorridorPath(coords, width);

Функция должна возвращать что-то вроде этого:

[
  40, 50,
  50, 40,
  150, 40,
  157, 41,
  255, 90,
  260, 105,
  240, 170,
  340, 90,
  360, 90,
  360, 110,
  220, 215,
  205, 205,
  233, 107,
  147, 62,
  50, 60,
  40, 50,
]

https://i.stack.imgur.com/v3wxN.png

1 Ответ

0 голосов
/ 16 мая 2018

Рассчитать параллельные полилинии и соединения.

Для двух соседних ребер AB и BC найти нормализованные векторы ab и cb .

Рассчитать единицу вектора биссектрисы:

 b = (ab + cb).normalized

Рассчитать длину биссектрисы как

 len = d / sin(fi)

, где d - это смещение (половина ширины), а fi - это уголмежду векторами b и ab:

 fi = atan2(crossproduct(b,ab), dotproduct(b,ab))

Найдите точки смещения (левые и правые) как

B' = B + l * b
B'' = B - l * b

Обратите внимание, что вы хотите вырезать длинные треугольники, поэтому точка смещения действительна для стороныс острым углом, и вам нужно пересчитать две точки для срезанной крышки - например, получить центральную точку B''' = B - d * b и добавить векторы, перпендикулярные биссектрисе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...