![]() |
Bezier-Kurve?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Miteinander!
Ich frage mich gerade ob nicht jemand "zufällig" sowas mal geschrieben hat: Eine Linie, die Endpunkte sind durch entsprechende Koordinaten gegeben, die aber so einen 'Schlenker' besitzt (in der Abbildung zu sehen). Vermutlich irgendetwas mit Bezier -- aber ich wäre um jeden weiteren Kommentar dankbar: Wie mach man sowas? (Also ohne den Pfeil und den Kreis -- es es geht nur um die 'Kurve'). Lieben Dank Gruß Jazzman |
AW: Bezier-Kurve?
![]() |
AW: Bezier-Kurve?
Zitat:
ja, das hatte ich befürchtet :pale: -- denn ich habe nicht den blassesten Schimmer, wie ich das mit PolyBezier hinbekomme... Dennoch vielen Dank Jazzman |
AW: Bezier-Kurve?
Hallo,
ich hab mal ein Fenster über eine Bezierkurve bewegt. Ich hab das damals in einem Timer durchgeführt.
Delphi-Quellcode:
Wobei dies eine "Quadratische Bézierkurven (n=2)" ist (laut Wiki)
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; Ein interessantes Kapitel findet man auch unter: ![]() |
AW: Bezier-Kurve?
Das sollte als Starthilfe genügen, oder?
Nimm eine TForm und klatsch ein TImage drauf. Dann:
Delphi-Quellcode:
HTH W.
procedure TForm1.FormCreate(Sender: TObject);
const SEITENRAND = 10; var lap: array[0..3] of TPoint; begin Image1.SetBounds(0, 0, 600, 300); lap[0].X := Image1.Width - SEITENRAND; lap[0].Y := SEITENRAND; lap[1].X := Image1.Width div 15; lap[1].Y := SEITENRAND; lap[2].X := Image1.Width div 15 * 14; lap[2].Y := Image1.Height - SEITENRAND; lap[3].X := SEITENRAND; lap[3].Y := Image1.Height - SEITENRAND; Image1.Canvas.Brush.Color := clWhite; Image1.Canvas.FillRect(Rect(0, 0, Image1.Width, Image1.Height)); Image1.Canvas.Pen.Color := clBlack; Image1.Canvas.Pen.Width := 3; Image1.Canvas.PolyBezier(lap); Image1.Canvas.Ellipse(lap[0].X-3, lap[0].Y-3, lap[0].X+3, lap[0].Y+3); Image1.Canvas.Ellipse(lap[1].X-3, lap[1].Y-3, lap[1].X+3, lap[1].Y+3); Image1.Canvas.Ellipse(lap[2].X-3, lap[2].Y-3, lap[2].X+3, lap[2].Y+3); Image1.Canvas.Ellipse(lap[3].X-3, lap[3].Y-3, lap[3].X+3, lap[3].Y+3); Image1.Canvas.TextOut(lap[0].X-20, lap[0].Y+ 3, 'Start'); Image1.Canvas.TextOut(lap[1].X , lap[1].Y+ 3, 'Steuerpunkt 1'); Image1.Canvas.TextOut(lap[2].X-40, lap[2].Y-20, 'Steuerpunkt 2'); Image1.Canvas.TextOut(lap[3].X , lap[3].Y-20, 'Ende'); end; |
AW: Bezier-Kurve?
Zitat:
Genau das, was ich als 'Anfahrhilfe' gesucht habe! Wirklich klasse -- vielen Dank! Gruß Jazzman |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz