Geometrie/Bézierova křivka

Z Wikiknih
Přejít na: navigace, hledání
logo Wikipedie
Na Wikipedii naleznete článek

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).

Obsah

[editovat] Vyjádření

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


P(u) = \sum_{i=0}^n P_i B_i^n(u),

kde:

u \in <0, 1>,

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

B_i^n(u) jsou tzv. Bernsteinovy polynomy n-tého stupně,

pro které platí:


B_i^n(u) = {n \choose i} u^i (1-u)^{n-i}, i = 0,1,...n

[editovat] Vlastnosti

[editovat] Nezáporná hodnota

B_i^n(u) \ge 0 pro všechny hodnoty i = 0,...,n a pro všechna u \in <0, 1>. Tato vlastnost plyne z toho, že pro u \in <0, 1> jsou všechny součinitele v definici Bézierových polynomů nezáporné.

[editovat] Jednotkový součet

\sum_{i=0}^n B_i^n(u) = 1 pro všechny hodnoty u \in <0, 1>

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

1 = (u + (1 - u))^n = \sum_{i=0}^n {n \choose i} u^i (1 - u)^{n-i} = \sum_{i=0}^n B_i^n (u)

[editovat] Koncové podmínky

B_o^n(0)= B_n^n(1) = 1

[editovat] Maximum

B_i^n(u) nabývá právě jednoho maxima na u \in <0, 1>, a to pro u = {i \over n}

[editovat] Symetrie

Pro libovolné n je množina polynomů B_i^n(u) symetrická podle u = {1 \over 2}

[editovat] Rekurentní vztah

B_i^n(u) = (1-u) \cdot B_i^{n-i}(u) + u \cdot B_{i-1}^{n-i}(u)

a:

B_0^0(u) = 1

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

{n \choose i} = {(n-1) \choose i} + {(n-1) \choose (i-1)}

[editovat] Derivace

{dB_i^n(u) \over du} = n(B_{i-1}^{n-i}(u) - B_i^{n-i}(u))

[editovat] Algoritmizace

[editovat] Factorial(int a)

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

[editovat] Combin(int a, int b)

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

[editovat] BernsteinPolynom(int k,int i,double t)

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

[editovat] Vector GetPoint(double t)

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

[editovat] RichPoint CreateRichPoint()

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

[editovat] Externí odkazy

[editovat] Autoři

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.

Osobní nástroje
Jmenné prostory

Varianty
Akce
Navigace
Komunita
Tisk/export
Nástroje