Einzelnen Beitrag anzeigen

Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Rotation und Position Key's Interpolieren

  Alt 21. Dez 2005, 23:24
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
  Mit Zitat antworten Zitat