BGRABitmap tutorial 7/de

From Free Pascal wiki
Jump to: navigation, search

Deutsch (de) | English (en) | Français (fr) | Español (es) | Edit

Home | Tutorial 1 | Tutorial 2 | Tutorial 3 | Tutorial 4 | Tutorial 5 | Tutorial 6 | Tutorial 7 | Tutorial 8 | Tutorial 9 | Tutorial 10 | Tutorial 11 | Tutorial 12 | Tutorial 13 | Tutorial 14 | Tutorial 15 | Tutorial 16 | Edit

Dieses Tutorial zeigt, wie Sie Splines verwenden können.

Erzeugen Sie ein neues Projekt

Erzeugen Sie ein neues Projekt und fügen Sie eine Referenz auf BGRABitmap hinzu, genau so wie im ersten Tutorial.

Zeichnen Sie ein offenes Spline

Im Objektinspektor fügen Sie einen OnPaint-Handler hinzu und schreiben Sie:

procedure TForm1.FormPaint(Sender: TObject);
var
  image: TBGRABitmap;
  pts: array of TPointF;
  storedSpline: array of TPointF;
  c: TBGRAPixel;
 
begin
    image := TBGRABitmap.Create(ClientWidth,ClientHeight,ColorToBGRA(ColorToRGB(clBtnFace)));
    c := ColorToBGRA(ColorToRGB(clWindowText));
 
    //rechteckige Polylinie
    setlength(pts,4);
    pts[0] := PointF(50,50);
    pts[1] := PointF(150,50);
    pts[2] := PointF(150,150);
    pts[3] := PointF(50,150);
    image.DrawPolylineAntialias(pts,BGRA(255,0,0,150),1);
 
    //berechnet die Splinepunkte und zeichnet sie als Polylinie
    storedSpline := image.ComputeOpenedSpline(pts);
    image.DrawPolylineAntialias(storedSpline,c,1);
 
    image.Draw(Canvas,0,0,True);
    image.free;  
end;

Mit zwei Zeilen zeichnen Sie das Spline. Die erste Zeile berechnet die Splinepunkte und die zweite zeichnet sie. Beachte Sie, dass es eine besondere Funktion für offene Splines gibt.

Zeichnen Sie ein geschlossenes Spline

Fügen Sie vor 'image.Draw' diese Zeilen ein:

    for i := 0 to 3 do
      pts[i].x += 200;
    image.DrawPolylineAntialias(pts,BGRA(255,0,0,150),1);
 
    storedSpline := image.ComputeClosedSpline(pts);
    image.DrawPolygonAntialias(storedSpline,c,1);

Gehen Sie mit dem Textcursor auf den Bezeichner 'i' und drücken Sie Strg-Umsch-C, um die Variablendeklaration hinzuzufügen. Die Schleife durchläuft die Punkte der rechten Hälfte.

Zwei neue Zeilen zeichnen ein geschlossenes Spline. Beachten Sie die besondere Funktion zum Berechnen geschlossener Splines und den Aufruf von 'DrawPolygonAntialias'.

So vermeiden Sie, dass zum Speichern der Splinepunkte eine Variable benutzt wird:

image.DrawPolygonAntialias(image.ComputeClosedSpline(pts),c,1);

Allerdings können Sie dadurch die berechneten Punkte nicht mehrfach verwenden. Sie müssen bei jedem Einsatz neu berechnet werden.

Starten Sie das Programm

Dies zeichnet zwei Splines, links ein offenes und rechts ein geschlossenes.

BGRATutorial7.png

Beachten Sie, dass das Spline durch jeden Punkt geht. Wenn Sie wollen, dass die Kurve innen bleibt oder wenn Sie Tangenten definieren, dann brauchen Sie Kontrollpunkte. Diese stehen Ihnen bei Bézierkurven zur Verfügung.

Verwendung von Bézierkurven

Fügen Sie vor 'image.Draw' diese Zeilen ein:

    storedSpline := image.ComputeBezierSpline([BezierCurve(PointF(50,50),PointF(150,50),PointF(150,100)),
                                               BezierCurve(PointF(150,100),PointF(150,150),PointF(50,150))]);
    image.DrawPolylineAntialias(storedSpline,c,2);

Die Funktion 'BezierCurve' definiert eine Kurve mit einem Anfangs- und einem Endpunkt und ein bis zwei Kontrollpunkten. Hier im Beispiel ist es nur ein Kontrollpunkt. Die Kontrollpunkte sind so definiert, dass die Kurve das vorher festgelegte Rechteck berührt.

Ein Bézierspline ist einfach eine Folge von Bézierkurven. Deshalb hängt die Funktion 'ComputeBezierSpline' ein Array von Bézierkurven aneinander. Hier konstruieren wir eine nette U-Form mittels zweier Kurven.

Starten Sie das Programm

Sie sehen eine fette Bézierkurve innerhalb des linken Rechtecks.

BGRATutorial7b.png

Voriges Tutorial (Linienarten) | Nächstes Tutorial (Texturen)