プログラムと政治とオカルトと戯れ言
C#グラフィック コッホ曲線 for VS2013 Express に引き続き、Tree曲線をC#で描画してみる。 参考URL https://codezine.jp/article/detail/73 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((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));
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へ)
}
}
}
}
コッホ曲線の代わりに、 drwTree_main() drwTree() を追加した。 後は、同じですね。 終わり。 PR |