Přeskočit na obsah

Geometrie/Hermitova kubika

Z Wikiknih

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

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.