ステップ 3 - 多角形を描画するパスを定義する

提供: Appmethod Topics
移動先: 案内検索

FireMonkey のプリミティブ コントロールを作成する への移動

多角形を描画するには、描画操作のパスを定義する必要があります。パスを定義すると、Canvas オブジェクトはそのパスを塗りつぶすことができます。

概要:パスを作成して閉じる

  1. TPath オブジェクトを作成します。
  2. MoveTo を使用して始点に移動します(図中の①)。
  3. LineTo を使用して各頂点を経由します(②、③、④)。
  4. パスを閉じます。

Polgyongdrawing.png


以下のメンバの定義を追加する必要があります(既に作成したメンバはここに示していません。前のステップを参照してください)。

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

この目的は次のとおりです。

  • コンストラクタで TPathData のインスタンス(FPath フィールド)を作成する。
  • CreatePath でパス情報を FPath フィールドに設定する。
  • Paint メソッドおよび PointInObject メソッドでパス情報を使用する(後述)。
  • デストラクタで FPath フィールドのインスタンスを破棄する。

これまでのステップと同様に、Ctrl+Shift+C を押すとメソッドのプレースホルダが作成されます。メソッドを次のように実装します。

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);

  // 新しいパスを作成する
  FPath.Clear;

  // MoveTo で始点へ移動する
  GoToAVertex(0, Angle, CircumRadius, False);

  // LineTo で各頂点へ線を引く
  for i := 1 to FNumberOfSides do
    GoToAVertex(i, Angle, CircumRadius);

  FPath.ClosePath;
end;

次の uses 句を追加する必要があります。

uses
System.Math, System.Types;

前のステップ

次のステップ