Как найти точку на расстоянии d от прямой?

156
01 июня 2019, 20:40

Есть ломаная (задана массивом точек) и нужно найти ломаную, огибающую исходную, наверное более понятно будет на рисунке (синяя - та, которую нужно построить):

Т.е, если построить ломаную по новым точкам, она должна повторять и огибать начальную. По каким формулам можно это посчитать, если задан двумерный массив с точками?

Answer 1

Для каждого узла P найти векторы соседних рёбер и определить единичные нормали na, nb к ним, направленные в одну сторону относительно полилинии (пусть она называется внешней).

Построить внешний вектор биссектрисы как сумму нормалей, нормализовать его

  bis = na + nb
  bis = bis / Length(bis)

Чтобы обеспечить нужное расстояние d до новых сегментов, длина биссектрисы l должна быть

   l = d / Cos(fi/2)

где fi - угол между нормалями

 fi = atan2(crossproduct(na,nb), dotproduct(na,nb))

Вариант без тригонометрии:

Cos(fi/2) = Sqrt(1+dotproduct(na,nb)) или 
l = d / Sqrt(1+dotproduct(na,nb))

И наконец узел новой полилинии:

 P' = P + l * bis

В общем случае на "огибающей ломаной" даже при отсутствии самопересечений базовой полилинии могут возникнуть петли и т.п. эффекты.

READ ALSO
Слайдер с бесконечной прокруткой

Слайдер с бесконечной прокруткой

Как сделать слайдер с бесконечной прокруткой, где при нажатии на правую стрелку, например, первый блок за пределами страницы перемещается...

143
Подгрузка внешних JS скриптов “по событию”

Подгрузка внешних JS скриптов “по событию”

Хочу реализовать следующий подход - подключать некоторые внешние скрипты только если на странице присутствуют DOM элементы использующие...

149
Найти минимальную дату из трех в формате ДД.ММ.ГГГГ?

Найти минимальную дату из трех в формате ДД.ММ.ГГГГ?

Найти минимальную дату из трех в формате ДДММ

168