Kurwa jest funkcją jednego liczby
Parametryczna krzywa nie opisuje y jako funkcji x. Zamiast tego pojedynczy parametr t, zwykle przebiegający od 0 do 1, jest wprowadzany do funkcji o wartości wektorowej P(t), która zwraca punkt. Przesuwając t od 0 do 1, punkt śledzi krzywą. Ten jeden trik pozwala uniknąć każdego problemu, który dotyka y = f(x): krzywa może sięgać w kółko, być pionowa lub nawet przecinać siebie, ponieważ x(t) i y(t) są niezależnymi funkcjami tego samego t.
Praktycznie każda krzywa używana w grafice komputerowej jest sumą ważoną punktów kontrolnych: P(t) = Σ Bi(t)·Pi, gdzie Pi to kilka punktów, które można przeciągać na ekranie, a Bi(t) są ustalonymi funkcjami mieszania, które określają, jak duży wpływ ma każdy punkt o danym parametrze t. Krzywe Bézier, B-spliny i NURBS to w rzeczywistości po prostu trzy różne wybory funkcji mieszania.
Krzywe Béziera i algorytm de Casteljau
Krzywa Béziera stopnia n jest budowana z n+1 punktów kontrolnych, wykorzystując wielomiany Bernsteina jako funkcje mieszające. W praktyce nikt nie oblicza bezpośrednio formuły Bernsteina – algorytm de Casteljau’a, opracowany w 1959 roku przez Paula de Casteljaua, oblicza ten sam punkt za pomocą powtarzalnej interpolacji liniowej, która jest numerycznie stabilna i łatwa do zaimplementowania:
funkcja deCasteljau(punkty, t): pts = punkty.slice() while pts.length > 1: następne = [] for i in 0..pts.length-2: następne.push(lerp(pts[i], pts[i+1], t)) pts = następne return pts[0] // punkt na krzywej wzdłuż parametru t live demo · algorytm de Casteljau’a przesuwający ramy po krzywej trzeciego stopnia● LIVE W każdym kroku pętli rysowany jest krótszy łańcuch segmentów interpolowanych; ostatni punkt znajduje się na krzywej, a punkty pośrednie śledzą ten sam szkielet Béziera, który został użyty do zdefiniowania konstrukcji geometrycznej dawno przed tym, jak ktokolwiek miał komputer do animacji tego.
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
Od krzywych Bézier do splajnów B: lokalna kontrola
Pojedyncza krzywa Bézier ma dwie słabości. Po pierwsze, każdy punkt kontrolny wpływa na całą krzywą – przesunięcie jednego punktu powoduje, że cała forma drga, co utrudnia precyzyjne edytowanie. Po drugie, krzywa Bézier o wysokim stopniu (wiele punktów kontrolnych zmuszonych do jednej wielomianowej) ma tendencję do kołysania się między swoimi punktami, co jest wersją zjawiska Runge'go.
Splajn B-splin rozwiązuje oba problemy poprzez łączenie kilku elementów wielomianu o niskim stopniu zamiast wymuszania jednego wielomianu o wysokim stopniu przez wszystko. Wektor węzłów oznacza, gdzie jeden element się kończy i następny zaczyna, a funkcja mieszania każdego punktu kontrolnego jest gładką wgłębką, która wynosi zero poza małym oknem węzłów – dzięki temu przesuwanie punktu tylko lokalnie zmienia kształt krzywej. Kubiczny splajn B-splin jest domyślny w większości oprogramowania CAD i animacji z tego powodu: przewidywalne, lokalne edycje.
NURBS: przypisywanie wag punktom kontrolnym
B-splina to nadal wielomian, a wielomiany nie mogą dokładnie reprezentować okręgu lub elipsy – "okrąg" Bezofera jest zawsze przybliżeniem. NURBS (Nierównomierne Racionalne B-Spliny) rozwiązują to, dając każdemu punktowi kontrolnemu dodatkową liczbę, wagę *wi*, i dzieląc przez sumę ważonych funkcji mieszania zamiast jej prostego sumowania:
C(t) = ( Σ Ni,p(t)·*wi*·Pi ) / ( Σ Ni,p(t)·*wi*) Podciągnięcie wagi do góry przesuwa krzywą w kierunku tego punktu kontrolnego bez jego przesunięcia; pchnięcie w kierunku zera odchyla krzywą. Przy odpowiednim wzorze wag (łańcuch ćwiartkowych łuków używa wag zmieniających się między 1 i √2/2) krzywa NURBS rysuje dokładnie matematycznie okrąg, dlatego też każdy poważny jądro CAD – geometria pod samochodami, samolotami i turbinami – jest zbudowany na bazie NURBS zamiast prostych splajnów.
C(t) = ( Σ Ni,p(t)·wi·Pi ) / ( Σ Ni,p(t)·wi )
Wykorzystane terminy i tłumaczenie:
Czcionki TrueType przechowują kontury znaków jako krzywe kwadratowe Béziera; PostScript, OpenType-CFF, PDF i ścieżki SVG wykorzystują krzywe sześciowargowe (cubic). Narzędzie do rysowania kresek w Adobe Illustrator, narzędzie wektorowe w Figma oraz każdy "uchwyt krzywej Béziera", który przeciągnąłeś w aplikacji do projektowania, to dokładnie konstrukcja De Casteljau podana powyżej, zilustrowana od tyłu — umieszczasz punkty zaczepienia i uchwyty, a oprogramowanie rozwiązuje dla ciebie krzywą. Programy CAD takie jak SolidWorks, Rhino i Fusion 360 wykorzystują NURBS zarówno dla krzywych, jak i powierzchni, ponieważ ten sam trik z racjonalną wagą, który rysuje dokładny okrąg, buduje również dokładne cylindry i sfery w 3D.
Frequently asked questions
Dlaczego czcionki używają krzywych kwadratowych Bézierza, a narzędzia do ilustracji wektorowych krzywych sześciokątnych?
Jest to kompromis między zużyciem pamięci a ekspresją. Czcionki TrueType wykorzystują krzywe kwadratowe, ponieważ dwa punkty kontrolne na segment są zwięzłe i kontury znaków są proste; PostScript, OpenType-CFF i SVG używają krzywych Bézierza sześciokątnych, ponieważ krzywa sześciokątna może uchwycić punkt zwrotny i kształt litera 'S' w jednym segmencie, wymagając mniej segmentów dla złożonych grafik.
Czy krzywa Bézier może narysować idealny okrąg?
Nie — krzywa Bézier jest wielomianem, a okrąg nie jest, więc każdy okrąg Bézier to przybliżenie (bardzo dobre przybliżenie wykorzystuje stałą magiczną około 0.5523 dla przesunięcia punktu kontrolnego). Krzywa NURBS może narysować dokładny okrąg, ponieważ jej racjonalne wagi pozwalają na precyzyjne reprezentowanie koniców za pomocą krzywych.
Jaki jest praktyczny różnic między krzywą B-spline a krzywą Bézierza?
Jedna krzywa Bézier to jeden wielomianowy element kontrolowany przez wszystkie jej punkty naraz, więc przemieszczenie jednego punktu może przekształcić całą krzywą. Krzywa B-spline jest zszyta z kilku elementów wielomianowych o niższym stopniu połączonych w węzłach, a każdy punkt kontrolny wpływa tylko na lokalne okno — jego przemieszczenie przekształca tylko to najbliższe obszar.
Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Bézier, B-Spline & NURBS i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.
▶ Otwórz symulację Bézier, B-Spline & NURBS