Есть ломаная (задана массивом точек) и нужно найти ломаную, огибающую исходную, наверное более понятно будет на рисунке (синяя - та, которую нужно построить):
Т.е, если построить ломаную по новым точкам, она должна повторять и огибать начальную. По каким формулам можно это посчитать, если задан двумерный массив с точками?
Для каждого узла 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
В общем случае на "огибающей ломаной" даже при отсутствии самопересечений базовой полилинии могут возникнуть петли и т.п. эффекты.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как сделать слайдер с бесконечной прокруткой, где при нажатии на правую стрелку, например, первый блок за пределами страницы перемещается...
Хочу реализовать следующий подход - подключать некоторые внешние скрипты только если на странице присутствуют DOM элементы использующие...
Найти минимальную дату из трех в формате ДДММ