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

Racionální B-spline křivky

editovat

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

 ,

kde

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

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.

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

editovat

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é   na intervalu   právě jedno maximum.

Lokální vlastnost

  pro  

Zobecnění

Funkce   jsou zobecněním funkcí  , pro   a   platí

 

Pro uzlové vektory a váhy platí:

  pro obrázek vlevo
  pro obrázek vpravo

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

editovat

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

Koncové podmínky

editovat

Pokud uvažujeme neperiodický uzlový vektor ve tvaru

 ,

pak platí, že racionální B-spline křivka stupně   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ů  , stupněm křivky   a počtem bodů řídícího polygonu křivky   platí následující vztah:

 

Konvexní obal

editovat

Jsou-li všechny váhové parametry nezáporné, pak pro   leží bod   v konvexním obalu množiny, která je určena body  .

Invariance vůči transformacím

editovat

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

editovat

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

De Boor algoritmus

editovat

Viz Racionální algoritmus de Boor

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

editovat

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

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

editovat

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  .

Algoritmizace

editovat

ComputeKnotVector(int n, int k)

editovat

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);
  }
 }

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

editovat

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;
  }
 }

Vector GetPoint(double t)

editovat

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);
 }

RichPoint CreateRichPoint()

editovat

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;
 }