Hallo,
ich hab mal ein Fenster über eine Bezierkurve bewegt.
Ich hab das damals in einem Timer durchgeführt.
Delphi-Quellcode:
const
const_max_count = 10;
procedure TSplashScreenForm.FormActivate(Sender: TObject);
begin
//Positionen für die Bézierkurve angeben
P0.X := Left; //Startposition X
P0.Y := Top; //Startposition Y
P2.X := 50; //Endposition X
P2.Y := 50; //Endposition Y
P1.X := (P0.X - P2.X) div 2; //Kontrollpunkt X
P1.Y := (P0.Y - P2.Y) div 2; //Kontrollpunkt Y
//prüfen welche Position von P0 oder P2 größer ist, und dann diese Position
//auf P1 draufrechnen
If P0.Y > P2.Y then
P1.Y := P1.Y + P0.Y
else
P1.Y := P1.Y + P2.Y;
//Variablen vordefinieren
count := 1;
end;
procedure TSplashScreenForm.Timer_BewegungTimer(Sender: TObject);
var
t: Real;
begin
If Count <= const_max_count then
begin
//Bézierkurve berechnen
//Formel: C(t) = (1 - t)² * P0 + 2 * t * (1 - t) * P1 + t² * P2
//http://de.wikipedia.org/wiki/B%C3%A9zierkurve#Quadratische_B.C3.A9zierkurven_.28n.3D2.29
t := Count / const_max_count;
Left := Round(Sqr(1 - t) * P0.X + 2 * t * (1 - t) * P1.X + Sqr(t) * P2.X);
Top := Round(Sqr(1 - t) * P0.Y + 2 * t * (1 - t) * P1.Y + Sqr(t) * P2.Y);
//Variable um eins erhöhen
inc(count);
end
else
//Timer beenden
Timer_Bewegung.Enabled := false;
end;
Wobei dies eine "Quadratische Bézierkurven (n=2)" ist (laut Wiki)
Ein interessantes Kapitel findet man auch unter:
Wikipedia
mfg
Helmi
>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<