===============
1.1 谢尔宾斯基三角形(英语:Sierpinski triangle)是一种分形,由波兰数学家谢尔宾斯基在1915年提出。
1.2 瓦茨瓦夫·弗朗西斯克·谢尔宾斯基,1882年3月14日-1969年10月21日,波兰数学家。
2 python3.8-turtle黑白版
===================
2.1 效果图1
2.2 代码1
#代码来源:修正,增加,注释#https://fishc.com.cn/forum.php?mod=viewthread&ordertype=2&tid=151507import turtle#定义谢尔宾斯基三角形函数def Sierpinski(size,times,total_angle): #times为0,便是外围大三角形 if times == 0: turtle.fd(size) else: for angle in [0,120,-120,-120,120]: total_angle += angle turtle.right(angle) total_angle = total_angle%180 if total_angle == 0: Sierpinski(size/2,times-1,total_angle) else: turtle.fd(size/2)#定义主函数def main(): #窗口大小设置 turtle.setup(800,800) #提笔 turtle.penup() #去到这个坐标 turtle.goto(-300, -300) #落笔 turtle.pendown() #笔头大小 turtle.pensize(2) #转角,画外围三角形,先60°,再120° for angle in [60,-120]: turtle.left(angle) turtle.fd(size) #再转角120° turtle.right(120) total_angle=0 Sierpinski(size,times,total_angle) #隐蔽画笔 turtle.hideturtle() turtle.done()size = 600#层数,推举5#times = 5times=int(input(39;请你输入层数0-5,推举≤5:'))#主函数走起main()
2.3 效果图2
2.4 代码2
""" 功能:绘制谢尔宾斯基三角形 环境:python3.7 日期:2019/1/14 21:49 作者:指尖邪术师 版本:1.0 #https://blog.csdn.net/veray/article/details/86531715"""import turtle as t def sanjiaoxing(san): """ 传入三个点坐标,绘制三角形 """ t.penup() t.goto(san[0]) t.pendown() t.goto(san[1]) t.goto(san[2]) t.goto(san[0]) def get_mid(a, b): """ 打算返回2个点的中间点坐标 """ x = (a[0] + b[0]) / 2 y = (a[1] + b[1]) / 2 return [x, y] def draw_san(size, i): """ 绘制谢尔宾斯基三角形函数 :param size: 三个点坐标列表 :param i: 递归次数 """ # 绘制三角形 sanjiaoxing(size) if i > 0: # 绘制左边小三角形 size2 = [size[0], get_mid(size[0], size[1]), get_mid(size[0], size[2])] draw_san(size2, i - 1) # 绘制上边的小三角形 size3 = [get_mid(size[0], size[2]), get_mid(size[1], size[2]), size[2]] draw_san(size3, i - 1) # 绘制右边的小三角形 size4 = [get_mid(size[0], size[1]), size[1], get_mid(size[1], size[2])] draw_san(size4, i - 1) def main(): """ 主函数 """ # 打印图形标题 t.penup() t.left(90) t.forward(350) t.pendown() t.write("谢尔宾斯基三角形", False, align="center", font=("宋体", 20, "normal")) t.speed(5) # 初始三角形坐标 points = [[-200, 0], [200, 0], [0, 300]] # 递归5次 count = 5 # 调用绘制谢尔宾斯基三角形函数 draw_san(points, count) t.ht() #add t.exitonclick() if __name__ == '__main__': main()
3 python3.8-turtle彩色版
===================
3.1 字典法效果图3
3.2 代码3
#代码来源#https://blog.csdn.net/qq_42907161/article/details/108228487?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-6&spm=1001.2101.3001.4242#字典法import turtlet = turtle.Turtle()points = {'left':(-200, -100), 'top':(0, 200), 'right':(200, -100)}#画三角形和添补颜色函数def drawTriangle(points, color): t.fillcolor(color) t.penup() t.goto(points['top']) t.pendown() t.begin_fill() t.goto(points['left']) t.goto(points['right']) t.goto(points['top']) t.end_fill()#取中点函数def getMid(p1, p2): return ((p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2)#画谢尔宾斯基三角形函数def sierpinski(degree, points): colormap = ['blue', 'red', 'green', 'yellow', 'orange', 'gray'] if degree > 0: # 先画(挖掉)三角形 drawTriangle( {'left':getMid(points['left'], points['top']), 'right':getMid(points['right'], points['top']), 'top':getMid(points['right'], points['left']) },colormap[degree] ) # 再分别递归新天生的三个三角形 sierpinski(degree - 1, {'left':getMid(points['left'], points['top']), 'top':points['top'], 'right':getMid(points['top'], points['right'])}) sierpinski(degree - 1, {'left':points['left'], 'top':getMid(points['left'], points['top']), 'right':getMid(points['left'], points['right'])}) sierpinski(degree - 1, {'left':getMid(points['left'], points['right']), 'top':getMid(points['top'], points['right']), 'right':points['right']})drawTriangle(points, 'white')#层数5个sierpinski(5, points)t.ht() # 末了将海龟隐蔽起来turtle.done()
3.3 效果图4
3.4 代码4
# 谢尔宾斯基三角形# By BigShuang# https://github.com/BigShuang/recursion-with-turtleimport mathimport turtle# 颜色LineColor="black"FillColors=[ '#CAE1FF', '#FFEFDB', '#8470FF', '#FF6347', '#FFDEAD', '#C1FFC1']# 最小绘制长度-三角形最小边长Base=10# 三角形边长TriSize=250# 绘制速率MPS=10# 初始化Turtle工具t = turtle.Turtle()t.speed(MPS)t.hideturtle()# 递归函数-画下一级别的三角形-内部更小的def draw_nextone(triangle,kwargs): # 如果三角形边终年夜于最小绘制长度,退出递归 if get_edge(triangle)<Base: return # 否则 # 1-根据三边中点绘制内部三角形 a, b, c = triangle[0:3] a_b, a_c, b_c=get3mid(a, b, c) # 绘制三角形并填色 depth=kwargs.get("depth",0) if len(triangle)==4: depth=triangle[3] # 取对应深度的颜色 _colorIdx=depth%len(FillColors) color = FillColors[_colorIdx] draw_tri(a_b, a_c, b_c, color=color) # 2-得到三个更小的三角形,对这三个更小的三角形再次调用本函数 draw_nextone(a,a_b,a_c,depth=depth+1) draw_nextone(b, a_b, b_c,depth=depth+1) draw_nextone(c, a_c, b_c,depth=depth+1)# 得到三角行三边边长def get_edge(triangle): # triangle:[(),(),()]-三点坐标组成的列表 a,b,c=triangle[0:3] ax,ay=a bx,by=b ab2=(ax-bx)2+(ay-by)2 return math.sqrt(ab2)# 得到三边中点def get3mid(triangle): # triangle:[(),(),()]-三点坐标组成的列表 a, b, c = triangle ax, ay = a bx, by = b cx, cy=c # 得到三边中点的坐标 a_b=((ax+bx)/2,(ay+by)/2) a_c = ((ax + cx) / 2, (ay + cy) / 2) b_c = ((cx + bx) / 2, (cy + by) / 2) return a_b,a_c,b_c# 根据顶点坐标绘制三角形,可选颜色def draw_tri(args,kwargs): # 三点坐标 a, b, c =args # 添补颜色 color=kwargs.get('color',None) t.penup() t.setpos(a) if color: t.color(LineColor,color) t.begin_fill() t.pendown() t.goto(b) t.goto(c) t.goto(a) t.penup() if color: t.end_fill()if __name__ == '__main__': _edge=TriSizemath.sqrt(3) tri=[(-TriSize,-TriSize),(TriSize,-TriSize),(0,_edge-TriSize)] a,b,c=tri draw_tri(a,b,c) draw_nextone(a,b,c) turtle.done()
4 一道中考题
==========
4.1 图:截图来自网络,仅供学习,如果侵权请联系,定删!
4.2 解题:
图1:0层===面积是1
图2: 1层===面积是3/4=1×3/4
图3:2层===面积是9/16=3/4×3/4
图4: 3层===面积是27/64=9/16×3/4
图5: 4层===面积是81/256=27/64×3/4
自己整理出来,仅供学习。