C++ Kubische Interpolation

hell-student

Lieutenant
Registriert
Nov. 2007
Beiträge
671
Hallo Zusammen,

ich bin grade dabei Werte Kubisch zu interpolieren, doch hab nun folgendes Problem. Meine Stützstellen (Werte) sind nicht nach der x-Kooardinate sortiert bzw. möchte ich quasi einen Bogen ermöglichen, sodass wenn man sich das Gesamtpolygon anschaut, es auftreten kann, dass zu einem x-Wert mehrere y-Werte vorhanden sind. Also bisher habe ich es wunderbar hinbekommen, dass aber der x-Wert der ersten Stützstelle der kleinste und der x-Wert der letzen der größte ist. D.h also aufsteigend sortiert. Die Frage die sich mir stellt ist, ob es überhaupt mit kubischer Interpolation möglich ist, oder ob ich zu Bezier bzw. B-Splines greifen muss. Das wäre mir nicht so recht, da der Benutzer -> Ich gerne die Punkte (Stützstellen) angeben kann und genau weis, dass dadurch auch die Kurve läuft. Bei Bezier-Kurven ist dies ja nicht der Fall, da dort eine Kurve nur durch Anfang und Endpunkt geht. Die anderen Punkte geben ja quasi an, wie sehr die Kurve in Richtung derer verzerrt wird. Ich hoffe jemand versteht hier was ich meine.

Um es besser zu veranschaulichen:

Ist es möglich mit einer Kubischen Interpolation die linke Hälfte eines Kreises, d.h den Halbkreis vom 2 und 3ten Quadranten zu interpolieren, wenn ich mal vom Einheitskreis ausgeh(zu einer x-Koord gibts ja bekanntlich dann 2 y-Koord).

Danke

Gezeichnet wird das ganze in OpenCv
 
Zuletzt bearbeitet:
hier ein snippet was ich mal noch vor 10 jahren geschrieben habe. hat alles gefunzt.

Code:
///////////////////////////////////////////////////////////////////////////////
///   this function returns a interpolated value from 4 given
///   values at time t, with t element of [0..1).
///
function TKeyFrameInterpolation.CubicInterpolate(const arr: array of GLDouble; t: GLDouble): GLDouble;
var
  a: array[0..3] of GLDouble;
begin
  a[0] := arr[3] - arr[2] - arr[0] + arr[1];
  a[1] := arr[0] - arr[1] - arr[0];
  a[2] := arr[2] - arr[0];
  a[3] := arr[1];

  result := a[0]*t*t*t + a[1]*t*t + a[2]*t + a[3];
end;

schickst also erst ein array der länge 4 mit den x werten rein, bekommst ein interpoliertes x'. danach y[4], danach z[4]. denke mal nach c++ bekommst es in 3 minuten selbst übersetzt.

schöne grüße

asso, falls diese funktion nur im ersten quadranten funktionieren sollte, dann schiebe einfach alle deine punkte aus den übrigen quadranten mit einem festen offset in den ersten. nach der interpolierung zieh von denen den offset wieder ab.
 
Zuletzt bearbeitet:
Danke mal für den Code,

wirkt aber für mich nicht gerade sehr rund die Interpolation. Hatte mir bei Wikipedia etc. mal nachgeschaut. Hatte es also mit erster und zweiter Ableitung gemacht nur hab ich wie gesagt das Problem
 
Anbei das kompilierte Beispiel als Download.

Nachdem du die Anwendung gestartet hast, klicke auf den großen Button - dir erscheint dann ein OpenGL-Fenster. Wenn dieses Fenster nun den Fokus hat, drücke einmal die Space-Taste auf der Tastatur. Danach kannst dich über die WASDQE-Tasten und mit der Mouse frei in dem 3D-Raum bewegen. Fliege zum "Assignment Nr3", wirst sehen wie die Interpolation funktioniert.

Schöne Grüße

Edit: Falsche Datei hochgeladen. Sollte nun gehen.
 
Zuletzt bearbeitet:
Code:
  a[1] := arr[0] - arr[1] - arr[0];
Öh, kommt da nicht einfach -arr[1] raus?
 
habs mal von irgend einem paper abgeschrieben. musste schnell gehen :)
Ergänzung ()

hier die korrekte formel
 
Zurück
Oben