Přeskočit na obsah

Geometrie/Bézierova křivka

Z Wikiknih

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 | editovat zdroj]

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 | editovat zdroj]

Nezáporná hodnota

[editovat | editovat zdroj]

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 | editovat zdroj]

pro všechny hodnoty

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

Koncové podmínky

[editovat | editovat zdroj]

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

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

Rekurentní vztah

[editovat | editovat zdroj]

a:

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

Algoritmizace

[editovat | editovat zdroj]

Factorial(int a)

[editovat | editovat zdroj]

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 | editovat zdroj]

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 | editovat zdroj]

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 | editovat zdroj]

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 | editovat zdroj]

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 | editovat zdroj]

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.