Public Class Form1 Private Const LP = 20000 '計算回数 Private MID As Integer '確率指定数 - 1 (DP, PROPの最大添え字) Private PROP() As Double '確率累積 Dim img As New Bitmap(300, 300) '300x300サイズのImage '------------------ ぶどうの葉 --------------------------------- 'Private Const SCX = 200 'X方向描画スケール 'Private Const SCY = -200 'Y方向描画スケール 'Private Const XMIN = 0 '左座標 'Private Const YMIN = 200 '上座標 'Private DP() As Double = {0.5, 0.168, 0.166, 0.166} '確率 'Private Fun(,,) As Double = { _ ' {{0.8, 0.0, 0.1}, {0.0, 0.8, 0.04}}, _ ' {{0.5, 0.0, 0.25}, {0.0, 0.5, 0.4}}, _ ' {{0.355, -0.355, 0.266}, {0.355, 0.355, 0.078}}, _ ' {{0.355, 0.355, 0.378}, {-0.355, 0.355, 0.434}} _ '} '------------------ シダの葉 --------------------------------- 'Private Const SCX = 200 'X方向描画スケール 'Private Const SCY = -200 'Y方向描画スケール 'Private Const XMIN = 0 '左座標 'Private Const YMIN = 200 '上座標 'Private DP() As Double = {0.73, 0.13, 0.13, 0.01} '確率 'Private Fun(,,) As Double = { _ ' {{0.856, 0.0414, 0.07}, {-0.0205, 0.858, 0.147}}, _ ' {{0.244, -0.385, 0.393}, {0.176, 0.244, 0.102}}, _ ' {{-0.144, 0.39, 0.527}, {0.181, 0.259, -0.014}}, _ ' {{0.0, 0.0, 0.486}, {0.355, 0.216, 0.05}} _ '} '------------------ アンモナイト --------------------------------- 'Private Const SCX = 100 'X方向描画スケール 'Private Const SCY = -100 'Y方向描画スケール 'Private Const XMIN = 100 '左座標 'Private Const YMIN = 100 '上座標 'Private DP() As Double = {0.06, 0.02, 0.92} '確率 'Private Fun(,,) As Double = { _ ' {{-0.29, 0, 0.59}, {0, 0.2, -0.32}}, _ ' {{-0.07, -0.02, 0.79}, {-0.01, 0.29, -0.06}}, _ ' {{0.94, -0.22, -0.05}, {0.21, 0.96, 0.01}} _ '} '------------------ 樹木 --------------------------------- Private Const SCX = 100 'X方向描画スケール(樹木) Private Const SCY = -100 'Y方向描画描画スケール Private Const XMIN = 100 '左座標 Private Const YMIN = 200 '上座標 Private DP() As Double = {0.1, 0.2, 0.2, 0.2, 0.2, 0.1} '確率 Private Fun(,,) As Double = { _ {{0.05, 0.0, 0.0}, {0.0, 0.6, 0.0}}, _ {{0.05, 0.0, 0.0}, {0.0, -0.5, 1.0}}, _ {{0.46, -0.32, 0.0}, {0.39, 0.38, 0.6}}, _ {{0.47, -0.15, 0.0}, {0.17, 0.42, 1.1}}, _ {{0.43, 0.28, 0.0}, {-0.25, 0.45, 1.0}}, _ {{0.42, 0.26, 0.0}, {-0.35, 0.31, 0.7}} _ } Private Sub 累積確率設定() MID = DP.Length - 1 : ReDim PROP(MID) Dim S As Double = 0 For i = 0 To MID S = S + DP(i) : PROP(i) = S Next End Sub Private Function setID() As Integer Dim i As Integer, S As Double = Rnd() For i = 0 To MID If S < PROP(i) Then Return i Next Return MID End Function Private Sub 描画(X As Double, Y As Double) Dim IX As Integer = X * SCX + XMIN + 0.5 Dim IY As Integer = Y * SCY + YMIN + 0.5 If IX >= 0 And IX < img.Width And IY >= 0 And IY < img.Height Then img.SetPixel(IX, IY, Color.DarkGreen) End If End Sub Private Function setFun(ID As Integer, Row As Integer, X As Double, Y As Double) Return Fun(ID, Row, 0) * X + Fun(ID, Row, 1) * Y + Fun(ID, Row, 2) End Function Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim X1 As Double, Y1 As Double, X2 As Double = 0, Y2 As Double = 0 Dim ID As Integer, k As Integer Dim g As Graphics = Graphics.FromImage(img) : g.Clear(Color.White) '描画クリア 累積確率設定() : Randomize() For k = 1 To LP X1 = X2 : Y1 = Y2 : ID = setID() X2 = setFun(ID, 0, X1, Y1) : Y2 = setFun(ID, 1, X1, Y1) 描画(X2, Y2) Next PictureBox1.Image = img : g.Dispose() 'リソースを解放する End Sub End Class