• 検索結果がありません。

繝輔Λ繧ッ繧ソ繝ォ蝗ウ蠖「

N/A
N/A
Protected

Academic year: 2021

シェア "繝輔Λ繧ッ繧ソ繝ォ蝗ウ蠖「"

Copied!
6
0
0

読み込み中.... (全文を見る)

全文

(1)

9

フラクタル図形

再帰手続きを使うと,簡単なプログラムで,複雑で面白い図形を描くことができます。 前回の講義の数列(むしろ文字列) C9= 121312141213121512131214 · · · には同じ部分列(た とえば,1213121)が何回も繰り返して現れます。 これを文字ではなく図形にするわけです。すると,自分自身に相似な図形が中に何重にも入り組 んで現れる面白いフラクタル図形が描かれます。

9.1

プログラムの準備

9.1.1 新規プログラムを保存                   フォルダー Fractal ユニット FractalU.pas プロジェクト FractalP.dpr 9.1.2 フォーム                   Name FormFractal Caption フラクタル図形(学生証番号,氏名) WindowState wsMaximized 9.1.3 メインパネルと終了ボタン いつものように,PanelMain と ButtonClose を配置。 9.1.4 描画基本命令

Delphi に元々用意されている MoveTo(x,y), LineTo(x,y) は行き先の座標 (x, y) を指定しま す。フラクタル図形を描くときは,進行方向 θ と距離 d を指定すると便利なので,そのためのメ ソッドを定義します。なお,今回は Image を使わないで Form の Canvas に描画します。その理 由は,描いている途中の様子を見たいからです。Image の Canvas に描くと図が完成するまで表示 されませんが,Form の Canvas に描くと途中も表示されます。 TFormFractal の宣言部に追加 private XNow,YNow : Real; // 現在の位置 public

procedure StandBy(X,Y : Integer); // 出発点を指定する。

procedure Move(Muki,Kyori : Real); // Muki方向にKyoriだけ進む

(2)

実現部を書く

implementation {£R *.DFM}

(******************** 一般のプロシージャ ********************)

(******************** フォームのメソッド ********************)

procedure TFormFractal.StandBy(X,Y : Integer);

(* 出発点を指定する。 *) begin Canvas.MoveTo(X,Y); XNow := X; YNow := Y; end; (* StandBy *)

procedure TFormFractal.Move(Muki,Kyori : Real); (* Muki方向にKyoriだけ進む *)

begin

XNow := XNow + Kyori*Cos(Muki); YNow := YNow + Kyori*Sin(Muki);

Canvas.MoveTo(Round(XNow),Round(YNow)); end; (* Move *)

procedure TFormFractal.Line(Muki,Kyori : Real); (* Muki方向にKyoriだけ線を引く *) begin

XNow := XNow + Kyori*Cos(Muki); YNow := YNow + Kyori*Sin(Muki);

Canvas.LineTo(Round(XNow),Round(YNow)); end; (* Line *)

9.1.5 消去ボタンと描画ボタン Buttone を 2 つメインパネルに置く。

        Name         ButtonClear ButtonDraw Caption 消去 (&C) 描画 (&D) ButtonClear の OnClick ハンドラー

procedure TFormFractal.ButtonClearClick(Sender: TObject); begin with Canvas do begin Brush.Color := clWhite; FillRect(ClipRect); end; end; (* ButtonClearClick *) ButtonDraw の OnClick ハンドラー フラクタル図形を描く前に,基本描画命令を理解するテストとして正多角形を描いてみましょ う。この基本描画命令を使うと正多角形を簡単に描くことができます。

(3)

procedure TFormFractal.ButtonDrawClick(Sender: TObject); var Muki : Real; N,K : Byte; begin N := 9; // 頂点の数を指定する StandBy(200,100); // 始点 Muki := 0; // 最初の向き for K := 1 to N do begin Line(Muki,100); // 長さ100の線を引く Muki := Muki+2*Pi/N; // 向きを 360゜/N 変える end; end; (* ButtonDrawClick *) 問題 これを次のように変更するとどんな図を描くでしょう。実行する前に,どんな図になるか考えて ください。

procedure TFormFractal.ButtonDrawClick(Sender: TObject); var Muki : Real; N,K : Byte; begin N := 9; // 頂点の個数を指定する StandBy(200,100); // 始点 Muki := 0; // 最初の向き for K := 1 to 100 do (*_*) // N を 100 に変更 begin Line(Muki,100-K); (*_*) // 100 を 100-K に変更 Muki := Muki+2*Pi/N; // 向きを 360/N 変える end; end; (* ButtonDrawClick *)

(4)

9.2

コッホ曲線 (Koch Curve)

9.2.1 作り方 (1) 1 本の線分を,長さが 1 3 の線分 4 本か らなる折れ線で置き換える。 (2) その 4 本の線分を,また同様の折れ線 で置き換える。 (3) 以下同様。 9.2.2 再帰手続き Koch TFormFractal のメソッドとして追加。 end; (* Line *)

