barus's diary

とても真面目なblogですにゃ

C#グラフィック Tree曲線 for VS2013 Express

 

ゲーム開発者のためのAI入門

ゲーム開発者のためのAI入門

 

 

C#グラフィック コッホ曲線 for VS2013 Express

 

に引き続き、Tree曲線をC#で描画してみる。
参考URL https://codezine.jp/article/detail/73

 

f:id:hatakeka:20160912164803p:plain

 

 





using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public class  MyPoint3D
        {
            public int x;
            public int y;
            public int z;
 
            public MyPoint3D() { }
            public MyPoint3D(int _x, int _y, int _z)
            {
                x = _x;
                y = _y;
                z = _z;
            }
        }
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            //描画先とするImageオブジェクトを作成する
            Bitmap canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            //ImageオブジェクトのGraphicsオブジェクトを作成する
            Graphics gra = Graphics.FromImage(canvas);
 
            //Penオブジェクトの作成(幅1の黒色)
            //(この場合はPenを作成せずに、Pens.Blackを使っても良い)
            Pen pen = new Pen(Color.Blue, 1);
           
            //コッホ曲線描画
            //drwKoch_main(gra, pen);
            //樹木曲線
            drwTree_main(gra, pen);
 
            pen.Dispose();
            gra.Dispose();
 
            //PictureBox1に表示する
            pictureBox1.Image = canvas;
 
        }
 
        //樹木曲線
        public void drwTree_main(Graphics gra, Pen pen)
        {
            //3対の点を指定します
            MyPoint3D P = new MyPoint3D(100, 400, 0);
            MyPoint3D Q = new MyPoint3D(100, 100, 0);
            MyPoint3D R = new MyPoint3D(250, 400, 0);
            MyPoint3D S = new MyPoint3D(250, 100, 0);
            MyPoint3D T = new MyPoint3D(400, 400, 0);
            MyPoint3D U = new MyPoint3D(400, 100, 0);
 
            //それぞれの対をなす2点間に樹木曲線を描きます
            drawTree(gra, pen, P, Q, 3);
            drawTree(gra, pen, R, S, 4);
            drawTree(gra, pen, T, U, 5);
        }
 
        //樹木曲線を描くメソッド
        public void drawTree(Graphics g, Pen pen, MyPoint3D a, MyPoint3D b, int n)
        {
 
            double STEM_RATIO = 0.25, BRANCH_RATIO = 0.6;
 
            MyPoint3D c = new MyPoint3D();
            MyPoint3D d = new MyPoint3D();
            MyPoint3D e = new MyPoint3D();
 
            int sign;
            int xx, yy;
            double angle1, angle2, center_length, branch_length;
 
            xx = b.x - a.x;
            yy = -(b.y - a.y);
 
            angle1 = Math.Atan*1;
            d.y = c.y - sign * (int)(branch_length * Math.Sin(angle1));
            e.x = c.x + sign * (int)(branch_length * Math.Cos(angle2));
            e.y = c.y - sign * (int)(branch_length * Math.Sin(angle2));
 
            //幹の部分は再帰を行わないので、点Aから点Cへ実際に線を引きます
            g.DrawLine(pen, a.x, a.y, c.x, c.y);
 
            //最後なので、実際に線を引きます
            if (n <= 0)
            {
                g.DrawLine(pen, c.x, c.y, b.x, b.y);   //中央部(点Cから点Bへ)
 
 
                g.DrawLine(pen, c.x, c.y, d.x, d.y);   //左の枝(点Cから点Dへ)
                g.DrawLine(pen, c.x, c.y, e.x, e.y);   //右の枝(点Cから点Eへ)
            }
            //最後ではないので、更にメソッドを呼び出します(再帰処理)
            else
            {
                drawTree(g, pen, c, b, n - 1);   //中央部(点Cから点Bへ)
                drawTree(g, pen, c, d, n - 1);   //左の枝(点Cから点Dへ)
                drawTree(g, pen, c, e, n - 1);   //右の枝(点Cから点Eへ)        
            }
        } 
     
    }
 
 
}

 

 

 


コッホ曲線をコメントアウトして、

            //コッホ曲線描画
            //drwKoch_main(gra, pen);
            //樹木曲線
            drwTree_main(gra, pen);

 

代わりに、樹木曲線関数

drwTree_main()

drwTree()

を追加した。

後は、同じですね。

 

 

終わり。

 

 

 

 

 


 

 


 

 


 

 

 

WindowsですぐにできるC言語グラフィックス

WindowsですぐにできるC言語グラフィックス

 

 

 

 

 

 

 

 

 

 

*1:double)yy / xx) + Math.PI / 6;

            angle2 = Math.Atan((double)yy / xx) - Math.PI / 6;
 
            center_length = Math.Sqrt(xx * xx + yy * yy) * (1 - STEM_RATIO);
            branch_length = BRANCH_RATIO * center_length;
 
            //元の直線が右下がりなら符号をマイナスにします
            sign = (xx >= 0) ? 1 : -1;
 
            c.x = (int)(a.x + STEM_RATIO * xx);
            c.y = (int)(a.y - STEM_RATIO * yy);
            d.x = c.x + sign * (int)(branch_length * Math.Cos(angle1