ステップ 3 - 多角形を描画するパスを定義する
FireMonkey のプリミティブ コントロールを作成する への移動
多角形を描画するには、描画操作のパスを定義する必要があります。パスを定義すると、Canvas オブジェクトはそのパスを塗りつぶすことができます。
概要:パスを作成して閉じる
以下のメンバの定義を追加する必要があります(既に作成したメンバはここに示していません。前のステップを参照してください)。
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;