Подтвердить что ты не робот

Как компенсировать кубическую кривую безье?

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

current attempt

Моя основная цель - использовать алгоритм смещения ребер для расширения/сжатия пути svg.


Решение

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Попробуйте следующее:

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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