In meinem
Progrämmchen RiB habe ich den De Casteljau Algo recht flott implementiert. Sollte sich
imho ganz gut daraus übernehmen lassen.
\\edith: Hier mal die wichtige Funktion
Delphi-Quellcode:
function BezierPoint(pt: TBezierSet; t: Double): TFloatPoint;
var
t0, t1, t2, t3: Double;
oneMt, tp2, oneMtp2: Double;
begin
oneMt := 1-t;
tp2 := sqr(t);
oneMtp2 := sqr(oneMt);
t0 := oneMtp2*oneMt;
t1 := 3*t*oneMtp2;
t2 := 3*tp2*oneMt;
t3 := tp2*t;
result.x := t0 * pt[0].x +
t1 * pt[1].x +
t2 * pt[2].x +
t3 * pt[3].x;
result.y := t0 * pt[0].y +
t1 * pt[1].y +
t2 * pt[2].y +
t3 * pt[3].y;
end;
TBezierSet ist ein array[0..3] of TFloatPoint, wobei TFloatPoint ein record mit x,y
ouble ist.
In pt werden hier die 4 Kontrollpunkte der Kurve übergeben, und mit t (0..1) "wandert" man über die Kurve. Um das zu zeichnen muss man diese Funktion also nur in einer Schleife über t aufrufen, und die zurückgelieferten Punkte mit LineTo verbinden. Die Schrittgröße von t bestimmt somit die Genauigkeit (Eckigkeit) des Ergebnisses, und damit auch den Performancehunger
\\edith2: *hust* naja, der De Casteljau isses ja garnicht so richtig. Viel mehr eine günstig zerlegte Variante der o.g. Formel. Wie viel schneller De Castelljau im Vergleich dazu ist, weiss ich leider nicht. Aber mir hat die Funktion zumindest bisher immer brav Beziér Kurven geliefert ^^
\\edit3: Eigentlich kann man mit Beziér Kurven über mehr als nur 4 Punkte annähern, nämlich beliebig vielen. Der Aufwand dafür ist, wenn ich mich recht erinnere, allerdings O(n²), und mit Algo nach De Casteljau O(n*log(n)).
Man wählt jedoch oft die Darstellung durch 4 Kontrollpunkte, da sich damit die lokale Kontrolle in der Kurve deutlich verbessert, und stückelt mehrere 4-Punkt Kurven zu einer komplexeren zusammen, wobei der jeweils 2. und 3. Kontrollpunkt die Tangente in dem Anfangs- und Endpunkt erzeugt. Dadurch kann man auch bei gestückelten Kurven recht einfach weiche Übergänge erzielen.
Wenn du aber nun tatsächlich Kurven über eine variable Anzahl von Kontrollpunkten möchtest, lohnt es sich sicher De Casteljau i.e.S. implementieren, und keine auf 4 Punkte spezialisierte Form. Dazu gibt es massig, und auch gute Infos im Netz (z.B. Wikipedia ist echt brauchbar in dem Punkt).
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel