如何使用Python绘制分形图案

一、目标

写一个可以画等边三角形的程序,并且在三角形的每条边上,它必须能够绘制一个稍微小一点的向外的三角形。能够根据人的意愿多次重复此过程,从而创建一些有趣的模式。

二、表示图像

把图像表示为一个二维的像素阵列。像素阵列中的每个单元格将代表该像素的颜色(RGB)。

为此,可以使用NumPy库生成像素数组,并使用Pillow将其转换为可以保存的图像。

怎么使用Python绘制分形图案

蓝色像素的x值为3,y值为4,可以通过一个二维数组访问,如pixels[4][3]

立即学习“Python免费学习笔记(深入)”;

三、画一条线

现在开始编码,首先,需要一个可以获取两组坐标并在它们之间画一条线的函数。

下面的代码通过在两点之间插值来工作,每一步都向像素阵列添加新的像素。你可以把这个过程看作是在一条线上逐个像素地进行着色。

可以在每个代码片段中使用连续字符“”来容纳一些较长的代码行。

import numpy as npfrom PIL import Imageimport mathdef plot_line(from_coordinates, to_coordinates, thickness, colour, pixels):    # 找出像素阵列的边界    max_x_coordinate = len(pixels[0])    max_y_coordinate = len(pixels)    # 两点之间沿着x轴和y轴的距离    horizontal_distance = to_coordinates[1] - from_coordinates[1]    vertical_distance = to_coordinates[0] - from_coordinates[0]    # 两点之间的总距离    distance =  math.sqrt((to_coordinates[1] - from_coordinates[1])**2                 + (to_coordinates[0] - from_coordinates[0])**2)    # 每次给一个新的像素上色时,将向前走多远    horizontal_step = horizontal_distance/distance    vertical_step = vertical_distance/distance    # 此时,将进入循环以在像素数组中绘制线    # 循环的每一次迭代都会沿着线添加一个新的点    for i in range(round(distance)):        # 这两个坐标是直线中心的坐标        current_x_coordinate = round(from_coordinates[1] + (horizontal_step*i))        current_y_coordinate = round(from_coordinates[0] + (vertical_step*i))        # 一旦得到了点的坐标,        # 就在坐标周围画出尺寸为thickness的图案        for x in range (-thickness, thickness):            for y in range (-thickness, thickness):                x_value = current_x_coordinate + x                y_value = current_y_coordinate + y                if (x_value > 0 and x_value  0 and y_value 

怎么使用Python绘制分形图案

此函数在像素阵列的每个角之间绘制一条黄线时的结果

四、画三角形

现在有了一个可以在两点之间画线的函数,可以画第一个等边三角形了。

给定三角形的中心点和边长,可以使用公式计算出高度:h = ½(√3a)。

现在利用这个高度、中心点和边长,可以计算出三角形的每个角的位置。使用之前制作的plot_line函数,可以在每个角之间画一条线。

def draw_triangle(center, side_length, thickness, colour, pixels):    # 等边三角形的高度是,h = ½(√3a)    # 其中a是边长    triangle_height = round(side_length * math.sqrt(3)/2)    # 顶角    top = [center[0] - triangle_height/2, center[1]]    # 左下角    bottom_left = [center[0] + triangle_height/2, center[1] - side_length/2]    # 右下角    bottom_right = [center[0] + triangle_height/2, center[1] + side_length/2]    # 在每个角之间画一条线来完成三角形    plot_line(top, bottom_left, thickness, colour, pixels)    plot_line(top, bottom_right, thickness, colour, pixels)    plot_line(bottom_left, bottom_right, thickness, colour, pixels)

登录后复制

怎么使用Python绘制分形图案

在500x500像素PNG的中心绘制三角形时的结果

五、生成分形

一切都已准备就绪,可以用Python创建第一个分形。

但是最后一步是最难完成的,三角形函数为它的每一边调用自己,需要能够计算每个新的较小三角形的中心点,并正确地旋转它们,使它们垂直于它们所附着的一侧。

