Geometrie/Hermitova kubika
Z Wikiknih
Obsah |
[editovat] Popis
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.
[editovat] Vyjádření
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í:

[editovat] Vlastnosti
Čí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.
[editovat] Algoritmizace
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 polynomprivate 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;
}
[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.
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;
}