编程模拟自然(一):如何画一颗静态树

  万物初始之前,宇宙是无边无际混沌的黑暗,只有元之灵穿行其间。元对这无边的黑暗十分不满,就轻轻一敲键盘,说:“要有光”,于是世间就有了光。元称“光”为“昼”,称“黑暗”为“夜”。亮光隐去,黑暗重临,从此,世间就有了昼与夜的交替。这是元创世的第一天。

  这个二次元世界诞生之初伴有一只程序猿,Ta的名字叫元。



第一章 二叉树必须是最好的树!

  元就是这样想的,为了表达对这种数据结构的崇拜之情,决定在这个世界造出一颗真实的树,一开始的构想是这样的

 

  “正所谓树极生三干,三干生六枝,六枝生十二叶。” 然而这并不是一颗二叉树。



第二章 黄金分割現れる

  树每递归一层需要按一定比例缩放,元苦苦冥想良久,终于找到了一个无限不循环小数,它的小数点后64位是这样的

  0.6180339887 4989484820 4586834365 6381177203 0917980576 2862135448 6227...

  [从左至右,比例系数依次是0.618, 0.5, 1, 1.6]

  当然树干的粗细也得缩放,元是想将这东西种在伊甸园的土地上的,那就再截去下方的子树

  

  “啊哈,这下叫二叉树没错了吧。”

  “既然配图这么暗黄,就称这个无理数为黄金分割比例吧!”元心里想了想。



第三章 不对称与伪随机

  不对称才是美?不对称才是美?!所以元就在树的节点位置加入了伪随机扰动。

  “说点什么好呢?”



第四章 更多的子树

  元一直认为这个世界有时候是需要偏见的,二叉树肯定是最好的树。

  虽然现在不止两个子树。

  “高清大图才能欣赏的过瘾。”你可以尝试目标另存为。



第五章 绿叶与果实

  在树的末梢长出叶子和果实,一颗树终于成型了。

  “对暗黄系简直审美疲劳,画风是该换一换了。”

  “结束了,据说第六天还要加班造人?!”



