In welcher Form liegen die Daten vor? Wie willst du interpolieren (linear, kubisch, etc.)? Wohin kommen die interpolierten Werte?
Im allgemeinen ist Interpolation immer gleich und simpel. Meist schnappt man sich nur einen Wert (also nicht gleich ganze vektoren o.ä.) und interpoliert zum nächsten. Die Signatur einer Interpolationsfunktion lautet daher idR:
function Interpolate(WertA, WertB, k: Float): Float;
Das heisst du übergibst die zwei Werte zwischen denen gerechnet werden soll, und das "k" gibt an wie nah das Ergebnis WertA oder WertB sein soll. Meist läuft "k" von 0..1, wobei bei k=0 result=WertA ist, und für k=1 result=WertB.
Das wäre der Kern einer Interpolation. Einen ganzen Vektor z.B. interpoliert man einfach, indem man x, y und z mit gleichem k einzeln dadurch jagt.
Kubische und Hermite-Interpolation gehen noch ein Stück weiter, und brauchen 4 Randwerte, wobei der interpolierte Bereich zwischen dem 2. und 3. Wert liegt. Die 2 weiteren "aussen rum" sind mit einbezogen, um annähernde Stetigkeit über eine zwischen mehreren Werten interpolierte Strecke zu erlangen. Da muss man dann an den jeweiligen Rändern noch Werte hinzudichten
Hier mal ein paar Interpolationsfunktionen die ich einsetze: (nach o.g. Schema zu verwenden, mein "k" heisst hier "t")
Delphi-Quellcode:
// Einfache Verfahren die nur 2 Werte brauchen
function ILinear(a, b, t: Single): Single;
begin
result := a*(1-t)+b*t;
end;
function ICosine(a, b, t: Single): Single;
var
t2: Single;
begin
t2 := (1-cos(t*PI))/2;
result := a*(1-t2)+b*t2;
end;
// Ab hier wirds schöner, aber auch 4 Werte nötig; Zwischen b und c wird interpoliert.
function ICubic(a, b, c, d, t: Single): Single;
var
a0, a1, a2, a3: Single;
t2 : Single;
begin
t2 := t*t;
a0 := d - c - a + b;
a1 := a - b - a0;
a2 := c - a;
a3 := b;
result := a0*t*t2+a1*t2+a2*t+a3;
end;
function IHermite(a, b, c, d, t: Single): Single;
// Simplified: Bias = 0; Tension = 1;
var
a0, a1, a2, a3: Single;
m0, m1 : Single;
t2, t3 : Single;
begin
t2 := t*t;
t3 := t2*t;
a0 := 2*t3 - 3*t2 + 1;
a1 := t3 - 2*t2 + t;
a2 := t3 - t2;
a3 := -2*t3 + 3*t2;
m0 := ((b-a)/2) + ((c-b)/2);
m1 := ((c-b)/2) + ((d-c)/2);
result := a0*b + a1*m0 + a2*m1 + a3*c;
end;
(Die Funktionen sind meine Übersetzung von
diesen hier. Der besseren Übersicht wegen habe ich mal nicht meine voll optimierten Fassungen genommen.)
Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel