Geometrie/Bézierova křivka

(přesměrováno z Bézierova křivka)

Bézierova křivka, nesprávným pravopisem Beziérova křivka, je další metodou vytváření křivek. Tato metoda umožňuje interaktivní vytváření a modifikaci křivek. Pomocí této metody můžete rovněž datově reprezentovat i interpolační křivky (existují například algoritmy na převod mezi interpolačními spline kubikami a B-spline kubikami resp. Bézier kubikami).

Vyjádření

editovat

Bézierova křivka stupně n je určena rovnicí:

 

kde:

 ,

  jsou polohové vektory vrcholů řídícího polynomu (tzv. Bézierovy body)

  jsou tzv. Bernsteinovy polynomy n-tého stupně,

pro které platí:

 

Vlastnosti

editovat

Nezáporná hodnota

editovat

  pro všechny hodnoty   a pro všechna  . Tato vlastnost plyne z toho, že pro   jsou všechny součinitele v definici Bézierových polynomů nezáporné.

Jednotkový součet

editovat

  pro všechny hodnoty  

Plyne přímo z binomické věty. Platí totiž:

 

Koncové podmínky

editovat

 

Maximum

editovat

  nabývá právě jednoho maxima na  , a to pro  

Symetrie

editovat

Pro libovolné n je množina polynomů   symetrická podle  

Rekurentní vztah

editovat

 

a:

 

Rekurentní vztah vyplývá ze vztahu pro kombinační čísla:

 

Derivace

editovat

 

Algoritmizace

editovat

Factorial(int a)

editovat

Pomocná metoda pro výpočet faktoriálu pro kombinační číslo.

int Factorial(int a)
 {
  if (a==0) return 1;
  else
   return (a* Factorial(a-1));
 }

Combin(int a, int b)

editovat

Pomocná metoda pro výpočet kombinačního čísla pro výpočet bodů Bernsteinova polynomu.

public int Combin(int a, int b)
 {
  return Factorial(a)/(Factorial(a-b)*Factorial(b));
 }

BernsteinPolynom(int k,int i,double t)

editovat

Metoda pro výpočet bodů polynomu.

public double BernsteinPolynom(int k,int i,double t)
 {
  return Combin(k,i)*Math.Pow(t,i)*Math.Pow(1-t,k-i);
 }

Vector GetPoint(double t)

editovat

Přetěžovaná metoda třídy Curve. V zadaném parametru vrátí polohový vektor bodu na křivce.

public override Vector GetPoint(double t)
 {
  Vector ret = new Vector();
  Vector v;
  for (int i = 0;i<ctrlPoly.Count;i++)
  {
   v = ((RichPoint)ctrlPoly[i]).Locate;
   ret = ret + BernsteinPolynom(ctrlPoly.Count-1,i,nt)*v;
  }
  return ret;
 }

RichPoint CreateRichPoint()

editovat

Přetěžovaná metoda třídy Curve. Vytvoření řídícího bodu pro křivku. Oproti rodiči má navíc rozšíření o váhový koeficient.

public override RichPoint CreateRichPoint()
 {
  double w = ((RichPoint) ctrlPoly[0]).T;			
  for (int q=0; q<ctrlPoly.Count;q++) 
  {
   if (((RichPoint) ctrlPoly[q]).T>w) w=((RichPoint) ctrlPoly[q]).T;				
  }
  RichPoint tw = new RichPoint(new Vector(), w+0.1);
  return tw;
 }

Externí odkazy

editovat

Autoři

editovat

Tento text vypracovali studenti Univerzity Palackého v Olomouci katedry Matematické informatiky jako zápočtový úkol do předmětu Počítačová geometrie.