后记 

  -- 亚,我饿了

  -- 夏,我去给你摘果子

  ...

  -- 亚,那个猿又在树上看着我们

  -- 别管Ta,吃果子咯

  -- 嗯哪

  ...

  ...

  -- 夏,我一直以为那是只狗呢

  ...

    Dim ph As Graphics
    Dim PaintBoard As Bitmap
    Dim centerX, centerY As Long
    Dim modeSequence() As Integer = {4, 5, 4, 6, 5, 6, 1, 2, 1, 3, 2, 3}
    Dim rnd As New Random
    Public Function Calculator(ByVal x As Double, ByVal y As Double, ByVal mode As Integer, ByVal r As Double, ByVal depth As Integer, ByVal radio As Double) As Double()
        Dim R2 As Double
        r = r * radio
        R2 = Math.Sqrt(3) * (r / 2)
        Dim Position(2) As Double
        Dim tempRnd As Double = 1 ‘* rnd.Next(depth, 20) / 10
        If mode = 1 Then
            x = 0 : y = -r * tempRnd
        ElseIf mode = 2 Then
            x = -R2 * tempRnd : y = (r / 2) * tempRnd
        ElseIf mode = 3 Then
            x = R2 * tempRnd : y = (r / 2) * tempRnd
        ElseIf mode = 4 Then
            x = -R2 * tempRnd : y = -(r / 2) * tempRnd
        ElseIf mode = 5 Then
            x = R2 * tempRnd : y = -(r / 2) * tempRnd
        ElseIf mode = 6 Then
            x = 0 : y = r * tempRnd
        End If
        Position(0) = x
        Position(1) = y
        Position(2) = r
        Return Position
    End Function
    Public Sub PaintLine(ByVal x As Double, ByVal y As Double, ByVal mode As Integer, ByVal r As Double, ByVal depth As Integer, ByVal radio As Double)
        Dim position() As Double
        Dim tempR As Double
        Dim tempWidth As Double
        Dim tempColor As Color
        Dim tempRnd As Integer = rnd.Next(1, 3)
        Dim tempAlpha As Integer
        For j = 0 To 1
            For pff = 0 To tempRnd
                position = Calculator(x, y, modeSequence((mode - 1) * 2 + j), r, depth, radio)
                Dim LineVector As New Vector2D(position(0), position(1))
                LineVector.x *= rnd.NextDouble
                LineVector.y *= rnd.NextDouble
                LineVector.SetMag(IIf(depth <= 1, 20, position(2)))
                position(0) = LineVector.x
                position(1) = LineVector.y
                Dim tempMag As Double = LineVector.Magnitude
                Dim PointList As New List(Of PointF)
                For m = 1 To tempMag
                    LineVector.SetMag(m)
                    PointList.Add(New PointF(x + LineVector.x, y + LineVector.y))
                Next
                If PointList.Count >= 2 Then
                    Dim tempNext As Double = rnd.NextDouble
                    tempAlpha = rnd.Next(20, 100)
                    For p = 0 To PointList.Count - 2
                        tempR = r * 0.015 * depth
                        tempWidth = IIf(depth <= 1, Math.Sin(p / 6) * 10, tempR - p / PointList.Count * (tempR - tempR * radio + r * 0.015 * radio))
                        tempColor = IIf(depth <= 1, Color.FromArgb(tempAlpha, Color.Green), Color.Black)
                        If depth <= 1 Then
                            If tempNext < 0.01 Then
                                tempWidth = Math.Sin(p / 6) * 20
                                tempColor = Color.FromArgb(rnd.Next(200, 255), Color.Red)
                            End If
                        End If
                        ph.DrawLine(New Pen(tempColor, tempWidth), PointList(p), PointList(p + 1))
                    Next
                End If
                PaintHexgon(position(0) + x, position(1) + y, modeSequence((mode - 1) * 2 + j), tempMag, depth - 1, radio)
            Next
        Next
    End Sub
    Public Sub PaintHexgon(ByVal x As Double, ByVal y As Double, ByVal mode As Integer, ByVal r As Double, ByVal depth As Integer, ByVal radio As Double)
        If depth > 0 Then
            If mode = 0 Then
                ph.DrawLine(New Pen(Brushes.Black, r * 0.02 * depth), New PointF(x, y), New PointF(x, y + r))
                PaintLine(x, y, 1, r, depth, radio)
            Else
                PaintLine(x, y, mode, r, depth, radio)
            End If
        End If
    End Sub
    ‘画树
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        PaintBoard = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        ph = Graphics.FromImage(PaintBoard)
        ph.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
        centerX = PictureBox1.Width / 2 : centerY = PictureBox1.Height / 2
        PaintHexgon(centerX, centerY, 0, 200, 5, 0.6180339887)
        ‘ PaintHexgon(centerX, centerY, 0, 20, 5, 1.61812)
        PictureBox1.Image = PaintBoard
    End Sub

VB.NET源码

时间: 2024-10-20 11:48:51

编程模拟自然(一):如何画一颗静态树的相关文章

编程模拟自然(三):更好的静态树算法

序 旧言月中有桂,有蟾蜍,故异书言,月桂高五百丈,下有一人常斫之,树创随合. “汪...”一声猿啸从天际传来. 吴刚抬头看了看天,却没有发现什么,只当是出现了幻听. 第零章 提出问题 元来到这个世界已经好多天了,本想去找那树下的人探听一些消息,却不想竟然无法进入桂树百丈范围. 元在伊甸园里种过树的,但看到那桂树受创随即便愈合,倍感神奇.看来需要更新算法了. “这颗树的全称为Graphics User Interface Tree,中文简称:桂树.” 第一章 作出假设 每个树枝都是一个独立的结点,

【目录导航】编程模拟自然系列博文

