掷掷骰,画画图!

僤鯓⒐⒋嵵緔 提交于 2020-12-14 06:25:38

今天继续利用python海龟库绘制图形。我们今天要将"掷骰子"与海龟绘图联系起来,通过利用 "掷骰子"的方法来绘制“谢尔宾斯基三角形”。

先来介绍一下“谢尔宾斯基三角形”。

谢尔宾斯基三角形(英语:Sierpinski triangle)是一种分形,由波兰数学家谢尔宾斯基在1915年提出,它是一种典型的自相似集。也有的资料将其称之为谢尔宾斯基坟垛.

生成过程为:

  1. 取一个实心的三角形。(多数使用等边三角形)

  2. 沿三边中点的连线,将它分成四个小三角形。

  3. 去掉中间的那一个小三角形。

  4. 对其余三个小三角形重复1。

在计算机程序设计中,谢尔宾斯基三角形的绘制方法有很多种。常用的方法是通过利用以上生成过程,编写递归函数来实现。本文中,我们不利用这样的绘制方法,我们计划采用一种“独特”而又“有趣”的方式----“掷骰子”,通过这种方式在我们的turtle画布上绘制这个美丽的图像。怎么样,很神奇吧。


绘制原理

首先,我们在turtle海龟画布上任意选择三个点,分别标记为A、B、C三点。




我们规定A点对应骰子的1点或2点, B点对应骰子的5点或6点,C点对应骰子的3点或4点。

接下来,在A、B、C三点确定的三角形内随便取一点D点。


好了,接下来开始掷骰子了。,如果掷得的骰子点数为1点或2点,那么,就从D点出发,向A点的方向前进AD之间距离的一半,从而到达E点。



后,在从E点出发重复掷骰子 如果这次掷得的骰子点数为3点或4点那么,就从E点出发,向C点的方向前进EC之间距离的一半,从而到达F点。

然后再 从F点出发重复掷骰子 如果这次掷得的骰子点数为5点或6点 那么,就从F点出发,向B点的方向前进FB之间距离的一半,从而到达G点。


    接下来,以此类推,从G点出发, 掷骰子 ,再重复做相同的事情.........。当重复的次数越来越多了,最终,就会绘制出我们美丽的“ 谢尔宾斯基三角形”。以下是重复了500000次后,所绘制出的效果。


Python中实现的具体代码

利用Python,实现上述绘图过程的原理很简单,重点要用到我们的随机库(random),另外,对于填充三件型的点,我们可以采用dot函数来进行绘制,也可以将画笔的“形状”设置为“circle”,然后采用stamp()函数,对“形状”进行复制来实现。我们采用后者。具体设计思路如下:


首先设定三只画笔a、b、c,并选定三个坐标点。


value=300
turtle.bgcolor('white')

a=turtle.Turtle()
a.shape('circle')
a.shapesize(0.8,0.8)
a.up()
a.goto(-value,-value)
a.color('red')
a.ht()
a.stamp()
a.goto(-value,-value-70)
a.write('A(1 or 2)',font=('Arial',20,'bold'))
a.up()
a.goto(-value,-value)
#b点5 or 6
b=turtle.Turtle()
b.shape('circle')
b.shapesize(0.8,0.8)
b.ht()
b.up()
b.goto(value,-value)
b.color('green')
b.stamp()
b.goto(value+30,-value)
b.write('B(5 or 6)',font=('Arial',20,'bold'))
b.up()
b.goto(value,-value)
#c点3 or 4
c=turtle.Turtle()
c.shape('circle')
c.shapesize(0.8,0.8)
c.ht()
c.up()
c.goto(0,value)
c.color('blue')
c.stamp()
c.goto(0,value+30)
c.write('C(3 or 4)',font=('Arial',20,'bold'))
c.up()
c.goto(0,value)


接下来,定义用于绘制三角形的画笔"paint".并在A、B、C三点确定的三角形内部选择一点。


#定义绘画笔
paint=turtle.Turtle()
paint.shape('circle')
paint.shapesize(0.2,0.2)
paint.up()
paint.speed(0)
paint.goto(0,0)
paint.color('purple')
paint.fd(10)
paint.stamp()


        然后,开始做上述循环过程,通过掷骰子,利用画笔"paint"通过点填充实现对三角形的绘制。


for i in range(500000):
x=random.randint(1,6)
if x==1 or x==2:
angle=paint.towards(a.pos())
paint.seth(angle)
dist=paint.distance(a.pos())
paint.fd(dist/2)
paint.stamp()
if x==3 or x==4:
angle=paint.towards(c.pos())
paint.seth(angle)
dist=paint.distance(c.pos())
paint.fd(dist/2)
paint.stamp()
if x==5 or x==6:
angle=paint.towards(b.pos())
paint.seth(angle)
dist=paint.distance(b.pos())
paint.fd(dist/2)
paint.stamp()


注意,每一次循环中的“掷骰子”是通过随机库命令

x=random.randint(1,6)
来实现的。


好了,小伙伴们,这回可以运行代码跑起来了。最终,运行后效果如下。



-end-
扫码关注公众号

python海龟作图系列推荐阅读: 

红灯停,绿灯行!

Python海龟绘图系列---带你回到童年一起来玩“万花尺”

python海龟绘图系列----五彩斑斓写意画

带你一起来看那道美丽的彩虹

来,哥带你一起来玩质数螺旋

python海龟库(turtle)中颜色的表示方法

Python内置海龟(turtle)库绘图命令详解(二)

Python内置海龟(turtle)库绘图命令详解(一)



本文分享自微信公众号 - python 青少年编程(gh_73f62b58c679)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!