AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bezier-Kurve?

Ein Thema von Jazzman_Marburg · begonnen am 14. Apr 2011 · letzter Beitrag vom 15. Apr 2011
Antwort Antwort
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#1

Bezier-Kurve?

  Alt 14. Apr 2011, 14:02
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
Miniaturansicht angehängter Grafiken
bezier.jpg  
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Bezier-Kurve?

  Alt 14. Apr 2011, 14:07
Delphi-Referenz durchsuchenCanvas.PolyBezier dürfte genau dies tun.
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#3

AW: Bezier-Kurve?

  Alt 14. Apr 2011, 15:24
Delphi-Referenz durchsuchenCanvas.PolyBezier dürfte genau dies tun.
Hallo,
ja, das hatte ich befürchtet -- denn ich habe nicht den blassesten Schimmer, wie ich das mit PolyBezier hinbekomme...

Dennoch vielen Dank
Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 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
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Bezier-Kurve?

  Alt 14. Apr 2011, 16:52
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.

Geändert von ConnorMcLeod (14. Apr 2011 um 21:01 Uhr) Grund: Punkte und Beschriftung dazu
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#6

AW: Bezier-Kurve?

  Alt 15. Apr 2011, 13:58
Das sollte als Starthilfe genügen, oder?
HTH W.
Supieh!

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

Wirklich klasse -- vielen Dank!

Gruß
Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:43 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