简介 博文名称:编程模拟自然 系列别称:奇幻元纪 主要角色:元.无名儿 角色设定:(按出场顺序) 元:故事主角,拥有创世能力的程序猿 亚和夏:生活在元创造的世界里的人类 NvWa:传说通过重构天阙代码完成补天的程序Yuan 盘古:上古程序架构师,后世传有生平语录<盘语>一书 吴刚:在月亮上中终日砍伐桂树的码农 无名儿:故事主角,一破小孩儿 嫦娥:奔月的仙子,身居广寒宫 天狗:妖物,来源不明 望舒:御车之神,管辖月宫禁地 VisualSnake:伊甸园里的可视化集成开发环境,外形同蛇 后羿:(下

编程模拟自然(九):元胞自动机

序 旧书有云:发鸠之山,其上多柘木.有鸟焉,其状如乌,文首.白喙.赤足,名曰精卫,其鸣自詨. 一日,精卫游于码海,溺而不返,后常衔西山之木石,以堙于海.有诗为证: 万事有不平,尔何空自苦: 长将一寸身,衔木到终古? 我愿平码海,身沉心不改: 码海无平期,我心无绝时. 呜呼!君不见,西山衔木众鸟多,鹊来燕去自成窠! (前情提要:主角元乘坐返回舱降落到了码海上,随后遇到了个鸟人...) “咳咳,远道的客人,我名精卫XIV,乃是先祖精卫鸟的第十四代后裔...”鸟人作自我介绍 “...你是谁,从哪里来又

编程模拟自然(七):力学矢量与牛顿定律

序 旧书有云:古者十日并出,草木焦槁,一曰后羿者射日,太阳里之九鸟皆死,救苍生于涂炭. 传闻后羿所用箭矢加持了力学模拟系统,可实现深空精确制导,才得以击落太阳. ... “星星挂在天边,就像梦想遥不可现...”元哼唧着. “猿叔你在哼什么曲子啊?” “...星星消失在天边,就像诺言来不及实现...”元对无名儿捂着双耳选择无视. “咳咳,我这是在朗诵诗人小刚的诗歌呢!” ... 第零章 “星星挂在天...你爸曾经射落过太阳?”元刚要继续深情朗诵,似乎想到了什么. “是的,听娘说爹地最厉害了.” “

编程模拟自然(八):几种常见力的建模

序 古书记载:大河之东,有美丽佳人,乃天帝之子,机杼女工,年年劳役,织成云雾绢缣之衣,天帝怜其独处,嫁与河西牵牛为妻. 自此即废织紝之功,留恋不归.天帝大怒,责归河东,令他们每年只有七月七日可以相会一次.有诗云: 纤云弄巧,飞星传恨,银汉迢迢暗渡. 金风玉露一相逢,便胜却人间无数. 柔情似水,佳期如梦,忍顾鹊桥归路. 两情若是长久时,又岂在朝朝暮暮 第零章 实例化一个长整型 “无名儿,来个睡前故事吧.” “猿叔,我才是小孩子唉!” “你当然是小屁孩,我这是培养你的语言表达能力.” “哦,那给你讲

30、最高分是多少 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.

最高分是多少 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据. 每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目. 学生ID编号从1编到N. 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩 接下来又M行,每一行有一个字符C(只取'Q'或'U'),和两个正整数A,B,当C为'Q

java 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.

老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据. 每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目. 学生ID编号从1编到N. 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩 接下来又M行,每一行有一个字符C(只取'Q'或'U'),和两个正整数A,B,当C为'Q'的时候, 表

模拟自然动画的精髓——TimeInterpolator与TypeEvaluator

模拟自然动画的精髓--TimeInterpolator与TypeEvaluator 在今天的文章开始之前,有个忙想请大家帮一下,希望在京东.淘宝.当当.亚马逊购买了我的书<Android群英传:神兵利器>的朋友们,帮忙去网店上给个简短的评价,举手之劳,还是多谢大家啦~~ 本文绘图软件 https://www.desmos.com/calculator 通过属性动画,我们可以模拟各种属性的动画效果,但对于这些属性来说,动画变化的速率和范围,是实现一个更加『真实.自然』的动画的基础,这两件事情,就

使用PHP Socket 编程模拟Http post和get请求

这里给大家分享一段使用PHP Socket 编程模拟Http post和get请求的代码,非常的实用,结尾部分我们再讨论下php模拟http请求的几种方法. <?php /** * 使用PHP Socket 编程模拟Http post和get请求 * @author koma */ class Http{ private $sp = "\r\n"; //这里必须要写成双引号 private $protocol = 'HTTP/1.1'; private $requestLine