2010-11-10 17 views
18

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

current attempt

Моя главная цель использовать край offseting Algorythm для расширения/сжатия путь SVG.


Решение

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

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

+0

Чистая гипотеза, никогда не сделавшая этого сама, но можете ли вы просто скопировать кривую после того, как она будет отображаться как «изображение», и просто перерисовать ее новым цветом при предпочтительном смещении? – warren

+0

@warren Он не сохранит смещение 1px –

+0

, если вы нарисуете кривую от, скажем, от 0,0 до 2,2 до 0,2', затем скопируйте кривую в изображение и перерисуйте по центру на 4,4 '(вместо' 2,2'), то это не даст смещение 1px? – warren

ответ

9

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

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

Вы можете также увидеть бумаги показано здесь: Outline of cubic bezier curve stroke

6

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

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

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

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

3

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

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

+0

У вас также есть кубическая кривая или обобщение более высокого порядка, или ваше решение работает только для квадратичных кривых? (если да, то это доступная запись? =) –

+0

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

4

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

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

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

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

Другой алгоритм для аппроксимации смещений как (всего два) Безье (по одному с каждой стороны) с кодом в PostScript приведен в разделе 7 из this paper by Gernot Hoffmann. (Подсказка для кого-то на форуме OpenGL для его поиска.)

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