Geometrie/Hermitova kubika
Popis
[editovat | editovat zdroj]Známe-li dva řídící body a jejich tečné vektory, můžeme použít Hermitovu interpolaci a nalézt tzv. Hermitovu kubiku. Poloha této křivky je tedy určena dvěma řídícími body a její tvar závisí na velikosti a směru jejich tečných vektorů. Této interpolace se využívá např. v C1 kubické interpolaci, která je představitelem interpolace po obloucích.
Vyjádření
[editovat | editovat zdroj]Hemitova kubika bývá nejčastěji vyjádřena ve tvaru
kde
jsou počáteční resp. koncový bod a jsou tečny v počátečním resp. koncovém bodě,
jsou kubické Hermitovy polynomy tvaru:
a náleží do intervalu .
Snadno se dá ukázat, že platí:
Vlastnosti
[editovat | editovat zdroj]Čím je velikost vektoru větší, tím více se k němu křivka přimyká. Jsou-li oba vektory nulové, pak křivka degeneruje na úsečku mezi zadanými body.
Algoritmizace
[editovat | editovat zdroj]Implementace se skládá ze dvou stěžejních funkcí:
- hermituvPolynom(int m, double t)
- implementace Hermitových polynomů,
- GetPoint(double t)
- vrací bod pro parametr t (z intervalu (0,1)) na Hermitově kubice.
Popišme si některé třídy a metody, jež algoritmus využívá.
- Vector
- třída popisující vektor,
- Math
- objekt prostředí CLR nabízející matematické metody,
- Math.Pow
- mocnina,
- Richpoint
- třída popisující bod,
- ctrlPoly
- body řídícího polygonu.
// Vraci kubický hermitův polynom H^3_k
private double hermituvPolynom(int m, double t)
{
switch(m) // index hermitova polynomu
{
case(0): return 2*Math.Pow(t,3)-3*Math.Pow(t,2)+1;
case(1): return Math.Pow(t,3)-2*Math.Pow(t,2)+t;
case(2): return -2*Math.Pow(t,3)+3*Math.Pow(t,2);
case(3): return Math.Pow(t,3)-Math.Pow(t,2);
}
return 0.0;
}
// vrací bod na Hermitově kubice
public override Vector GetPoint(double t)
{
Vector result=new Vector(); // vysledný vektor
Vector v;
int ictr = 0, ideriv = 0;
// hodnoty pro řídící body
for (int k = 0; k < 4; k++)
{
v = k%2==0 ?
((RichPoint)ctrlPoly[ictr++]).Locate : // řídící body
(Vector)tecneVektory[ideriv++]; // tečné vektory
result += hermituvPolynom(k, t) * v;
}
return result;
}
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.