前回 でTGEditorの最終回としましたが、TGEditorが「独特な関数を用いた描画や、繰り返しネスティングの複雑な描画等には対応できないという限界が明白 」ということで、
「独特な関数を用いた描画や、繰り返しネスティングの複雑な描画等はこっちを使いましょう。」
と結びました。以下では↑の青字の典型であるフラクタル や、フラクタル樹形 を描画(末尾参照) してみましょう。
【TG_Ala_Carte.cs】
////////////////////////////
// TG_Ala_Carte.cs
// Copyright 2026 by Y-Sama
////////////////////////////
using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
using System.Reflection; //Assemblyを使う為
using Nakov.TurtleGraphics; //TurtleGraphicsを使う為
namespace TG_Ala_Carte
{
class Launcher
{
//エントリーポイント
[STAThread]
static void Main()
{
Application.Run(new TGAC());
}
}
public class TGAC : Form
{
//クラスコントロール
private Button Reset_Button;
private Button Hide_Button;
private Button Draw1_Button;
private Button Draw2_Button;
private Button Draw3_Button;
private Button Exit_Button;
//コントロールの初期化
private void InitializeControls()
{
this.Reset_Button = new Button();
this.Hide_Button = new Button();
this.Draw1_Button = new Button();
this.Draw2_Button = new Button();
this.Draw3_Button = new Button();
this.Exit_Button = new Button();
this.SuspendLayout();
//Reset_Button
this.Reset_Button.Anchor = AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right;
this.Reset_Button.Location = new Point(713, 12);
this.Reset_Button.Name = "Reset_Button";
this.Reset_Button.Size = new Size(75, 30);
this.Reset_Button.TabIndex = 0;
this.Reset_Button.Text = "リセット";
this.Reset_Button.UseVisualStyleBackColor = true;
this.Reset_Button.Click += new EventHandler(this.Reset_Button_Click);
//Hide_Button
this.Hide_Button.Anchor = AnchorStyles.Top | AnchorStyles.Right;
this.Hide_Button.Location = new Point(713, 44);
this.Hide_Button.Name = "Hide_Button";
this.Hide_Button.Size = new Size(75, 30);
this.Hide_Button.TabIndex = 1;
this.Hide_Button.Text = "亀表示";
this.Hide_Button.UseVisualStyleBackColor = true;
this.Hide_Button.Click += new EventHandler(this.Hide_Button_Click);
//Draw1_Button
this.Draw1_Button.Anchor = AnchorStyles.Top | AnchorStyles.Right;
this.Draw1_Button.Location = new Point(713, 74);
this.Draw1_Button.Name = "Draw1_Button";
this.Draw1_Button.Size = new Size(75, 30);
this.Draw1_Button.TabIndex = 2;
this.Draw1_Button.Text = "描画1";
this.Draw1_Button.UseVisualStyleBackColor = true;
this.Draw1_Button.Click += new EventHandler(this.Draw1_Button_Click);
//Draw2_Button
this.Draw2_Button.Anchor = AnchorStyles.Top | AnchorStyles.Right;
this.Draw2_Button.Location = new Point(713, 104);
this.Draw2_Button.Name = "Draw2_Button";
this.Draw2_Button.Size = new Size(75, 30);
this.Draw2_Button.TabIndex = 3;
this.Draw2_Button.Text = "描画2";
this.Draw2_Button.UseVisualStyleBackColor = true;
this.Draw2_Button.Click += new EventHandler(this.Draw2_Button_Click);
//Draw3_Button
this.Draw3_Button.Anchor = AnchorStyles.Top | AnchorStyles.Right;
this.Draw3_Button.Location = new Point(713, 134);
this.Draw3_Button.Name = "Draw3_Button";
this.Draw3_Button.Size = new Size(75, 30);
this.Draw3_Button.TabIndex = 4;
this.Draw3_Button.Text = "描画3";
this.Draw3_Button.UseVisualStyleBackColor = true;
this.Draw3_Button.Click += new EventHandler(this.Draw3_Button_Click);
//Exit_Button
this.Exit_Button.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
this.Exit_Button.Location = new Point(713, 410);
this.Exit_Button.Name = "Exit_Button";
this.Exit_Button.Size = new Size(75, 30);
this.Exit_Button.TabIndex = 4;
this.Exit_Button.Text = "終了";
this.Exit_Button.UseVisualStyleBackColor = true;
this.Exit_Button.Click += new EventHandler(this.Exit_Button_Click);
//TGAC本体
Assembly myOwn = Assembly.GetEntryAssembly();
this.Icon = Icon.ExtractAssociatedIcon(myOwn.Location); //プログラムアイコンをフォームにつける
this.AutoScaleDimensions = new SizeF(6F, 12F);
this.AutoScaleMode = AutoScaleMode.Font;
this.ClientSize = new Size(800, 450);
this.Controls.Add(this.Hide_Button);
this.Controls.Add(this.Reset_Button);
this.Controls.Add(this.Draw1_Button);
this.Controls.Add(this.Draw2_Button);
this.Controls.Add(this.Draw3_Button);
this.Controls.Add(this.Exit_Button);
this.Name = "TGAC";
this.Text = "TurtleGraphics Ala Carte";
this.ResumeLayout(false);
}
//コンストラクター
public TGAC()
{
Turtle.Init(this);
Turtle.Reset();
InitializeControls();
}
//終了処理
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
DialogResult dr = MessageBox.Show("終了しますか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if(dr == DialogResult.No)
{
e.Cancel = true;
}
else
Environment.Exit(0); //解説【重要 】ウィンドウをクローズしてもプロセスが 終了せず、継続 してしまう為
}
//リセットボタン処理
private void Reset_Button_Click(object sender, EventArgs e)
{
Turtle.Reset();
}
//非表示処理
private void Hide_Button_Click(object sender, EventArgs e)
{
if (Turtle.ShowTurtle)
{
Turtle.ShowTurtle = false;
this.Hide_Button.Text = "亀表示";
}
else
{
Turtle.ShowTurtle = true;
this.Hide_Button.Text = "亀非表示";
}
}
//描画1ボタン
private void Draw1_Button_Click(object sender, EventArgs e)
{
DisableCtrls(); //ボタン無効化
Turtle.Reset();
Turtle.PenUp();
Turtle.MoveTo(-100, 200);
Turtle.PenDown();
Turtle.Rotate(90);
fractal(200, 0);
Turtle.Reset();
Turtle.PenUp();
Turtle.MoveTo(-100, 100);
Turtle.PenDown();
Turtle.Rotate(90);
fractal(200, 1);
Turtle.Reset();
Turtle.PenUp();
Turtle.MoveTo(-100, 0);
Turtle.PenDown();
Turtle.Rotate(90);
fractal(200, 2);
Turtle.Reset();
Turtle.PenUp();
Turtle.MoveTo(-100, 0);
Turtle.PenDown();
Turtle.Rotate(90);
fractal(200, 3);
EnableCtrls(); //ボタン有効化
}
private void fractal(int size, int depth) //Used by Draw1 abd Draw2
{
if(depth <= 0)
Turtle.Forward(size);
else
{
Turtle.Delay = 50;
Turtle.PenSize = 2;
fractal(size / 3, depth - 1);
Turtle.Rotate(-60);
fractal(size / 3, depth - 1);
Turtle.Rotate(120);
fractal(size / 3, depth - 1);
Turtle.Rotate(-60);
fractal(size / 3, depth - 1);
}
}
//描画2ボタン
private void Draw2_Button_Click(object sender, EventArgs e)
{
DisableCtrls(); //ボタン無効化
Color[] col = new Color[3] {Color.Red, Color.Green, Color.Blue};
for(int j = 0; j < 3; j++)
{
//Turtle.Reset();
Turtle.PenUp();
Turtle.MoveTo(-100 + j * 4, -100 + j * 4);
Turtle.PenDown();
Turtle.PenColor = col[j];
for(int i = 0; i < 5; i++)
{
fractal(200 - j * 4, 3);
Turtle.Rotate(360 / 5);
}
}
EnableCtrls(); //ボタン有効化
}
//描画3ボタン
private void Draw3_Button_Click(object sender, EventArgs e)
{
//Fractal Tree
DisableCtrls(); //ボタン無効化
Turtle.Delay = 10;
Turtle.PenSize = 2;
Turtle.MoveTo(0, -150);
for(int i = 0; i < 100; i++)
{
draw(100);
}
EnableCtrls(); //ボタン有効化
}
private void draw(int i) //Used by Draw3_Button_Click
{
if(i < 10)
return;
else
{
Turtle.Forward(i);
Turtle.Rotate(-30);
draw(3 * i / 4);
Turtle.Rotate(60);
draw(3 * i / 4);
Turtle.Rotate(-30);
Turtle.Backward(i);
}
}
//終了ボタン
private void Exit_Button_Click(object sender, EventArgs e)
{
Close();
}
//ボタンを無効化する
private void DisableCtrls()
{
Reset_Button.Enabled = false;
Hide_Button.Enabled = false;
Draw1_Button.Enabled = false;
Draw2_Button.Enabled = false;
Draw3_Button.Enabled = false;
Exit_Button.Enabled = false;
}
//ボタンを有効化する
private void EnableCtrls()
{
Reset_Button.Enabled = true;
Hide_Button.Enabled = true;
Draw1_Button.Enabled = true;
Draw2_Button.Enabled = true;
Draw3_Button.Enabled = true;
Exit_Button.Enabled = true;
}
}
}
【描画1】
(解説:フラクタル深度0、1、2を続く最後の2です。)
【描画2】
(解説: 【注意】 20分くらいかかるので注意してください。)
【描画3】
(解説: 【危険】 描画完了まで1時間以上かかります。)
まっ、
眺めて楽しい環境ソフト ではありますが、時間が長いのは今風ではない かもしれませんね。(とはいえ、 速過ぎるのは興ざめ でもあったりして。)