本章绘图要点:算法
“道生一,一辈子二,二生三,三生万物。app
--《道德经》ide
为何相对少许的遗传物质能够发育成复杂的结构,如肺、大脑、心脏?函数
为何只占人体体积5%的血管能遍及人体的每一部分?学习
生命到底是什么?生命最初又是如何造成的?编码
基因存在于染色体上,负责对生命体的形态、结构、功能进行全方位的编码,它所包含的信息一定有限,然而如此有限的信息又是如何准确地描述后代生命的性状?spa
经典理论没法解释天然界这些让人困惑的问题,直到分形理论的出现,才让这些问题有了一个可能的答案。简单而少许的规则是能够生成复杂结构的,天然界中的许多事物能够经过简单步骤的无数次重复(也就是分形迭代)演化而成。设计
由一个简单的生成因子(分形理论中称之为“生成元”),不断迭代,自我进化,愈来愈复杂,以致于逐步出现山川、草木、动物、人类及人类的思惟。宇宙间的一切难道都是这样动态生成的吗?听起来难以想象,但或许这就是事实!3d
咱们能够在计算机上作个小实验,用『原形+生成元+迭代』的方式,来生成一些复杂的图形。上一章的科赫曲线的原形是一条直线,生成元是:rest
若是保持原形为一条直线,改变生成元,那么屡次迭代后,会生成一个怎么样的图形呢?
生成元1:
第一次迭代同生成元;
第二次迭代:
第三次迭代:
第六次迭代:
生成元2:
第一次迭代同生成元;
第二次迭代:
第三次迭代:
第四次迭代:
你能够尝试设计不一样的生成元,屡次迭代后,看看会生成怎样复杂的图形。为了更清晰地显示图形的细微结构,示例程序画笔的颜色选择的是默认的黑色,你也能够选择本身喜欢的单种或多种颜色,来生成更绚烂的图形。
咱们能够用一个列表genu来指定生成元,例如科赫曲线的生成元可用列表gene = [0,60,-120,60,END]来表示:
列表的每一个值表示了旋转角的大小,正数是逆时针旋转,负数是顺时针旋转。A点不旋转,为0;C点逆时针旋转60度,为60;D点顺时针旋转120,为-120;E点逆时针旋转60,为60;END表示终止指定生成元(实际上它能够是任意值)。从一次旋转到下次旋转之间的距离是必定的,也就是说,AC、CD、DE、EB的长度是相同的,都为AB的1/3。
除了生成元之外,咱们还须要一个缩小率ratio:下一次迭代的线段和原始线段的比率,也就是AC/AB,科赫曲线的这个比率咱们知道就是1/3,约为0.3333。
生成元1 的生成元可用列表[-15,90,-150,90,END]来表示:
列表的每一个值表示了旋转角的大小,正数是逆时针旋转,负数是顺时针旋转。A点顺时针旋转15,为-15;C点逆时针旋转90度,为90;D点顺时针旋转150,为-150;E点逆时针旋转90,为90;END表示终止指定生成元。 AC、CD、DE、EB的长度是相同的。
生成元1 的缩小率ratio(下一次迭代的线段和原始线段的比率),也就是AC/AB,这个比率咱们经过计算可知:
ratio == 0.40824829046386296 ≈ 0.4082
生成元2 的生成元可用列表[0,90,-90,-90,90,-90,90,90,-90,END]来表示:
列表的每一个值表示了旋转角的大小,正数是逆时针旋转,负数是顺时针旋转。生成元2 的缩小率为:
ratio = 1/5 = 0.2
下表为几种曲线的生成元和缩小率:
|
科赫曲线 |
生成元1 |
生成元2 |
生成元gene |
[0,60,-120,60,END] |
[-15,90,-150,90,END] |
[0,90,-90,-90,90,-90,90,90,-90,END] |
缩小率ratio |
1/3 ≈ 0.3333 |
0.4082 |
1/5 = 0.2 |
# 导入模块 import turtle # 恢复海龟状态到p点 def restore(p): turtle.penup() turtle.setpos(p[0],p[1]) turtle.pendown() turtle.seth(p[2]) # 获取海龟当前点状态 def get_point(): x,y = turtle.pos() d = turtle.heading() return (x,y,d) # 生成器函数,A为起始点,B为结束点,L为线段AB的长度,genu为生成元,ratio为缩小率,n为迭代次数 def Generator(A,B,L,genu,ratio,n): # 获取图形各个点的位置和方向,不显示图形 restore(A) turtle.pencolor(b_color) # 画笔颜色设置和背景色相同,不显示图形 points = [] for angle in gene: if angle == 'END': break else: angle = int(angle) if angle < 0: turtle.right(abs(angle)) else: turtle.left(angle) p = get_point() points.append(p) turtle.forward(L*ratio) points.append(B) turtle.pencolor(p_color) # 恢复画笔颜色 if n == 1: # 绘制图形 restore(A) for p in points: turtle.setpos(p[0],p[1]) else: # 递归调用生成器,使用生成元替换中间线段 i = 0 while i <len(points)-1: Generator(points[i],points[i+1],L*ratio,gene,ratio,n-1) i = i+1 # 开始主程序 if __name__ == '__main__': # 隐藏画笔形状 turtle.hideturtle() # 指定画笔的速度,参数speed为0到10之间的一个整数,1最慢,10最快 turtle.speed(9) # 指定画笔大小 turtle.pensize(1) # 设置颜色模式为RGB turtle.colormode(255) # 背景颜色为青色,画笔颜色为白色 b_color = (136,168,155) p_color = 'white' # 设置背景颜色 turtle.bgcolor(b_color) # 原形为一条直线 A = (-450,0,0) B = (450,0,0) L = 900 # 获取用户输入的生成元、缩小率、迭代次数 print('生成元:') gene = input().split(',') print('缩小率:') ratio = float(input()) print('迭代次数:') n = int(input()) # 生成图形 restore(A) Generator(A,B,L,gene,ratio,n)
生成元1彩图1(青色RGB(136,168,155) /白色)
生成元1彩图2(背景色RGB(224,225,227),画笔色RGB(176,186,175))
生成元1彩图3(背景色RGB(181,138,93),画笔色RGB(214,226,206))
在信息可视化设计中,配色是设计绕不开的环节,配色方案直接关系到可视化结果的信息表达和易读性。和谐的配色方案,能够增长可视化结果的美观性,让用户更有兴趣去探索可视化所包含的信息,而不恰当的配色方案,则会形成用户对可视化的抵触。在设计配色方案时,一般须要考虑到不少因素,好比:须要可视化的数据是什么样的类型?这些数据拥有哪些定性或定量的属性?将这些数据可视化的目的是什么?所面向的是怎样的用户群体?等等。
颜色看起来很是简单,可是却很难处理好。灵活地运用和搭配颜色,须要大量的学习和实践,对于初学者来讲,向经典学习无疑是最适宜的一条道路,如下是推荐的一些经典配色做品: