Thema: Bezier-Kurve?

Einzelnen Beitrag anzeigen

Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Bezier-Kurve?

  Alt 14. Apr 2011, 15:25
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! <<

Geändert von Helmi (14. Apr 2011 um 15:29 Uhr)
  Mit Zitat antworten Zitat