AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
DelphiXE3 [FMX] 多角形描画 2014/05/22
 
多角形描画(ポリゴン描画;DrawPolygon)は、キャンバス(Canvas)に 複数点間の連続線を描画する機能です。
 
以下、ヘルプより
TCanvas.
DrawPolygon
procedure DrawPolygon(const Points: TPolygon;
 const AOpacity: Single);
多角形 を、現在の TCanvas 上に描画します。
 
DrawPolygon は、TPolygon 頂点間の TPathData で表される多角形を、現在の Stroke で描画します。
 
Points パラメータは、描画される TPolygon の頂点を示します。
 
AOpacity パラメータは、Stroke 色の透明度を示します。
 
Points 配列の最初の点と最後の点が一致しない場合、多角形の最後の辺は描画されません。
 
Points 配列が空の場合、DrawPolygon は何も行いません。DrawPolygon は、この場合、例外を発生させません。
 
描画ペンをカスタマイズするには、Strocke、StrokeThickness、StrokeCap、StrokeDash、 および StrokeJoin の各プロパティを使用します。
ヘルプ内に「TPathData で表される多角形を」とありますが、この機能では、TPathData は関係無いと思われます。
 
[Shapes]内のペイントボックス(PaintBox)を配置し、ClipChildernプロパティを True にしておきます。uses節に「UIConsts」を追記します。

OnPaintイベントハンドラを下記のようにしてみます。
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
 pt : TPolygon ;
begin
 SetLength(pt, 4);
 pt[0] := PointF(10,20);
 pt[1] := PointF(140,20);
 pt[2] := PointF(75,130);
 pt[3] := PointF(10,20);
 with Canvas do begin
  Clear(claWhite);
  Stroke.Kind := TBrushKind.bkSolid ;
  Stroke.Color := claBlue ;
  DrawPolygon(Pt,1.0);
 end;
 pt := nil ;
end;
保存・ビルド(コンパイル)・実行をすると下図のようになります。

4頂点(10,20)〜(140,20)〜(75,130)〜(10,20)を結ぶ、透過率 1.0 (完全不透明状態)で青色の多角形を描画します。
「ポリゴン」といっても、最後の点を明示しないと図形は閉じられません。つまり、最後の点が最初の点と同じではない場合は多角形ではなく連続線となりますので、どちらかといえば「ポリライン」と言えるかもしれません。
 
多角形(連続線)は、直前までに指定した Strokeブラシの状態で描画します。
Stroke.Kind でブラシの種類(色、ビットマップ、グラデーション)、
Stroke.Thickness で線幅、
Stroke.Dash で線種、
Stroke.Cap で線端状態、
Stroke.Join で結合部状態、
を指定します。
 
例えば下記のようにすると、
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
 pt : TPolygon ;
begin
 SetLength(pt, 4);
 pt[0] := PointF(10,20);
 pt[1] := PointF(140,20);
 pt[2] := PointF(75,130);
 pt[3] := PointF(10,20);
 with Canvas do begin
  Clear(claWhite);
  Stroke.Kind := TBrushKind.bkGradient ;
  Stroke.Gradient.Color := claRed ;
  Stroke.Gradient.Color1 := claYellow ;
  Stroke.Thickness := 10 ;
  Stroke.Dash := TStrokeDash.sdDash ;
  Stroke.Cap := TStrokeCap.scRound ;
  Stroke.Join := TStrokeJoin.sjBevel ;
  DrawPolygon(Pt,1.0);
 end;
 pt := nil ;
end;
下図のように描画されます。

 
結合部状態 Join は、第1点&最終点では処理されていません。元々が連続線の機能である様子なので予想は出来ましたが、図形の描画としてはイマイチ感が残りますので、注意が必要です(※後述のパス図形描画(DrawPath)でもパスデータ文字列で閉じる(Z)指定をしない場合には同様となります)。気になる場合は、頂点の指定の仕方を変えてみる、という事です。例えば、第1点・最終点を、直線部分の中間点にしてみる等です。破線状態だと少し分かりにくいので実線状態にしておきます。
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
 pt : TPolygon ;
begin
 SetLength(pt, 5);
 pt[0] := PointF(75,20);
 pt[1] := PointF(140,20);
 pt[2] := PointF(75,130);
 pt[3] := PointF(10,20);
 pt[4] := PointF(75,20);
 with Canvas do begin
  Clear(claWhite);
  Stroke.Kind := TBrushKind.bkGradient ;
  Stroke.Gradient.Color := claRed ;
  Stroke.Gradient.Color1 := claYellow ;
  Stroke.Thickness := 20 ;
  Stroke.Dash := TStrokeDash.sdSolid ;
  Stroke.Cap := TStrokeCap.scRound ;
  Stroke.Join := TStrokeJoin.sjBevel ;
  DrawPolygon(Pt,1.0);
 end;
 pt := nil ;
end;
保存・コンパイル・実行すると、下図のようになります。

 
 
第2引数 AOpacity 、透過率を指定する事が出来ます。
0.0(完全透明)〜1.0(完全不透明)の範囲内で指定します。
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
 pt1, pt2 : TPolygon ;
begin
 SetLength(pt1, 4);
 pt1[0] := PointF(20,20);
 pt1[1] := PointF(100,20);
 pt1[2] := PointF(60,100);
 pt1[3] := PointF(20,20);
 
 SetLength(pt2, 5);
 pt2[0] := PointF(80,130);
 pt2[1] := PointF(120,130);
 pt2[2] := PointF(80,40);
 pt2[3] := PointF(40,130);
 pt2[4] := PointF(80,130);
 
 with Canvas do begin
  Clear(claWhite);
  Stroke.Thickness := 20 ;
  Stroke.Kind := TBrushKind.bkSolid ;
  Stroke.Color := claBlue ;
  DrawPolygon(Pt1, 0.5);
  Stroke.Color := claRed ;
  DrawPolygon(Pt2, 0.5);
 end;
 pt1 := nil ;
 pt2 := nil ;
end;
とした場合は、下図のようになります。

 
 
なお、キャンバス Canvas の Fill プロパティを指定しても、塗り潰しは行われません。塗り潰しを行いたい場合は、塗り潰しの部分を別途、DrawPolygon メソッドを実行する直前に FillPolygon メソッドを利用して描画させて下さい。
 
 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Dehi入門編
>Delphi2010
>DelphiXE3
▲2014/05/21
 2014/05/22
▼2014/05/23
 
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.