Geometrie/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 | 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]
Maximum
[editovat | editovat zdroj]nabývá právě jednoho maxima na , a to pro
Symetrie
[editovat | editovat zdroj]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:
Derivace
[editovat | editovat zdroj]
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]- Encyklopedický článek Bézierova křivka ve Wikipedii
- Obecné Bézierovy křivky CZ
- Living Math Bézier applet EN
Autoři
[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.