ГоловнаСтаттіБезьє, B-Сплайни & NURBS

Параметричні криві: від Безьє до NURBS

Точки керування, об'єднуючі функції та алгоритм де Кастельжаю — як векторна графіка та контури шрифтів будуються з невеликої кількості чисел.

mysimulator teamОновлено — червень 2026≈ 8 хв читання▶ Відкрити симуляцію

Параметрична крива: функція одного числа

Параметрична крива не описує y як функцію від x. Замість цього, вхідний параметр t, зазвичай змінюється від 0 до 1, подається у вектор-значну функцію P(t), яка повертає точку. Переміщення t від 0 до 1 змушує точку простежити криву. Цей один трюк обходить усі проблеми, що виникають із y = f(x): крива може петляти сама на себе, бути вертикальною або навіть перетинатися, оскільки x(t) і y(t) є незалежними функціями одного t.

Майже кожна крива, яка використовується в комп’ютерній графіці, є зваженою сумою контрольних точок: P(t) = Σ Bi(t)·Pi, де Pi - це кілька точок, які можна перемістити на екрані, а Bi(t) - це фіксовані функції змішування, що визначають ступінь впливу кожної точки при параметрі t. Криві Безьє, сплайни B-spline та NURBS є просто трьома різними виборами функцій змішування.

Параметричні криві: від Безьє до NURBS

Параметрична крива Безьє — це крива, яка визначається набором контрольних точок. Крива Безьє степеня n будується з n+1 контрольної точки за допомогою поліномів Бернштейна як функцій змішування. У практиці ніхто не оцінює формулу Бернштейна безпосередньо — алгоритм де Кастельжаю, розроблений у 1959 році, обчислює ту ж точку шляхом повторної лінійної інтерполяції, що є числово стабільним і простим для кодування:

функція deCasteljau(точки, t): pts = точки.slice() while pts.length > 1: next = [] for i in 0..pts.length-2: next.push(lerp(pts[i], pts[i+1], t)) pts = next return pts[0] // точка на кривій при параметрі t відома демонстрація · каркас де Кастельжаю, що прокладає кубічну криву● LIVE Кожен прохід циклу малює коротшу ланцюг інтерпольованих сегментів; останній пункт знаходиться на кривій, а проміжні точки відслідковують той самий каркас Безьє, який використовувався для геометричного визначення конструкції десятиліттями до того, як хтось мав комп'ютер для її анімації.

function deCasteljau(points, t):
  pts = points.slice()
  while pts.length > 1:
    next = []
    for i in 0..pts.length-2:
      next.push(lerp(pts[i], pts[i+1], t))
    pts = next
  return pts[0]   // the point on the curve at parameter t
жива демонстрація · пов'язана симуляція● LIVE

Параметричні криві: від Безьє до NURBS

Одиночна крива Безьє має дві слабкості. По-перше, кожна контрольна точка впливає на всю криву — переміщуйте одну точку і вся форма збулася, що ускладнює точне редагування. По-друге, крива Безьє високого ступеня (багато контрольних точок, примушено в один поліном) схильна до коливань між точками, що є версією явища Рунге.

B-сплайн усуває обидва проблеми, зшиваючи декілька шматків поліномів низького ступеня замість того, щоб примусово пропускати один високий поліном через все. Вектор вузлів позначає, де закіншується один шматок і починається наступний, а функція змішування для кожної контрольної точки є гладким підвищенням, яке дорівнює нулю за межами невеликого вікна вузлів — тому переміщення точки лише локально змінює форму кривої. Кубічний B-сплайн є стандартним у більшості програмного забезпечення CAD та анімації з цієї причини: передбачувані, локальні редагування.

NURBS: надавання контрольних точками ваги

B-сплайн все ще є поліномом, і поліноми не можуть точно представляти коло або еліпс — «коло» Безьє завжди є наближенням. NURBS (Неоднорідні раціональні сплайни) це виправляє, надаючи кожній контрольній точці додаткове число – вагу wi, і ділячись на суму зважених функцій змішування замість простого їх підсумовування:

C(t) = ( Σ Ni,p(t)·wi·Pi ) / ( Σ Ni,p(t)·wi) Підтягуючи вагу вгору, ви тягнете криву до цієї контрольної точки без переміщення її; відштовхування її до нуля відштовхує криву. З правильною схемою ваги (ланцюг чвертькругів використовує ваги, чергуючись між 1 і √2⁄2), NURBS-крива простежує математично точне коло, тому що кожне серйозне ядро CAD — геометрія під автомобілями, літаками та турбінними лопатями — побудовано на основі NURBS замість простих сплайнів.

C(t) = ( Σ Ni,p(t)·wi·Pi ) / ( Σ Ni,p(t)·wi )

Параметричні криві: від Безьє до NURBS

TrueType шрифти зберігають контури графіків як квадратичні бізнес-курви; PostScript, OpenType-CFF, PDF та SVG's дані шляху використовують кубічні. Інструмент перо Adobe Illustrator, інструмент векторів Figma та будь-який "бізнес-ручка", яку ви тягнете в програмі дизайну, є точно конструкцією де Кастельджуа зверху, відтвореною у зворотньому порядку — ви розміщуєте анкети та ручки, програмне забезпечення розв’язує задачу для кривої. CAD пакети, такі як SolidWorks, Rhino і Fusion 360 використовують NURBS для кривих і поверхонь, оскільки той самий раціональний трюк, що малює точний круг, також будує точні циліндри та сфери в 3D.

Часті запитання

Чому шрифти використовують квадратичні Без’єрські криві, а інструменти векторної ілюстрації – кубічні?

Це компроміс між зберіганням та виразністю. Шрифти TrueType використовують квадратичні криві, оскільки два контрольні точки на сегмент є компактними, а контури глифів прості; PostScript, OpenType-CFF і SVG використовують кубічні Без’єрські криві, оскільки кубічна може утримувати точку інфлексії та S-подібну форму в одному сегменті, що потребує менше сегментів для складних малюнків.

Чи може Без’єрська крива намалювати ідеальним чином коло?

Ні – Без’єрська крива є поліномом, а коло не є поліномом, тому будь-яке коло з Без’єрської кривої є наближенням (дуже хорошим наближенням використовується константа магії близько 0.5523 для зміщення контрольної точки). NURBS-крива може намалювати точне коло, оскільки її раціональні ваги дозволяють їй точно представляти еліптичні перерізи.

Яка практична відмінність між B-сплайном і Без’єрською кривою?

Одна Без’єрська крива – це один поліномний шматок, керований усіма її точками одночасно, тому переміщення однієї точки може змінити всю криву. B-сплайн складається з кількох поліномних шматків нижчого ступеня, з'єднаних вузлами, і кожна контрольна точка впливає лише на локальне вікно – переміщення її змінює лише це сусідство.

Спробуйте наживо

Усе, що вище, працює прямо у вашому браузері — відкрийте Bézier, B-Spline & NURBS і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.

▶ Відкрити симуляцію Bézier, B-Spline & NURBS

Що ви знайшли?

Додати кроки відтворення (опційно)