Geometrie/Racionální B–spline křivka

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

Racionální B-spline křivky

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

P(u)=i=0nPiωiNik(u)i=0nωiNik(u),

kde

Pi jsou body řídícího polygonu (tzv. de Boor body),
ωi jsou váhové parametry jednotlivých bodů ωi0,
Nik(u) jsou normalizované B-spline bázové funkce stupně k.

Rovnici racionální B-spline křivky můžeme upravit na tvar:

P(u)=i=0nPiRik(u),

kde

Rik(u) jsou racionální B-spline bázové funkce definované:
Rik(u)=ωiNik(u)j=0nωjNjk(u)

Racionální B-spline křivky jsou obvykle definovány na neuniformním uzlovém vektoru U=(u0,,um). Takovým křivkám pak říkáme NURBS křivky (non uniform rational B-spline). Je-li tento vektor neperiodický, pak pro něj platí stejná pravidla jako pro neracionální B-spline křivky.

Analytické vlastnosti racionálních bázových funkcí

Pro racionální bázové funkce Rik(u) platí podobné analytické vlastnosti jak pro bázové funkce Nik(u).

Nezáporná hodnota

Rik(u)0 pro uu0,um

Jednotkový součet

i=0nRik(u)=1 pro uu0,um

Vlastnost krajních funkcí

R0k(0)=Rnk(1)=1

Extrémy

Každá bázová funkce Rik(u) má pro každé i na intervalu 0,1 právě jedno maximum.

Lokální vlastnost

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

Zobecnění

Funkce Rik(u) jsou zobecněním funkcí Nik(u), pro i=0,,n a ω=1 platí

Rik(u)=Nik(u)

Pro uzlové vektory a váhy platí:

U=(0,0,0,1,2,3,3,3)(ω0,,ω4)=(1,4,1,1,1) pro obrázek vlevo
U=(0,0,0,1,2,3,3,3)(ω0,,ω4)=(1,1,0.3,1,1) pro obrázek vpravo

Geometrické vlastnosti racionálních B-spline křivek

Geometrické vlastnosti pro racionální B-spline křivky jsou zobecněním vlastností neracionálních B-spline křivek.

Koncové podmínky

Pokud uvažujeme neperiodický uzlový vektor ve tvaru

U=(0,,0k+1,uk+1,,umk1,1,,1k+1),

pak platí, že racionální B-spline křivka stupně k prochází počátečním a koncovým bodem řídícího polygonu a dotýká se v těchto bodech jeho první a poslední hrany.

Mezi počtem uzlů m, stupněm křivky k a počtem bodů řídícího polygonu křivky (n+1) platí následující vztah:

m=n+k+1

Konvexní obal

Jsou-li všechny váhové parametry nezáporné, pak pro uui,ui+1,ki(mk1) leží bod P(u) v konvexním obalu množiny, která je určena body Pik,,Pi.

Invariance vůči transformacím

Racionální B-spline křivky jsou invariantní vůči afinním transformacím, NURBS křivky jsou také invariantní vůči projektivnímu promítání.

Průsečík přímky (ve 2D) nebo roviny (ve 3D) s křivkou

Žádná přímka (rovina) nemá více průsečíků s křivkou než s jejím řídícím polygonem.

De Boor algoritmus

Viz [[../Racionální algoritmus de Boor|Racionální algoritmus de Boor]]

Modifikace tvaru křivky pomocí váhových parametrů

Obdobně jako u racionálních Bézierových křivek můžeme využít změny hodnot váhových parametrů k modifikaci křivky bez potřeby měnit polohu bodů řídícího polygonu. Zvětšujeme-li hodnotu váhového parametru ωi a ostatní váhové parametry zůstanou beze změny, křivka se více "přimyká" k odpovídajícímu bodu Pi, ovšem vliv změny na tvar křivky je omezen pouze pro uui,ui+k+1, ostatní části zůstanou beze změny.

Vyjádření kružnice pomocí racionální B-spline křivky

Jak bylo řečeno v úvodu, některé kuželosečky, jako jsou elipsa nebo hyperbola, je možné pomocí neracionálních křivek popsat pouze přibližně, proto byly zavedeny křivky racionální. V tomto příkladě ukážeme, jak popsat kružnici pomocí racionální B-spline křivky.

Vektorová rovnice pro kružnici, která je určena sedmi vrcholy řídícího polygonu, je následující:

P(u)=i=06ωiPiNi2(u)i=06ωiNi2(u)=i=06PiRi2(u),

kde

uzlový vektor je U=(0,0,0,13,13,23,23,1,1,1)
a váhový vektor je (ω0,,ω6)=(1,12,1,12,1,12,1).

Vektorová rovnice pro kružnici, která je určena devíti vrcholy řídícího polygonu, je:

P(u)=i=08ωiPiNi2(u)i=08ωiNi2(u)=i=08PiRi2(u),

kde

uzlový vektor je U=(0,0,0,14,14,12,12,34,34,1,1,1)
a váhový vektor je (ω0,,ω8)=(1,22,1,22,1,22,1,22,1).

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 stupňe 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

RichPoint CreateRichPoint()

Přetížená metoda třídy Curve. Spočítá a vrátí řídící bod pro křivku s váhovým koeficientem. RacionalRichPoint je jako RichPoint, ale počítá s váhou bodu.

Šablona:Kód