Как сместить кубическую кривую Безье? - PullRequest
22 голосов
/ 10 ноября 2010

Я пытаюсь создать "параллельную" кривую Безье.В моих попытках я приблизился, но без сигары.Я пытаюсь сохранить твердое смещение в 1 пиксель между двумя кривыми (красным, синим).

current attempt

Моя главная цель - использовать алгоритм смещения по краям, чтобы увеличить / уменьшить SVGпуть.


Решение

Для всех, кто ищет решение, я создал версию AS3.

http://seant23.wordpress.com/2010/11/12/offset-bezier-curves/

Ответы [ 4 ]

10 голосов
/ 10 ноября 2010

Из википедии: (http://en.wikipedia.org/wiki/B%C3%A9zier_curve)

Кривая с фиксированным смещением от заданной кривой Безье, часто называемой кривой смещения (лежащей "параллельно" исходной кривой, как смещениемежду рельсами на железнодорожном пути), не может быть точно сформирована кривой Безье (за исключением некоторых тривиальных случаев).Тем не менее, существуют эвристические методы, которые обычно дают адекватное приближение для практических целей.

Вы также можете увидеть документ, указанный здесь: Схема обводки кубической кривой Безье

7 голосов
/ 03 апреля 2014

Надеюсь, вы нашли мою математическую статью полезной enter image description here

Квадратичное смещение Безье с выборочным делением http://microbians.com/?page=math

7 голосов
/ 12 ноября 2010

В общем случае невозможно представить смещение кубической кривой Безье в виде кубической кривой Безье (в частности, это проблематично, если у вас есть острые выступы или радиус кривизны, близкий к расстоянию смещения).Тем не менее, вы можете приблизить смещение к любому уровню точности.

Попробуйте это:

  • Смещение рассматриваемого Безье (что у вас уже выглядит довольно прилично)
  • Измерьте разницу между каждой исходной кривой и соответствующими кривыми смещения.Я бы попробовал что-то вроде 10 сэмплов и посмотрел бы, хорошо ли это работает.
  • Для любого смещения, выходящего за пределы допуска, подразделите (используя алгоритм deCastlejau для Безье) и повторите.Я не реализовал смещение (потому что в ядрах, которые я использую, оно уже есть), но это похоже на попытку.
5 голосов
/ 14 августа 2014

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

В общем случае для кривой Куба-Безье кривая смещения - это полином 10-го порядка!Источник: Килгард, с.28

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

Если вы хотите скрыть / приблизить кривые смещения, тогда бумага TUG на MetaFog для покрытия METAFONT шрифтами PostScript - хорошее чтение.Система METAFONT, которая предшествовала PostScript, позволяла описывать шрифты (более математически сложной) операцией обводки, но шрифты PostScript типа 1 позволяют использовать заливку (в отличие от чертежей PostScript в целом) из соображений скорости.

Другой алгоритм для аппроксимации смещений в виде (только двух) Безье (по одному на каждой стороне) с кодом на PostScript приведен в разделе 7 этой статьи Герно Хоффманна .(Полезный совет кому-то на форуме OpenGL, чтобы найти его.)

На самом деле таких алгоритмов много.Я нашел обзор 1997 различных алгоритмов для аппроксимации кривых смещения.Они предполагают, что кривыми прародителя являются Безье или NURBS.

...