通过从旋转的坐标中减去中心点的偏移量,然后应用公式来旋转一对坐标,可以用这个函数来旋转三角形的每个角。

def rotate(coordinate, center_point, degrees):    # 从坐标中减去旋转的点    x = (coordinate[0] - center_point[0])    y = (coordinate[1] - center_point[1])    # Python的cos和sin函数采用弧度而不是度数    radians = math.radians(degrees)    # 计算旋转点    new_x = (x * math.cos(radians)) - (y * math.sin(radians))    new_y = (y * math.cos(radians)) + (x * math.sin(radians))    # 将在开始时减去的偏移量加回旋转点上    return [new_x + center_point[0], new_y + center_point[1]]

登录后复制

怎么使用Python绘制分形图案

将每个坐标旋转35度的三角形

可以旋转一个三角形后,思考如何在第一个三角形的每条边上画一个新的小三角形。

为了实现这一点,扩展draw_triangle函数,为每条边计算一个新三角形的旋转和中心点,其边长被参数shrink_side_by减少。

一旦它计算出新三角形的中心点和旋转,它就会调用draw_triangle(自身)来从当前线的中心画出新的、更小的三角形。然后,这将反过来打击同一个代码块,为一个更小的三角形计算另一组中心点和旋转。

这就是所谓的循环算法,因为draw_triangle函数现在会调用自己,直到达到希望绘制的三角形的最大深度。有这个转义句子是很重要的,因为理论上这个函数会一直循环下去(但实际上调用堆栈会变得太大,导致堆栈溢出错误)。

def draw_triangle(center, side_length, degrees_rotate, thickness, colour,                   pixels, shrink_side_by, iteration, max_depth):    # 等边三角形的高度是,h = ½(√3a)    # 其中'a'是边长    triangle_height = side_length * math.sqrt(3)/2    # 顶角    top = [center[0] - triangle_height/2, center[1]]    # 左下角    bottom_left = [center[0] + triangle_height/2, center[1] - side_length/2]    # 右下角    bottom_right = [center[0] + triangle_height/2, center[1] + side_length/2]    if (degrees_rotate != 0):        top = rotate(top, center, degrees_rotate)        bottom_left = rotate(bottom_left, center, degrees_rotate)        bottom_right = rotate(bottom_right, center, degrees_rotate)    # 三角形各边之间的坐标    lines = [[top, bottom_left],[top, bottom_right],[bottom_left, bottom_right]]    line_number = 0    # 在每个角之间画一条线来完成三角形    for line in lines:        line_number += 1        plot_line(line[0], line[1], thickness, colour, pixels)        # 如果还没有达到max_depth,就画一些新的三角形        if (iteration  -0.0001):                if (center_of_line[0] - center[0] > 0):                    new_center = [center_of_line[0] + triangle_height *                                  (shrink_side_by/2), center_of_line[1]]                else:                    new_center = [center_of_line[0] - triangle_height *                                   (shrink_side_by/2), center_of_line[1]]            else:                # 计算直线梯度的法线                difference_from_center = -1/gradient                # 计算这条线距中心的距离                # 到新三角形的中心                distance_from_center = triangle_height * (shrink_side_by/2)                # 计算 x 方向的长度,                # 从线的中心到新三角形的中心                x_length = math.sqrt((distance_from_center**2)/                                      (1 + difference_from_center**2))                # 计算出x方向需要走哪条路                if (center_of_line[1]  0):                    x_length *= -1                # 现在计算Y方向的长度                y_length = x_length * difference_from_center                # 用新的x和y值来偏移线的中心                new_center = [center_of_line[0] + y_length,                               center_of_line[1] + x_length]            draw_triangle(new_center, new_side_length, new_rotation,                           thickness, colour, pixels, shrink_side_by,                           iteration+1, max_depth)

登录后复制

怎么使用Python绘制分形图案

三角形分形,收缩边=1/2,最大深度=2

以上就是如何使用Python绘制分形图案的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2237840.html

(0)
上一篇 2025年2月26日 19:08:05
下一篇 2025年2月24日 05:26:22

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Python中的元编程及其应用

    什么是元编程 python元编程是指在运行时对python代码进行操作的技术,它可以动态地生成、修改和执行代码,从而实现一些高级的编程技巧。python的元编程包括元类、装饰器、动态属性和动态导入等技术,这些技术都可以帮助我们更好地理解和掌…

    编程技术 2025年2月26日
    200
  • 如何使用Python的pandas库创建多层次索引(MultiIndex)?

    引言 pd.multiindex,即具有多个层次的索引。通过多层次索引,我们就可以操作整个索引组的数据。本文主要介绍在pandas中创建多层索引的6种方式: pd.MultiIndex.from_arrays():多维数组作为参数,高维指定…

    2025年2月26日 编程技术
    200
  • 如何在Python中自定义和使用函数?

    一. 应用:学员管理系统 1.1 系统简介 需求:进入系统显示系统功能界面,功能如下: 1、添加学员 2、删除学员 3、修改学员信息 4、查询学员信息 5、显示所有学员信息 立即学习“Python免费学习笔记(深入)”; 6、退出系统 系统…

    编程技术 2025年2月26日
    200
  • 使用Python进行泰坦尼克号幸存者的数据分析和预测

    数据获取 当我们成功注册账号后,可以在竞赛链接中找到泰坦尼克沉船存活的竞赛链接,如下图所示: 进入竞赛页面后,可以看到关于竞赛的简单介绍以及其他人的代码等内容,在这里我们点击Data。 注意下面的数据介绍,这里的数据介绍将会帮助我们了解数据…

    2025年2月26日 编程技术
    200
  • 如何使用ttkbootstrap为Python GUI创建优美的界面?

    这两张图片是截取官网上提供的展示效果图: 主题切换 简单的主题切换,由于当前窗口上组件很少,所以感觉效果不明显,但是当组件布局很多时就会很好看。 立即学习“Python免费学习笔记(深入)”; import ttkbootstrap as …

    2025年2月26日 编程技术
    200
  • Python中的全局空间和局部空间定义与用途

    一、空间和局部空间 1、命名空间 命名空间的概念的提出是为了划分和控制变量是否可见,以及生存周期的长短;命名空间的作用范围叫做作用域。划分一块区域保存所有数据,以字典的方式存储(变量与值形成映射关系)。一共三种。 内建命名空间:解释器启动时…

    2025年2月26日
    200
  • 如何使用Python的turtle库进行绘图?

    turtle库是python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个x(横轴)和y(纵轴)的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。 turtle绘…

    2025年2月26日 编程技术
    200
  • 学习Matplotlib数据可视化的使用方法

    1.前言 数据展示,即数据可视化,是数据分析的第五个步骤,大部分人对图形敏感度高于数字,好的数据展示方式能让人快速发现问题或规律,找到数据背后隐藏的价值。 2.Matplotlib概念 Matplotlib 是 Python 中常用的 2D…

    2025年2月26日 编程技术
    200
  • Python实现热加载配置文件的方法

    背景 由于最近工作需求,需要在已有项目添加一个新功能,实现配置热加载的功能。所谓的配置热加载,也就是说当服务收到配置更新消息之后,我们不用重启服务就可以使用最新的配置去执行任务。 如何实现 下面我分别采用多进程、多线程、协程的方式去实现配置…

    2025年2月26日
    200
  • 使用Python+Turtle库绘制蜘蛛侠的步骤

    一、效果展示 在介绍代码之前,先来看下本文的实现效果。 Pinstaller(Python打包为exe文件) 之前自己把 Python 文件打包成 exe 的时候,折腾了很久,本文将详细地讲述如何快速生成在不安装 Python 的电脑上也能…

    2025年2月26日 编程技术
    200

发表回复

登录后才能评论