python简单的分形图片





康托集

代码:


 
 
  1. # 康托集
  2. import pygame
  3. pygame.init()
  4. screen = pygame.display.set_caption('康托集')
  5. screen = pygame.display.set_mode([1000, 250])
  6. screen.fill([255, 255, 255])
  7. pygame.display.flip()
  8. len0 = 1000 # 初始线条长度
  9. leni = len0 # 当前最小线条长度
  10. line = 0 # 当前行数
  11. while leni > 1:
  12. for event in pygame.event.get():
  13. if event.type == pygame.QUIT:
  14. exit()
  15. n = 2**line # 集合元素份数
  16. tep = [0, ] # 元素第一个端点位置
  17. while len(tep) < n:
  18. nt = (tep[-1] + leni) * 2 # 接下来首个元素位置
  19. tepp = [] # 接下来元素位置
  20. for j in tep:
  21. tepp.append( nt + j)
  22. tep.extend( tepp)
  23. for k in tep:
  24. pygame.draw.line( screen, [ 0, 0, 0], [
  25. k, 30 * line + 5], [ k + leni, 30 * line + 5], 10)
  26. pygame.display.flip()
  27. line += 1
  28. leni = leni / 3
  29. while 1:
  30. for event in pygame.event.get() :
  31. if event.type == pygame.QUIT:
  32. exit()

输出:

康托尘埃

代码:


 
 
  1. # 康托尘埃
  2. import pygame
  3. pygame.init()
  4. screen = pygame.display.set_caption('康托尘埃')
  5. screen = pygame.display.set_mode([487, 487])
  6. screen.fill([255, 255, 255])
  7. pygame.display.flip()
  8. cantor = [1, ] # 起点集,最小像素为1
  9. while (cantor[-1] + 1) * 3 < 1000:
  10. st = (cantor[-1] + 1) * 2 # 下一迭代起点
  11. tep = []
  12. for i in cantor:
  13. tep.append(st + i) # 重复上一子集
  14. cantor.extend(tep)
  15. # print(cantor[-1]) # 输出最大像素起点
  16. for i in cantor:
  17. for j in cantor:
  18. screen.set_at([i, j], [0, 0, 0])
  19. pygame.display.flip()
  20. while 1:
  21. for event in pygame.event.get():
  22. if event.type == pygame.QUIT:
  23. exit()

输出:

方块分形

代码:


 
 
  1. # 方块分形
  2. import pygame
  3. maxlen = 500 # 边界
  4. pygame.init()
  5. screen = pygame.display.set_caption('方块分形')
  6. screen = pygame.display.set_mode([maxlen, maxlen])
  7. screen.fill([255, 255, 255])
  8. pygame.display.flip()
  9. def draw(st, leni):
  10. # st: 左上角点位置[left,top]
  11. # leni: 当前方块边长
  12. if leni > 3:
  13. leni /= 3
  14. draw(st, leni) # 左上
  15. draw([st[0] + leni * 2, st[1]], leni) # 右上
  16. draw([st[0] + leni, st[1] + leni], leni) # 中间
  17. draw([st[0], st[1] + leni * 2], leni) # 左下
  18. draw([st[0] + leni * 2, st[1] + leni * 2], leni) # 右下
  19. pygame.display.flip()
  20. else:
  21. pygame.draw.rect(screen, [0, 0, 0], [st[0], st[1], leni, leni])
  22. draw([0, 0], maxlen)
  23. while 1:
  24. for event in pygame.event.get():
  25. if event.type == pygame.QUIT:
  26. exit()

输出:

谢尔宾斯基三角垫

代码:


 
 
  1. # 谢尔宾斯基三角垫
  2. import pygame
  3. maxlen = 500 # 边界
  4. pygame.init()
  5. screen = pygame.display.set_caption('谢尔宾斯基三角垫')
  6. screen = pygame.display.set_mode([maxlen, maxlen])
  7. screen.fill([255, 255, 255])
  8. pygame.display.flip()
  9. def mid(a, b):
  10. # 求出a, b点的中点坐标
  11. return [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2]
  12. def draw(one, two, tri):
  13. # 参数代表三个顶点,上、左、右排序
  14. if one[0] - two[0] > 2: # 可分
  15. draw(one, mid(one, two), mid(one, tri)) # 画上面的三角
  16. draw(mid(one, two), two, mid(two, tri)) # 画左边三角
  17. draw(mid(one, tri), mid(two, tri), tri) # 画右边的三角
  18. pygame.display.flip()
  19. else: # 达到最小结构
  20. pygame.draw.polygon(screen, [0, 0, 0], [one, two, tri])
  21. draw([maxlen / 2, 0], [0, maxlen], [maxlen, maxlen])
  22. while 1:
  23. for event in pygame.event.get():
  24. if event.type == pygame.QUIT:
  25. exit()

输出:

谢尔宾斯基方毯

代码:


 
 
  1. # 谢尔宾斯基方毯
  2. import pygame
  3. maxlen = 500 # 边界
  4. pygame.init()
  5. screen = pygame.display.set_caption('谢尔宾斯基方毯')
  6. screen = pygame.display.set_mode([maxlen, maxlen])
  7. screen.fill([0, 0, 0])
  8. pygame.display.flip()
  9. def p2(p, r, d):
  10. # p: 参考左上顶点
  11. # r: 距离参考点向右偏移距离
  12. # d: 距离参考点向下偏离距离
  13. return [p[0] + r, p[1] + d]
  14. def points(p, leni):
  15. # 返回p,leni对应的四边形四个顶点列表
  16. return [p, p2(p, leni, 0), p2(p, leni, leni), p2(p, 0, leni)]
  17. def draw(p, leni):
  18. # p:左上顶点
  19. # leni:边长
  20. leni /= 3
  21. pygame.draw.polygon(screen, [255, 255, 255],
  22. points(p2(p, leni, leni), leni))
  23. if leni > 3:
  24. draw(p, leni)
  25. draw(p2(p, leni, 0), leni)
  26. draw(p2(p, 2 * leni, 0), leni)
  27. draw(p2(p, 0, leni), leni)
  28. draw(p2(p, 2 * leni, leni), leni)
  29. draw(p2(p, 0, 2 * leni), leni)
  30. draw(p2(p, leni, 2 * leni), leni)
  31. draw(p2(p, 2 * leni, 2 * leni), leni)
  32. pygame.display.flip()
  33. draw([0, 0], maxlen)
  34. while 1:
  35. for event in pygame.event.get():
  36. if event.type == pygame.QUIT:
  37. exit()

输出:



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值