Python生成简单分形

由于域名过期,关于此文章更推荐上博客 nosrc.cn 上查看,下面文章的图片地址已变不能显示,见谅!

康托集

代码:

# 康托集
import pygame

pygame.init()
screen = pygame.display.set_caption('康托集')
screen = pygame.display.set_mode([1000, 250])
screen.fill([255, 255, 255])
pygame.display.flip()

len0 = 1000  # 初始线条长度
leni = len0  # 当前最小线条长度
line = 0  # 当前行数


while leni > 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()
    n = 2**line  # 集合元素份数
    tep = [0, ]  # 元素第一个端点位置
    while len(tep) < n:
        nt = (tep[-1] + leni) * 2  # 接下来首个元素位置
        tepp = []  # 接下来元素位置
        for j in tep:
            tepp.append(nt + j)
        tep.extend(tepp)
    for k in tep:
        pygame.draw.line(screen, [0, 0, 0], [
                         k, 30 * line + 5], [k + leni, 30 * line + 5], 10)
    pygame.display.flip()
    line += 1
    leni = leni / 3

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

输出:

康托尘埃

代码:

# 康托尘埃

import pygame

pygame.init()
screen = pygame.display.set_caption('康托尘埃')
screen = pygame.display.set_mode([487, 487])
screen.fill([255, 255, 255])
pygame.display.flip()

cantor = [1, ]  # 起点集,最小像素为1

while (cantor[-1] + 1) * 3 < 1000:
    st = (cantor[-1] + 1) * 2  # 下一迭代起点
    tep = []
    for i in cantor:
        tep.append(st + i)  # 重复上一子集
    cantor.extend(tep)
# print(cantor[-1]) # 输出最大像素起点
for i in cantor:
    for j in cantor:
        screen.set_at([i, j], [0, 0, 0])
pygame.display.flip()
while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

输出:

方块分形

代码:

# 方块分形

import pygame

maxlen = 500  # 边界

pygame.init()
screen = pygame.display.set_caption('方块分形')
screen = pygame.display.set_mode([maxlen, maxlen])
screen.fill([255, 255, 255])
pygame.display.flip()


def draw(st, leni):
    # st: 左上角点位置[left,top]
    # leni: 当前方块边长
    if leni > 3:
        leni /= 3
        draw(st, leni)  # 左上
        draw([st[0] + leni * 2, st[1]], leni)  # 右上
        draw([st[0] + leni, st[1] + leni], leni)  # 中间
        draw([st[0], st[1] + leni * 2], leni)  # 左下
        draw([st[0] + leni * 2, st[1] + leni * 2], leni)  # 右下
        pygame.display.flip()
    else:
        pygame.draw.rect(screen, [0, 0, 0], [st[0], st[1], leni, leni])
draw([0, 0], maxlen)
while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

输出:

谢尔宾斯基三角垫

代码:

# 谢尔宾斯基三角垫

import pygame

maxlen = 500  # 边界

pygame.init()
screen = pygame.display.set_caption('谢尔宾斯基三角垫')
screen = pygame.display.set_mode([maxlen, maxlen])
screen.fill([255, 255, 255])
pygame.display.flip()


def mid(a, b):
    # 求出a, b点的中点坐标
    return [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2]


def draw(one, two, tri):
    # 参数代表三个顶点,上、左、右排序
    if one[0] - two[0] > 2:  # 可分
        draw(one, mid(one, two), mid(one, tri))  # 画上面的三角
        draw(mid(one, two), two, mid(two, tri))  # 画左边三角
        draw(mid(one, tri), mid(two, tri), tri)  # 画右边的三角
        pygame.display.flip()
    else:  # 达到最小结构
        pygame.draw.polygon(screen, [0, 0, 0], [one, two, tri])

draw([maxlen / 2, 0], [0, maxlen], [maxlen, maxlen])
while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

输出:

谢尔宾斯基方毯

代码:

# 谢尔宾斯基方毯

import pygame

maxlen = 500  # 边界

