Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Bezier-Kurve? (https://www.delphipraxis.net/159827-bezier-kurve.html)

Jazzman_Marburg 14. Apr 2011 13:02

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

mleyen 14. Apr 2011 13:07

AW: Bezier-Kurve?
 
Delphi-Referenz durchsuchenCanvas.PolyBezier dürfte genau dies tun.

Jazzman_Marburg 14. Apr 2011 14:24

AW: Bezier-Kurve?
 
Zitat:

Zitat von mleyen (Beitrag 1095080)
Delphi-Referenz durchsuchenCanvas.PolyBezier dürfte genau dies tun.

Hallo,
ja, das hatte ich befürchtet :pale: -- denn ich habe nicht den blassesten Schimmer, wie ich das mit PolyBezier hinbekomme...

Dennoch vielen Dank
Jazzman

Helmi 14. Apr 2011 14:25

AW: Bezier-Kurve?
 
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

ConnorMcLeod 14. Apr 2011 15:52

AW: Bezier-Kurve?
 
Das sollte als Starthilfe genügen, oder?
Nimm eine TForm und klatsch ein TImage drauf. Dann:
Delphi-Quellcode:
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;
HTH W.

Jazzman_Marburg 15. Apr 2011 12:58

AW: Bezier-Kurve?
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1095124)
Das sollte als Starthilfe genügen, oder?
HTH W.

Supieh! :thumb:

Genau das, was ich als 'Anfahrhilfe' gesucht habe!

Wirklich klasse -- vielen Dank!

Gruß
Jazzman


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz