Thema: Delphi Spline Linien zeichnen

Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#17

Re: Spline Linien zeichnen

  Alt 13. Mai 2008, 00:35
Jap, das sind Bézier-Splines 3. Grades. Material dazu hatte ich hier schon mal verlinkt, und auch der Wikipedia-Eintrag ist nicht schlecht.
Ich ging davon aus, dass du die Aufnahme ohne Interaktivität rekonstruieren lassen möchstest. Wenn du aber die Handarbeit in ein möglichst gutes Ergebnis investieren willst, dann lohnen sich Bézier-Splines schon eher.

Da aber auch gleich mal eine Warnung vorab, womit ich schon mal böse zu kämpfen hatte: Der Laufparameter, quasi das X der Splinefunktion, führt auch bei gleichschrittiger Erhöhung nicht zu equidistanten interpolierten Punkten bezogen auf die Zeitachse deines Waves! Das heisst, dass du, wenn du das annimmst, ein verzerrtes Spline erhälst. In deinem Fall kann die Verzerrung klein genug ausfallen, um das zu ignorieren, aber generell müsste man hier einen Zwischenschritt machen, der die Kurve zunächst zu hoch aufgelöst in ein kartesisches Bezugssystem schreibt (z.B. ein Bitmap geeigneter Größe), und aus diesem kann man dann die Kurve übertragen. Oder anders gesagt: Du wirst deine interpolierten Punkte nicht mit schön gleichbleibendem ganzzahligen X erhalten, was du direkt auf deine Zeitachse beziehen kannst. Mann könnte es impizit gestalten, indem man Schnitte mit den senkrechten Linien durch alle fehlenden X-Stellen mit der Splinefunktion bildet, der Aufwand dafür ist aber schon nicht übel (LGS lösen und so). Hm, klingt jetzt kompliziert, ist aber sehr einfach zu verstehen. **

Wenn dein grafischer Editor, bzw. das Bild deiner Aufnahme ohnehin schon die Basis für die dann gespeicherten Daten ist, hast du diesen Schritt quasi schon frei Haus fertig.


**) Mein Code zum Spline Berechnen:
Delphi-Quellcode:
function BezierPoint(pt0, pt1, pt2, pt3: TPoint; t: Double): TPoint;
var
  t0, t1, t2, t3: Double;
  oneMt, tp2, oneMtp2: Double;
begin
  oneMt := 1-t;
  tp2 := t*t;
  oneMtp2 := oneMt*oneMt;
  t0 := oneMtp2*oneMt;
  t1 := 3*t*oneMtp2;
  t2 := 3*tp2*oneMt;
  t3 := tp2*t;
  result.x := Round(t0 * pt0.x + t1 * pt1.x + t2 * pt2.x + t3 * pt3.x);
  result.y := Round(t0 * pt0.y + t1 * pt1.y + t2 * pt2.y + t3 * pt3.y);
end;
Das t ist die Laufvariable, mit der zwischen den Grenzen des Splines die interpolierten Werte errechnet werden. t liegt zwischen 0 und 1.
Für t=0 ist result = pt0
Für t=1 ist result = pt3.
pt1 und pt2 sind die 2 Kontrollpunkte.

Erhöht man t nun gleichmäßig wie im angehängten Bild (zur Verdeutlichung nur mit 32 Schritten), ergibt sich auf der X-Achse keine gleichmäßige Verteilung der interpolierten Punkte. Das ist, was ich da oben zu beschreiben versuche
Miniaturansicht angehängter Grafiken
spline_194.png  
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat