Schritt 3 - Definieren eines Pfades zum Zeichnen des Polygons
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:
- Erstellen Sie ein TPath-Objekt.
- Wechseln Sie zum Startpunkt (①).
- Gehen Sie mit der Prozedur LineTo alle Eckpunkte durch (②, ③ und ④).
- Schließen Sie den Pfad.
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;