专栏首页趣Python# python # # 分形 # Sierpinski Carpet 谢尔宾斯基地毯

# python # # 分形 # Sierpinski Carpet 谢尔宾斯基地毯

好久没更新,趁着中午休息更新一下, 这次的是分形中的谢尔宾斯基地毯,3阶的地毯是下面这个形状(不是二维码哈☺):

源代码如下 (python 2 使用Turtle绘图):

# coding=utf-8

import turtle
PROGNAME = 'Sierpinski Carpet'

COLOR_TABLES = [
   ["#000000", "#000000", "#000000", "#000000" ],
   ["#00649F", "#97ECC5", "#00DBE7", "#01AAC1" ],
   ["#085F63", "#EF255F", "#FCCF4D", "#49BEB7" ],
   ["#9B5D73", "#FFF1C5", "#C38B8B", "#B0757C" ],
   ["#F0F0F0", "#FC5185", "#364F6B", "#43DDE6" ],
   ["#F67280", "#355C7D", "#6C5B7B", "#C06C84" ],
   ["#F3ECC8", "#0D1B4C", "#3F6699", "#78C2C3" ] ]

def box(pen, boxSize):
   pen.begin_fill()    # 0 deg.
   pen.forward(boxSize)
   pen.left(90)    # 90 deg.
   pen.forward(boxSize)
   pen.left(90)    # 180 deg.
   pen.forward(boxSize)
   pen.left(90)    # 270 deg.
   pen.forward(boxSize)
   pen.end_fill()
   pen.setheading(0)

def move_box(pen, xy, length, color):
   (x, y) = xy
   pen.color(color)
   pen.penup()
   pen.goto(x, y)
   pen.pendown()
   box(pen, length)

def draw_all(pen, xy, length, depth, color_table):
   if depth <= 0: return   length3 = length / 3
   (x, y) = xy   pos1_9 = [  (x-length3*2,       y+length+length3),
               (x+length3,         y+length+length3),
               (x+length+length3,  y+length+length3),
               (x-length3*2,       y+length3),
               (x+length+length3,  y+length3),
               (x-length3*2,       y-length3*2),
               (x+length3,         y-length3*2),
               (x+length+length3,  y-length3*2) ]    
    for pos in pos1_9:
       move_box(pen, pos, length3, color_table[depth%len(color_table)])
       draw_all(pen, pos, length3, depth-1, color_table)
    
def main():
   length = 270 # size
   start_x = -length/2
   start_y = -length/2
   depth = 3   turtle.setup(width=1.3*turtle.window_width(), height=1.3*turtle.window_height()) # not necessary
   for color_table in COLOR_TABLES:
       my_pen = turtle.Turtle()
       my_pen.ht() # hiden turtle
       my_pen.speed(20000) # set speed 
       move_box(my_pen, (start_x, start_y), length, color_table[0])
       draw_all(my_pen, (start_x, start_y), length, depth, color_table)
       my_pen.getscreen().getcanvas().postscript(file=color_table[0]+".eps") # save to eps file
       my_pen.clear() # clear for next draw

if __name__ == "__main__":
   main()    
    pass

运行过程是动态的,保存的图片(+伪彩)如下:

本文分享自微信公众号 - 趣Python(yang-an-china),作者:杨安

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-01-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • # python # # 分形 # 圆

    滚神大人
  • 机器学习入门介绍

    机器学习的方法改变了计算机的工作方式,它使得计算机不再依赖于硬编程,而是可以从实例和经验中进行学习。你把数据喂给它,它根据特定的算法和数据建立逻辑,输出结果,期...

    滚神大人
  • 成语接龙大战(AI来袭)

    公司里现在已经不能访问公众号了,家里又几乎没时间开电脑,上个月偶然发现公众号终于出了手机版,所以我胡汉三又回来了。(搞了半天,手机版一堆bug,最后还是起了个大...

    滚神大人
  • 【leetcode刷题】T53-错误的集合

    集合 S 包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。

    木又AI帮
  • BZOJ1278: 向量vector(计算几何 随机化乱搞)

    首先我们可以按极角排序。然后对\(y\)轴上方/下方的加起来分别求模长取个最大值。。

    attack
  • PHP如何使用cURL实现Get和Post请求

        curl_setopt() 。最为重要。有一长串cURL参数可供设置,它们能指定URL请求的各个细节。要一次性全部看完并理解可能比较困难,所以今天我们只...

    砸漏
  • 一道有意思的面试算法题

    前阵子突发奇想,突然开始刷leetcode。其中刷到了一道有意思的题目,发现这道题是当时秋招的时候,腾讯面试官曾经问过我的题目。于是分享给大家看下。

    嘿嘿嘿
  • leetcode 18 4Sum

    @坤的
  • 安卓7.0在线更新解析包时出现问题

    关于7.0行为变更,FileProvider应用共享文件的问题可以看鸿洋大佬的这篇博客 https://blog.csdn.net/lmj623565791/...

    萬物並作吾以觀復
  • [教程]简单几步打造聊天室

    Youngxj

扫码关注云+社区

领取腾讯云代金券