Etape 3 - Définir un chemin pour dessiner le polygone
Remonter à Création d'un contrôle primitif FireMonkey
Pour dessiner un polygone, vous devez définir un chemin pour l'opération de dessin. Après la définition du chemin, l'objet Canvas peut remplir et dessiner le chemin donné.
Résumé : Pour créer et fermer un chemin
- Créez un objet TPath.
- Utilisez MoveTo pour le point de départ (①).
- Accédez à chaque sommet avec LineTo (②, ③ et ④).
- Fermez le chemin.
Vous devez définir les membres supplémentaires suivants (les membres créés antérieurement ne sont pas listés ici ; voir les étapes précédentes) :
type
TRegularPolygon = class(TShape)
private
FPath: TPathData;
protected
procedure CreatePath;
public
destructor Destroy; override;
end;
Le but consiste ici à :
- Créer une instance de TPathData (champ FPath) dans le constructeur
- Définir les informations de chemin dans le champ FPath, dans CreatePath
- Utiliser les informations de chemin dans les méthodes Paint et PointInObject (traitées plus loin)
- Détruire l'instance du champ FPath dans le destructeur.
Comme dans les étapes précédentes, CTRL+MAJ+C
crée des espaces réservés pour ces méthodes. Implémentez ces méthodes comme suit :
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;
Notez que vous devez ajouter la clause uses suivante :
uses
System.Math, System.Types;