1. 程式人生 > >python簡單的分形圖片

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()

輸出: