jtyoui.fractal.CantorTernarySet 源代码

#!/usr/bin/python3.7
# -*- coding: utf-8 -*-
# @Time : 2019/2/11
# @Email : jtyoui@qq.com
# @Software : PyCharm
import turtle

"""
康托三分集
选取一个欧氏长度的直线段,将该线段三等分,去掉中间一段,剩下两段。
将剩下的两段分别再三等分,各去掉中间一段,剩下四段。
将这样的操作继续下去,直到无穷,则可得到一个离散的点集。
点数趋于无穷多,而欧氏长度趋于零。经无限操作,达到极限时所得到的离散点集称之为Cantor集。
"""


[文档]class CantorTernarySet: def __init__(self, start=-300, end=300, n=6): self.start = start # 初始的起始点 self.end = end # 初始的终结点 self.dot = [[(start, end)]] # 离散的点集 self.row(n)
[文档] def row(self, n): every_time = algorithm(self.start, self.end) # 保存每一次分割的点集 for _ in range(1, n): # 一共分割多少次 self.dot.append(every_time) # 保存每一次分割的点集的集合 ls = [] # 临时保存每一次点集 for dot in every_time: # 遍历每一个点 s = algorithm(*dot) ls.extend(s) every_time = ls # 复制再遍历
[文档] def draw(self): # 绘画 pen = turtle.Pen() turtle.title('康托三分集') pen.width(2) for index, dot in enumerate(self.dot): for x, y in dot: pen.penup() pen.goto(x=x, y=100 - index * 10) pen.pendown() pen.forward(y - x) turtle.done()
[文档]def algorithm(start, end): length = end - start # 线段的长度 equal = length / 3 one_dot = start + equal # 第一个点的位置 two_dot = end - equal # 第二个点的位置 return [(start, one_dot), (two_dot, end)]
if __name__ == '__main__': ct = CantorTernarySet() ct.draw()