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 |