Geometrie/Racionální B–spline křivka
Z Wikiknih
Obsah |
[editovat] Racionální B-spline křivky
Racionální B-spline křivka stupně k je určena rovnicí:
,
kde
- Pi jsou body řídícího polygonu (tzv. de Boor body),
- ωi jsou váhové parametry jednotlivých bodů
,
jsou normalizované B-spline bázové funkce stupně k.
Rovnici racionální B-spline křivky můžeme upravit na tvar:
,
kde
jsou racionální B-spline bázové funkce definované:
Racionální B-spline křivky jsou obvykle definovány na neuniformním uzlovém vektoru
. 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.
[editovat] Analytické vlastnosti racionálních bázových funkcí
Pro racionální bázové funkce
platí podobné analytické vlastnosti jak pro bázové funkce
.
Nezáporná hodnota
pro 
Jednotkový součet
pro 
Vlastnost krajních funkcí
Extrémy
Každá bázová funkce
má pro každé i na intervalu
právě jedno maximum.
Lokální vlastnost
pro 
Zobecnění
Funkce
jsou zobecněním funkcí
, pro
a ω = 1 platí
Pro uzlové vektory a váhy platí:
pro obrázek vlevo
pro obrázek vpravo
[editovat] 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.
[editovat] Koncové podmínky
Pokud uvažujeme neperiodický uzlový vektor ve tvaru
-
U = ( 


), k + 1 k + 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
platí následující vztah:
- m = n + k + 1
[editovat] Konvexní obal
Jsou-li všechny váhové parametry nezáporné, pak pro
leží bod
v konvexním obalu množiny, která je určena body
.
[editovat] 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í.
[editovat] 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.
[editovat] De Boor algoritmus
Viz Racionální algoritmus de Boor
[editovat] 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
, ostatní části zůstanou beze změny.
[editovat] 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í:
,
kde
- uzlový vektor je

- a váhový vektor je
.
Vektorová rovnice pro kružnici, která je určena devíti vrcholy řídícího polygonu, je:
,
kde
- uzlový vektor je

- a váhový vektor je
.
[editovat] Algoritmizace
[editovat] 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
void ComputeKnotVector(int n, int k)
{
parametrization = new ParameterCollection();
for(int i=0; i<=n+k+1; i++)
{
if(i<=k) parametrization.Insert(i,0);
else
if(i>n) parametrization.Insert(i,n-k+1);
else
parametrization.Insert(i,i-k);
}
}
[editovat] 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
private double BasisFunction(int k, int i, ParameterCollection u, double t)
{
if(k<=0)
{
if((u[i]<=t) && (t<u[i+1]))
return 1;
else
return 0;
}
else
{
double memb1, memb2;
if(u[i+k]==u[i])
memb1 = 0;
else
memb1 = ((t-u[i])/(u[i+k]-u[i]))*BasisFunction(k-1, i, u, t);
if(u[i+k+1]==u[i+1])
memb2 = 0;
else
memb2 = ((u[i+k+1]-t)/(u[i+k+1]-u[i+1]))*BasisFunction(k-1, i+1, u, t);
return memb1+memb2;
}
}
[editovat] 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
public override Vector GetPoint(double t)
{
Vector ret = new Vector();
double denom = 0;
for (int i = 0;i<ctrlPoly.Count;i++)
{
ret+=BasisFunction(Degree,i,parametrization,t)*((RacionalRichPoint)ctrlPoly[i]).
Locate*((RacionalRichPoint)ctrlPoly[i]).Weight;
denom+=((RacionalRichPoint)ctrlPoly[i]).Weight*BasisFunction(Degree,i, parametrization,t);
}
return ret*(1/denom);
}
[editovat] 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.
public override RichPoint CreateRichPoint()
{
double t=0;
if (ctrlPoly.Count>0) t=((RacionalRichPoint)ctrlPoly[0]).T;
foreach (RacionalRichPoint p in ctrlPoly)
{
if (p.T>t) t=p.T;
}
RacionalRichPoint rp=new RacionalRichPoint(new RichPoint(new Vector(0,0), t+1), 1);
return rp;
}