pygame.init()
screen = pygame.display.set_caption('谢尔宾斯基方毯')
screen = pygame.display.set_mode([maxlen, maxlen])
screen.fill([0, 0, 0])
pygame.display.flip()


def p2(p, r, d):
    # p: 参考左上顶点
    # r: 距离参考点向右偏移距离
    # d: 距离参考点向下偏离距离
    return [p[0] + r, p[1] + d]


def points(p, leni):
    # 返回p,leni对应的四边形四个顶点列表
    return [p, p2(p, leni, 0), p2(p, leni, leni), p2(p, 0, leni)]


def draw(p, leni):
    # p:左上顶点
    # leni:边长
    leni /= 3
    pygame.draw.polygon(screen, [255, 255, 255],
                        points(p2(p, leni, leni), leni))
    if leni > 3:
        draw(p, leni)
        draw(p2(p, leni, 0), leni)
        draw(p2(p, 2 * leni, 0), leni)

        draw(p2(p, 0, leni), leni)
        draw(p2(p, 2 * leni, leni), leni)

        draw(p2(p, 0, 2 * leni), leni)
        draw(p2(p, leni, 2 * leni), leni)
        draw(p2(p, 2 * leni, 2 * leni), leni)
        pygame.display.flip()

draw([0, 0], maxlen)

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

输出:

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成分形图案是利用数公式和计算机程序来实现的,以下是使用Python语言生成分形图案的一些方法: 1. Mandelbrot集合:Mandelbrot集合是一种著名的分形图案,可以通过使用Python中的matplotlib库绘制出来。具体实现方法可以参考以下代码: ```python import numpy as np import matplotlib.pyplot as plt def mandelbrot(Re, Im, max_iter): c = complex(Re, Im) z = 0.0j for i in range(max_iter): z = z*z + c if(z.real*z.real + z.imag*z.imag) >= 4: return i return max_iter def mandelbrot_set(xmin, xmax, ymin, ymax, width, height, max_iter): r1 = np.linspace(xmin, xmax, width) r2 = np.linspace(ymin, ymax, height) return [[mandelbrot(r, i, max_iter) for r in r1] for i in r2] plt.imshow(mandelbrot_set(-2.0, 0.5, -1.25, 1.25, 500, 500, 100), cmap='hot', interpolation='nearest') plt.show() ``` 2. Julia集合:Julia集合是另一种著名的分形图案,也可以使用Python中的matplotlib库绘制出来。具体实现方法可以参考以下代码: ```python import numpy as np import matplotlib.pyplot as plt def julia(Re, Im, max_iter): c = complex(-0.7, 0.27015) z = complex(Re, Im) for i in range(max_iter): z = z*z + c if(z.real*z.real + z.imag*z.imag) >= 4: return i return max_iter def julia_set(xmin, xmax, ymin, ymax, width, height, max_iter): r1 = np.linspace(xmin, xmax, width) r2 = np.linspace(ymin, ymax, height) return [[julia(r, i, max_iter) for r in r1] for i in r2] plt.imshow(julia_set(-1.5, 1.5, -1.5, 1.5, 500, 500, 100), cmap='hot', interpolation='nearest') plt.show() ``` 3. Barnsley fern:Barnsley fern是一种常见的分形植物图案,可以通过使用Python中的turtle库绘制出来。具体实现方法可以参考以下代码: ```python import turtle import random def barnsley_fern(n): x, y = 0, 0 for i in range(n): r = random.random() if r < 0.01: x, y = 0, 0.16*y elif r < 0.86: x, y = 0.85*x + 0.04*y, -0.04*x + 0.85*y + 1.6 elif r < 0.93: x, y = 0.2*x - 0.26*y, 0.23*x + 0.22*y + 1.6 else: x, y = -0.15*x + 0.28*y, 0.26*x + 0.24*y + 0.44 turtle.penup() turtle.goto(85*x, 57*y-275) turtle.pendown() turtle.dot(2, 'green') turtle.speed('fastest') turtle.hideturtle() barnsley_fern(10000) turtle.done() ``` 以上是几种常见的生成分形图案的方法,欢迎尝试!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值