Geometrie/B–spline křivka

Z testwiki
Skočit na navigaci Skočit na vyhledávání

B-spline křivky

B-spline křivky poprvé zavádí N. Lobachevský již v 19. století. V roce 1946 I. J. Schoenberg použil B-spline pro vyhlazování statistických dat a dává tím základy pro moderní teorii spline aproximací. M. Cox a C. de Boor objevili nezávisle na sobě v roce 1972 rekurentní vztah pro výpočet B-spline. Tato teorie byla poté použita pro výpočet parametrických B-spline křivek.

Obecná B-spline křivka stupně k je určena rovnicí:

P(u)=∑i=0nPi⋅Nik(u),

kde

Pi jsou polohové vektory vrcholů řídícího polygonu (de Boor body),
Nik(u) jsou normalizované bázové funkce stupně k (někdy se nazývají de Boor funkce).

Analytické vlastnosti de Boor bázových funkcí

Pro de Boor bázové funkce platí tyto analytické vlastnosti ([PIE 85]; [HOS 89]):

Rekurentní vztah:

Nik(u)=u−uiui+k−ui⋅Nik−1(u)+ui+k+1−uui+k+1−ui+1⋅Ni+1k−1(u),

kde

Ni0(u)=1, pro u∈⟨ui,ui+1⟩,
Ni0(u)=0, pro u∉⟨ui,ui+1⟩,

Hodnoty parametrů uj se obvykle nazývají uzly. Pak hovoříme o tzv. uzlovém vektoru parametrů:

U=(u0,u1,…,uk,uk+1,…,um−k,…,um),

kde

ui<ui+1,m=n+k+1.

Uzlový vektor se nazývá neperiodický (neuniformní), jestliže platí:

u0=…=uk a um−k=…=um.

Pokud pro dva sousední parametry platí:

ui+1−ui=konst. pro k≤i≤m−k−1,

pak hovoříme o uniformní parametrizaci. Pokud nebude řečeno jinak, budeme dále uvažovat neperiodickou (neuniformní) parametrizaci.

Pro uzavřenou B-spline křivku bude pro uzlový vektor U platit:

U=(u0,u1,…,um),

kde

ui<ui+1,m=n.

Nezáporná hodnota

Nik(u)≥0 pro všechny hodnoty i,k,u.

(Nerovnost lze dokázat matematickou indukcí z uvedeného rekurentního vztahu.)

Jednotkový součet

∑i=0nNik(u)=1 pro u∈⟨u0,um⟩

Lokální vlastnost

Nik(u)≠0 pro u∈⟨ui,ui+k+1⟩

Okrajový uzlový vektor

Pro uzlový vektor (u0,…,u0⏟k+1,um,…,um⏟k+1), tzv. okrajový uzlový vektor, platí:

Nik(u)=Bik(u)=(ki)⋅ui⋅(1−u)k−i.

Geometrické vlastnosti B-spline křivek

Z definice B-spline křivky a z analytických vlastností bázových funkcí vyplývají tyto základní geometrické vlastnosti B-spline křivek ([BÖH 77]; [COH 77]; [PIE 85]; [HOS 89]):

Koncové podmínky

Pro neperiodický uzlový vektor platí, že B-spline křivka prochází počátečním a koncovým vrcholem řídícího polygonu a dotýká se počáteční a koncové hrany řídícího polygonu:

P(u0)=P0, P(um)=Pn
P′(u0)=k⋅(P1−P0)uk+1, P′(um)=k⋅(Pn−Pn−1)1−um−k−1.

Konvexní obal

Všechny body B-spline křivky leží v konvexním obalu množiny, která je určena de Boor body P0,…,Pn Přesněji řečeno, oblouk křivky P(u) pro u∈⟨ui,ui+1⟩,k≤i≤m−k−1 leží v konvexním obalu vrcholů Pi−k,…,Pi.

De Boor algoritmus

Viz [[../Algoritmus de Boor/]]

Volba stupně B-spline křivky

Stupeň Bézierovy křivky je pevně určen počtem vrcholů řídícího polygonu, zatímco obecná B-spline křivka umožňuje volbu stupně výsledné křivky. Na obrázku je zobrazeno několik B-spline křivek, které jsou určeny stejným řídícím polygonem.

Je zvolena uniformní neperiodická parametrizace a pro k=0,…,n platí:

pro k=0 dostáváme pouze body řídícího polygonu,
pro k=1 dostáváme právě řídící polygon,
pro zvyšující se stupeň se B-spline křivka vzdaluje od řídícího polygonu,
pro k=n dostaneme křivku stejného tvaru jako Bézierova křivka pro daný polygon.

Význam uzlového vektoru

Výsledná křivka je pro u∈⟨ui,ui+k+1⟩ polynomem stupně k. Má tedy na tomto intervalu spojité všechny derivace. V uzlech ui se mění reprezentace B-spline křivky -– vystupuje z ní jeden bázový spline a vstupuje jiný; uzly tedy působí jako "přepínač".

Lokální změna tvaru

Lokální vlastnost je zajištěna tím, že bázové funkce Nik(u) nabývají nenulových hodnot jen na intervalu ⟨ui,ui+k+1⟩. To znamená, že změníme-li polohu jednoho de Boor bodu Pi, pak se změní pouze ta část B-spline křivky, pro kterou u∈⟨ui,ui+k+1⟩. Tato změna ovlivní k+1 segmentů křivky. Čím je tedy stupeň B-spline křivky vyšší, tím se změní při změně jednoho bodu řídícího polygonu větší část křivky, přičemž pro k=n dojde ke změně celé křivky.

Výpočet Bézierových bodů z de Boor polygonu

Mějme dánu kubickou B-spline křivku de Boor polygonem D0,…,Dm. Pak pomocí podmínek C2 spojitosti lze velice jednoduše z daných de Boor bodů určit Bézierovy body P0,…,Pn.

Vícenásobné body

Tvar B-spline křivky ovlivňují tzv. vícenásobné body řídícího polygonu.

Invariance

Mezi důležité vlastnosti B-spline křivek patří invariance vůči otáčení, posunutí a změně měřítka. Afinní transformaci křivky pak můžeme provést tak, že této transformaci podrobíme vrcholy řídícího polygonu a k nim pak sestrojíme novou křivku.

Algoritmizace

ComputeKnotVector(int n, int k)

Spočítá uzlový vektor.

Parametry:

  • n - počet kontrolních bodů mínus 1
  • k - stupeň de Boor bázové funkce

Šablona:Kód

BasisFunction(int k, int i, ParameterCollection u, double t)

Spočítá a vrátí hodnotu normalizované bázové funkce stupně k.

Parametry:

  • k - stupeň de Boor bázové funkce
  • i - index polohového vektoru vrcholu řídícího polygonu
  • u - uzlový vektor
  • t - parametr

Šablona:Kód

Vector GetPoint(double t)

Přetížená metoda třídy Curve. Spočítá a vrátí bod na křivce.

Parametry:

  • t - parametr výpočtu

Šablona:Kód