procedure TFormFractal.Koch(Level : Byte; Muki,Nagasa : Real);

(* Muki方向に長さNagasaのレベルLevelコッホ曲線を描く(再帰) *) begin

if Level <= 1

then Line(Muki,Nagasa) // 実際に線を引く

else begin // 長さ1/3,Level-1 コッホ曲線を描く

Koch(Level-1,Muki,Nagasa/3); // 指定方向に描く Koch(Level-1,Muki-Pi/3,Nagasa/3); // 左に60゜方向に描く Koch(Level-1,Muki+Pi/3,Nagasa/3); // 右に60゜方向に描く Koch(Level-1,Muki,Nagasa/3); // 指定方向に描く end; end; (* Koch *) 9.2.3 コッホ曲線を描くメソッド end; (* Koch *)

procedure TFormFractal.DrawKoch(Level : Byte); (* レベルLevel-コッホ曲線を描く *) begin

StandBy(300,200); // 始点

Koch(Level,Pi/6,400); // コッホ曲線

(5)

9.2.4 描画ボタンの OnClick ハンドラー変更

procedure TFormFractal.ButtonDrawClick(Sender: TObject); begin DrawKoch(2); end; (* ButtonDrawClick *) 9.2.5 実行 始点,向き,長さ,レベルを書き換えて実行してみましょう。 9.2.6 レベル指定 実行時にレベルを変えられるようにします。 Panel をメインパネルの中に置く。                   Align alTop Alignment alLeftJustify Name PanelLevel Caption □レベル (□は全角空白) Edit を PanelLevel の中央に置く。         Name         EditLevel Text 1 Win32/UpDown を EditLevel の右に置く。                   Name UpDownLevel Min 1 Max 10 Associate EditLevel

Associate を EditLevel にすると,UpDownLevel の Position の値と EditLevel の Text が連動 します。一方を変更すると他方に反映されます。

9.2.7 描画ボタンの OnClick ハンドラー変更

procedure TFormFractal.ButtonDrawClick(Sender: TObject);

var Level : Byte; begin Level := UpDownLevel.Position; DrawKoch(Level); UpDownLevel.Position := Level+1; // 自動的にレベルをアップする end; (* ButtonDrawClick *)

(6)

9.2.8 実行 EditLevel に直接数を入れて変更することも,UpDownLevel で数を変更することもできること を確認しなさい。EditLevel に 1∼10 以外の数を入れるとどうなりますか。

9.3

問題

コッホ曲線を 3 つ正三角形状に描くと面白い 図ができます。向きが影響するので,右図の 矢印の順に進むように,3 つ描きます。レベ ル 1 のときはこの正三角形が描かれます。レ ベルが大きいとき,どんな図形になるか,実 行前に考えてみましょう。 -          / S S S S S S S S S S o 9.3.1 メソッド KochThree を追加 end; (* DrawKoch *)

procedure TFormFractal.KochThree(Level : Byte);

(* 正三角形状にコッホ曲線を3つ描く *) begin (* 正三角形状に描く *) (* 内部を水色で塗りつぶす *) end; (* KochThree *) 9.3.2 描画ボタンの OnClick ハンドラーを変更

procedure TFormFractal.ButtonDrawClick(Sender: TObject); var Level : Byte; begin Level := UpDownLevel.Position; // DrawKoch(Level); KochThree(Level); UpDownLevel.Position := Level+1; // 自動的にレベルをアップする end; (* ButtonDrawClick *) 9.3.3 実行 どんな図形になりましたか。 三角形を逆向きに進んだ図も描いてみましょう。

参照

関連したドキュメント

We begin our proof of Theorem 2 by considering the enumeration of those degree sequences satisfying the criteria 1, 2, and 3a of Theorem 1 above.. of view, this means that the

○事 業 名 海と日本プロジェクト Sea級グルメスタジアム in 石川 ○実施日程・場所 令和元年 7月26日(金) 能登高校(石川県能登町) ○主 催

S63H元 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 0 1000 2000 3000 4000 5000 6000 清流回復を実施した発電所数(累計)

Grasshoppers 4 .4 to 8 .9 oz. spray per acre by ground or in 5 to10 gals. spray per acre by air. Begin applications when eggs or insects first appear and repeat as needed to maintain

※ Surface Pro 9、 Surface Pro 9 with 5G、 Surface Laptop 5、 Surface Studio 2+ の法人向けモデルには Microsoft 365 Apps

TCLKP_AB TCLKN_AB DOUT0P_A_AB DOUT0N_A_AB DOUT1P_A_AB DOUT1N_A_AB DOUT0P_B_AB DOUT0N_B_AB DOUT1P_B_AB

12‑2  ‑209  (香法 ' 9

1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月.