Schritt 3 - Definieren eines Pfades zum Zeichnen des Polygons

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Erstellen eines grundlegenden FireMonkey-Steuerelements

Zum Zeichnen eines Polygons müssen Sie einen Pfad für die Zeichenoperation definieren. Sobald ein Pfad definiert ist, kann das Canvas-Objekt den Pfad füllen und zeichnen.

So erstellen und schließen Sie einen Pfad:

  1. Erstellen Sie ein TPath-Objekt.
  2. Wechseln Sie zum Startpunkt (①).
  3. Gehen Sie mit der Prozedur LineTo alle Eckpunkte durch (②, ③ und ④).
  4. Schließen Sie den Pfad.

Polgyongdrawing.png


Sie müssen die folgenden zusätzlichen Member definieren (Member, die zuvor erstellt wurden, sind hier nicht aufgeführt; siehe die vorherigen Schritte):

type
TRegularPolygon = class(TShape)
private
  FPath: TPathData;
protected
  procedure CreatePath;
public
  destructor Destroy; override;
end;

Damit soll Folgendes erreicht werden:

  • Erstellen einer Instanz von TPathData (FPath-Feld) im Konstruktor.
  • Setzen der Pfadinformationen auf das FPath-Feld in CreatePath.
  • Verwenden der Pfadinformationen in den Methoden Paint und PointInObject (wird später erläutert).
  • Freigeben der Instanz des FPath-Feldes im Destruktor.

Wie in den vorherigen Schritten werden mit STRG+UMSCHALT+C Platzhalter für diese Methoden erstellt. Implementieren Sie diese Methoden folgendermaßen:

constructor TRegularPolygon.Create(AOwner: TComponent);
begin
  inherited;
  FNumberOfSides := 3;
  FPath := TPathData.Create;
end;

destructor TRegularPolygon.Destroy;
begin
  FreeAndNil(FPath);
  inherited;
end;

procedure TRegularPolygon.CreatePath;
  procedure GoToAVertex(n: Integer; Angle, CircumRadius: Double; 
    IsLineTo: Boolean = True);
  var
    NewLocation: TPointF;
  begin
    NewLocation.X := Width  / 2 + Cos(n * Angle) * CircumRadius;
    NewLocation.Y := Height / 2 - Sin(n * Angle) * CircumRadius;

    if IsLineTo then
      FPath.LineTo(NewLocation)
    else
      FPath.MoveTo(NewLocation);
  end;
var
  i: Integer;
  Angle, CircumRadius: Double;
begin
  Angle        := 2 * PI / FNumberOfSides;
  CircumRadius := Min(ShapeRect.Width / 2, ShapeRect.Height / 2);

  // Create a new Path
  FPath.Clear;

  // MoveTo the first point
  GoToAVertex(0, Angle, CircumRadius, False);

  // LineTo each Vertex
  for i := 1 to FNumberOfSides do
    GoToAVertex(i, Angle, CircumRadius);

  FPath.ClosePath;
end;

Sie müssen die folgende uses-Klausel hinzufügen:

uses
System.Math, System.Types;

Zurück

Weiter