Etape 3 - Définir un chemin pour dessiner le polygone

De RAD Studio
Aller à : navigation, rechercher

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

  1. Créez un objet TPath.
  2. Utilisez MoveTo pour le point de départ (①).
  3. Accédez à chaque sommet avec LineTo (②, ③ et ④).
  4. Fermez le chemin.

Polgyongdrawing.png


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;

Précédent

Suivant