星驰编程网

免费编程资源分享平台_编程教程_代码示例_开发技术文章

Python turtle绘制分形图(四)海龟图画谢尔宾斯基地毯

1 思路

海龟图画谢尔宾斯基地毯思路:令最小的一个正方形边长为base,则n阶地毯的边长为base*(3**n)
由于turtle画布的长度为600左右,第一象限长度为300左右,我们令base=int(300/(3^n)
判断每一个边长为base的小正方形是否应该挖去

2 Python turtle 程序

import turtle

from numpy import true_divide
n = int(input())
t = turtle.Turtle()
base = int(300 / (3 ** n))  # 设置每个小正方形长度base
length = base * (3 ** n)  # 最外围的正方形长度
t.pensize(0.1)
t.hideturtle()
turtle.tracer(True)  # 画图过程太长我们跳过不看
t.speed(0)
t.pencolor('blue')
t.fillcolor('blue')
t.begin_fill()  # 填充蓝色
for i in range(1, 5):
    t.forward(length)
    t.left(90)
t.end_fill()

def carpet(N):  # 对于点a(x,y),我们令a点位小正方形的左下角顶点
    def check(n, x, y):  
        if n <= base:  # 结束条件
            return True
        n2 = n // 3
        if n2 <= x < n2 * 2 and n2 <= y < n2 * 2:  # 小正方形处于大正方形中央应该满足的条件
            return False
        return check(n2, x % n2, y % n2)  # 不处于中央的点,递归至下一层的小正方形
        
    for y in range(0, N, base):
        for x in range(0, N, base):
            if check(N, x, y):
                continue
            else:            # 将(x,y)处小正方形填为空白
                t.penup()
                t.setx(x)
                t.sety(y)
                t.pendown()
                t.pensize(0.1)
                t.pencolor('white')
                t.fillcolor('white')
                t.begin_fill()
                for i in range(1, 5):
                    t.forward(base)
                    t.left(90)
                t.end_fill()
                t.penup()

carpet(length)
turtle.done()

3 效果

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言