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

2019-09-10 18:53:49 浏览数 (1)

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

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

代码语言:javascript复制
# 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

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

0 人点赞