Kurven erster Ordnung (Geraden) ergeben nur den Linienzug.
Kurven zweiter Ordnung (Parabeln) sind an den Intervallgrenzen nur einmal differenzierbar.
Kurven dritter Ordnung mit stetigen ersten und zweiten Ableitungen an den Intervallgrenzen (kubische Splines) können zu einer Gesamtkurve mit weichen Übergängen an den Nahtstellen zusammengesetzt werden.
Die n Stützpunkte seien f (ti) , die resultierenden Intervalle seien [ti,ti + 1] , die für das Intervall i zuständige Funktion sei fi(t) , 1 i n - 1 .
Jedes fi hat die Form
Es muß gelten
fi(ti + 1) | = | fi + 1(ti + 1) | für | i = 1,...,n - 2 | gleicher Wert |
fi'(ti + 1) | = | fi + 1'(ti + 1) | für | i = 1,...,n - 2 | gleiche Steigung |
fi''(ti + 1) | = | fi + 1''(ti + 1) | für | i = 1,...,n - 2 | gleiche Steigungsänderung |
Nach Vorgabe von a1 und an - 1 entsteht ein Gleichungssystem mit n - 2 Gleichungen und n - 2 Unbekannten a2,a3,...,an - 2 .
Die Werte von a1 und an - 1 können z.B. ermittelt werden durch Festlegung f''(t1) = f''(tn) = 0 (natürliche Spline-Interpolation).
Für die Folge ti reicht jede monoton wachsende Folge. Geeignet ist z.B. die Folge der euklidischen Abstände zwischen den Stützpunkten. Statt den Abstand d = zu berechnen, verwendet man die Näherungsformel · (dx + dy + 2 · max (dx,dy)) .
/*************************************************************************************/ /* Spline-Interpolation durch Polynome 3. Grades */ /*************************************************************************************/ private static double[] calcfx = new double[MAX_POINTS]; // x-Funktionswerte private static double[] calcfy = new double[MAX_POINTS]; // y-Funktionswerte private static double[] x = new double[MAX_POINTS]; // x-Koordinaten der Stuetzpunkte private static double[] y = new double[MAX_POINTS]; // y-Koordinaten der Stuetzpunkte private static double[] t = new double[MAX_POINTS]; // t-Werte der Stuetzpunkte void besetze_arrays( // berechnet Intervallgrenzen int point_cnt, // Anzahl der Polygonpunkte Point punkt[]) // Punktliste { int i; double ax,ay,dd; for (i=0; i |