Geometrie/Hermitova kubika

Z Wikiknih

Přejít na: navigace, hledání

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


P(u) = H_0^3(u)P_0 + H_1^3(u)P_0^' + H_2^3(u)P_1^' + H_3^3(u)P_1,

kde

P_0^{}, P_1^{} jsou počáteční resp. koncový bod a P_0^', P_1^' jsou tečny v počátečním resp. koncovém bodě,

H_i^3(u) jsou kubické Hermitovy polynomy tvaru:


H_0^3(u) = B_0^3(u) + B_1^3(u) = 2u^3 - 3u^2 + 1


H_1^3(u) = \frac {1} {3} B_1^3(u) = u^3 - 2u^2 + u


H_2^3(u) = - \frac {1} {3} B_2^3(u) = u^3 - u^2


H_3^3(u) = B_2^3(u) + B_3^3(u) = - 2u^3 + 3u^2

a u_{}^{} náleží do intervalu (0,1)_{}^{}.

Snadno se dá ukázat, že platí:

P (0) = P_0, P (1) = P_1, P^'(0) =  P_0^', P^'(1) = P_1^'

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

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