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=0nPiNik(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)=uuiui+kuiNik1(u)+ui+k+1uui+k+1ui+1Ni+1k1(u),

kde

Ni0(u)=1, pro uui,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,,umk,,um),

kde

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

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

u0==uk a umk==um.

Pokud pro dva sousední parametry platí:

ui+1ui=konst. pro kimk1,

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 uu0,um

Lokální vlastnost

Nik(u)0 pro uui,ui+k+1

Okrajový uzlový vektor

Pro uzlový vektor (u0,,u0k+1,um,,umk+1), tzv. okrajový uzlový vektor, platí:

Nik(u)=Bik(u)=(ki)ui(1u)ki.

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(P1P0)uk+1, P(um)=k(PnPn1)1umk1.

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 uui,ui+1,kimk1 leží v konvexním obalu vrcholů Pik,,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 uui,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 uui,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