朱利亚集合和曼德布洛特集合及其图像

news2024/9/20 20:29:51

朱利亚集合和曼德布洛特集合及其图像

朱利亚集合(Julia Set)和 曼德布洛特集合(Mandelbrot Set)除了数学理论上的意义,所生成的分形图像,因其独特的几何美感和无限的复杂性,还被广泛应用于计算机图形学和艺术创作中,生成具有迷人复杂图案的分形图像。本文将使用Python 及NumPy、Matplotlib 库来计算和绘制朱利亚集合(Julia Set)和 曼德布洛特集合(Mandelbrot Set)的图像。

朱利亚集合(Julia Set)和 曼德布洛特集合(Mandelbrot Set),都是复数平面上的 fractals(分形),它们彼此之间有着密切的关系,但又在图形上表现得不同。

曼德布洛特集合(Mandelbrot Set)和 朱利亚集合(Julia Set)公式是一样的,

其中C是复数常数。

这是两种等价表达方式,第一种是连续形式,第二种是递归形式。

但它们的定义和计算方法有所不同:

朱利亚集合:

C是固定的复数常数

Z 是变量,代表复平面上的每个点

曼德布洛特集合:

C是变量,代表复平面上的每个点

Z的初始值固定为 0 (Z0 = 0)

两者关系:

曼德布洛特集合可以被视为朱利亚集合的"参数空间"或"索引"。曼德布洛特集合中的每个点对应一个特定的朱利亚集合。

曼德布洛特集合(Mandelbrot Set)和朱利亚集合(Julia Set)是描述同一数学现象——分形几何——的两个不同的视角或方式。具体来说,它们都是基于相同的迭代过程,但从不同的角度进行观察和研究。

朱利亚集合(Julia Set图像

常数c的选择会极大影响朱利亚集合的形状。

调整迭代次数可以影响图像的精细程度。

使用Python 及NumPy、Matplotlib 库来计算和绘制朱利亚集合图像。

【您可能需要使用以下命令安装:

pip install numpy matplotlib 】

源码如下:

import numpy as np
import matplotlib.pyplot as plt

def julia_set(h, w, max_iter, c):
    # h: 图像高度像素
    # w: 图像宽度像素
    # max_iter: 最大迭代次数,增加其值可以获得更精细的细节,但计算时间加长
    # c: 朱利亚集合的复数参数

    # 创建复平面上的网格
    # np.ogrid 生成一个开放网格,比 np.mgrid 更内存效率
    # 1j 告诉 numpy 使用复数步长,从而创建复数网格
    y, x = np.ogrid[-1.4:1.4:h*1j, -2:2:w*1j]
    
    # 将 x 和 y 组合成复数平面
    z = x + y*1j
    
    # 初始化发散时间数组,全部设置为最大迭代次数
    divtime = max_iter + np.zeros(z.shape, dtype=int)
    
    for i in range(max_iter):
        # 应用朱利亚集合迭代公式
        z = z**2 + c
        
        # 检查哪些点发散(模大于2)
        # np.conj 计算复数的共轭,用于计算模的平方
        diverge = z*np.conj(z) > 2**2
        
        # 找出本次迭代新发散的点
        div_now = diverge & (divtime==max_iter)
        
        # 记录新发散点的发散时间
        divtime[div_now] = i
        
        # 将发散的点设置为2,防止溢出
        z[diverge] = 2
    
    return divtime


# 设置参数
h, w = 1000, 1500
max_iter = 100
c = -0.4 + 0.6j  # 可以尝试不同的 c 值

# 计算朱利亚集合
julia = julia_set(h, w, max_iter, c)

# 创建图像
fig, ax = plt.subplots(figsize=(12, 8))
#其中cmap='hot',使用 'hot' 颜色映射来显示结果。还可选用如 'viridis'、'cool' 或 'plasma'
ax.imshow(julia, cmap='hot', extent=[-2, 2, -1.4, 1.4])
ax.set_title(f'Julia Set for c = {c}')
ax.set_xlabel('Re(z)')
ax.set_ylabel('Im(z)')

# 显示图像
plt.show()

# 保存图像(可选)
# plt.savefig('julia_set.png', dpi=300, bbox_inches='tight')

运行效果:

以下是一些著名的和视觉上吸引人的 c 值,您可以在之前的代码中尝试:

  1. c = -0.4 + 0.6j
    经典的"树枝状"朱利亚集合
  2. c = -0.8 + 0.156j
    著名的"龙形"朱利亚集合
  3. c = -0.7269 + 0.1889j
    复杂的螺旋结构
  4. c = 0.285 + 0.01j
    精致的"雪花"图案
  5. c = -0.835 - 0.2321j
    "兔子"朱利亚集合
  6. c = -0.8 + 0.2j
    "海马"形状
  7. c = -0.75
    对称的分形图案
  8. c = -0.1 + 0.651j
    有趣的"爪形"结构
  9. c = -0.39054 - 0.58679j
    "树枝状"结构
  10. c = 0.355534 - 0.337292j
    复杂的分形结构

曼德布洛特集合(Mandelbrot Set图像

使用 NumPy 和 Matplotlib 库来计算和绘制曼德布洛特集合(Mandelbrot Set)图像。源码如下:

import numpy as np
import matplotlib.pyplot as plt

def mandelbrot_set(h, w, max_iter, y, x):
    """
    计算 Mandelbrot 集。
    
    参数:
    h, w : int
        图像的高度和宽度。
    max_iter : int
        最大迭代次数。
    y, x : numpy.ndarray
        复平面上的y和x坐标网格。
    
    返回:
    numpy.ndarray
        每个点的发散时间。
    """
    # 创建复数平面
    c = x + y*1j
    
    # 初始化z为c(Mandelbrot集的特性)
    z = c
    
    # 初始化发散时间数组
    divtime = max_iter + np.zeros(z.shape, dtype=int)

    for i in range(max_iter):
        # 应用Mandelbrot迭代公式: z = z^2 + c
        z = z**2 + c
        
        # 检查哪些点发散(模大于2)
        diverge = z*np.conj(z) > 2**2
        
        # 找出本次迭代新发散的点
        div_now = diverge & (divtime==max_iter)
        
        # 记录新发散点的发散时间
        divtime[div_now] = i
        
        # 将发散的点设置为2,防止数值溢出
        z[diverge] = 2

    return divtime

def plot_mandelbrot(h, w, max_iter, y_range, x_range, cmap='viridis', title='Mandelbrot Set'):
    """
    绘制 Mandelbrot 集。
    
    参数:
    h, w : int
        图像的高度和宽度。
    max_iter : int
        最大迭代次数。
    y_range : tuple
        y轴的范围,格式为(y_min, y_max)。
    x_range : tuple
        x轴的范围,格式为(x_min, x_max)。
    cmap : str, 可选
        颜色映射的名称。默认为'viridis'。
    title : str, 可选
        图像的标题。默认为'Mandelbrot Set'。
    """
    # 创建复平面上的网格
    y, x = np.ogrid[y_range[0]:y_range[1]:h*1j, x_range[0]:x_range[1]:w*1j]
    
    # 计算Mandelbrot集
    mandelbrot = mandelbrot_set(h, w, max_iter, y, x)

    # 创建图像
    fig, ax = plt.subplots(figsize=(12, 8))
    
    # 绘制Mandelbrot集
    im = ax.imshow(mandelbrot, cmap=cmap, extent=[x_range[0], x_range[1], y_range[0], y_range[1]])
    
    # 设置标题和坐标轴标签
    ax.set_title(title)
    ax.set_xlabel('Re(c)')
    ax.set_ylabel('Im(c)')
    
    # 添加颜色条
    plt.colorbar(im, ax=ax, label='Iteration count')
    
    # 显示图像
    plt.show()

    # 保存图像(可选)
    # plt.savefig('mandelbrot_set.png', dpi=300, bbox_inches='tight')
    

# 设置参数
h, w = 1000, 1500
max_iter = 100

# 完整的 Mandelbrot 集
plot_mandelbrot(h, w, max_iter, [-1.4, 1.4], [-2, 0.8], title='Full Mandelbrot Set')

运行效果:

调整参数可探索 Mandelbrot 集图像的不同部分,观察细节精细的结构:

# 主体左侧的小芽结构

plot_mandelbrot(h, w, max_iter, [-0.1, 0.1], [-1.5, -1.3], title='Left Bulb of Mandelbrot Set')

# 主体顶部的螺旋结构

plot_mandelbrot(h, w, max_iter, [0.3, 0.5], [-0.1, 0.1], title='Top Spiral of Mandelbrot Set')

# 主体右侧的触须结构

plot_mandelbrot(h, w, max_iter, [-0.05, 0.05], [0.25, 0.35], title='Right Tendril of Mandelbrot Set')

# 主体底部的细小分支

plot_mandelbrot(h, w, max_iter, [-1.0, -0.8], [-0.1, 0.1], title='Bottom Filaments of Mandelbrot Set')

# 主卡迪奥球体边缘的细节

plot_mandelbrot(h, w, max_iter, [-0.02, 0.02], [-0.78, -0.74], title='Main Cardioid Edge Detail')

# 深度放大的边界细节

plot_mandelbrot(h, w, max_iter*2, [-0.001, 0.001], [-0.751, -0.749], title='Deep Zoom Boundary Detail')

OK!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038306.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

增强现实系列—深入探索ARKit:平面检测、三维模型放置与增强现实交互

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

技术研究:Redis 实现消息队列

综述 我们先看看消息队列的消息存取到底有哪些需求吧: 需求1:消息保序:由于消费者是异步处理消息,但是消费者需要按照生产者发送消息的顺序来处理消息,避免后发送的消息被先处理了。 需求2:重复消息处理&…

【区块链+金融服务】河北股权交易所综合金融服务平台 | FISCO BCOS应用案例

区域性股权市场是我国资本市场的重要组成部分,是多层次资本市场体系的基石。河北股权交易所(简称:河交所) 作为河北省唯一一家区域性股权市场运营机构,打造河北股权交易所综合金融服务平台,将区块链技术与区…

信号与系统MATLAB实验:连续信号的采样与恢复

一、实验内容 (1)修改示例中的门信号宽度、采样周期等参数,重新运行程序,观察得到的采样信号时域和频域特性,以及重构信号与误差信号的变化。 示例1:选取门信号f(t) g2(t)为被采样信号。利用MATLAB实现对…

搭建超好用的个人网盘

目录 前言filebrowser下载地址介绍优点缺点部署效果 cloudreve官网介绍优点缺点部署效果 总结 前言 目前我使用过的文件存储管理软件,包括fastdfs、minio、filebrowser、cloudreve,这4款软件,我自己亲自搭建且都使用过,fastdfs很…

Datawhale X 魔搭 AI夏令营第四期 AIGC方向 task02笔记

AI工具使用 1. baseline 代码2. 使用通义千问理解代码2.1 工作流程2.2 逐行释意 3. 使用通义千问生成 Prompt3.1 生成的 Prompt3.1 根据 Prompt 生成的图片 1. baseline 代码 !pip install simple-aesthetics-predictor!pip install -v -e data-juicer!pip uninstall pytorch-…

docker的基本管理和应用

1、概念 docker是一个开源的应用容器引擎,基于go语言开发的。 docker是运行在linux的容器化工具,可以理解为轻量级的虚拟机。 可以在任何主机上轻松创建的一个轻量级、可移植的、自给自足的容器 2、设计的理念 鲸鱼——宿主机 集装箱——独立运行的…

07:【stm32】中断一:NVIC的配置

中断 1、中断的简介1.1、什么是中断1.2、为什么需要中断 2、中断的优先级2.1、中断优先级的表示方法 3、NVIC3.1、什么的NVIC3.2、NVIC的内部结构3.3、中断向量表3.4、程序实现①开启中断源②配置NVIC③中断响应函数 1、中断的简介 1.1、什么是中断 正在进行的事务被突发事件打…

1688商品详情API返回值中的供应商信息

在使用1688(阿里巴巴中国站)的商品详情API时,API的返回值中通常会包含丰富的产品信息,包括供应商(卖家)的信息。不过,具体的返回值内容可能会根据API的版本、调用参数以及API的更新情况有所不同…

什么是国际网络组网?

国际网络组网是指通过互联网技术将全球各地的不同网络相互连接,以实现信息交换与资源共享的过程。在这一过程中,涉及到数据传输、协议转换、跨网络通信等多个技术领域,旨在实现全球信息的无缝互联互通。国际网络组网的主要目标是扩大网络覆盖…

半导体RFID识别系统134.2K低频读写器|读写头JY-V610之SECS协议通信说明

什么是SECS协议? SECS(Semiconductor Equipment Communication Standard)协议是半导体设备通讯标准,用来统一各个生产设备之间以及生产设备和控制设备之间的通讯,由SEMI(Semiconductor Equipment and Mate…

手搓滑动窗口

前言&#xff1a;好久没写滑动窗口&#xff0c;导致一些边界问题处理不好&#xff0c;back和top的初始值都搞不好 #include<bits/stdc.h> using namespace std;const int N (int)1e65; int n,m; int a[N],b[N]; int back,top;int main(){cin >> n >> m;for(…

【前端设计方案】H5 图片懒加载 SDK

实现思路 定义<img srcloading.png data-srcxxx.png/>页面滚动&#xff0c;图片露出时&#xff0c;将 data-src 赋值给 src 注意事项&#xff1a;滚动要节流 技术要点 获取图片的位置 elem.getBoundingClientRect() 图片 top < window.innerHeight 时&#xff0c;图片…

【学习笔记】爱立信SPO 1400 CRAFT软件基础知识9——Bridge(网桥)显示参数

一、前期准备 条件1.确认已正确使用爱立信SPO 1400 CRAFT软件通过网络登录设备&#xff08;以下简称NE&#xff09; 具体登录教程参考&#xff1a;使用爱立信SPO 1400 CRAFT软件通过网络登录设备的详细过程 二、学习内容&#xff1a; 提示&#xff1a;学习爱立信SPO 1400 CRA…

阿里员工:33岁,房贷还剩223万,每月还1.5W,失业中

中年失业 中年失业&#xff0c;真的很难。 虽然人到中年&#xff0c;一般多少都会有些储蓄&#xff0c;但也意味着会有更多的支出。 最近&#xff0c;一位阿里员工&#xff08;这会可能是前阿里员工了&#xff09;在社区分享到自己的经历。 贴主 33 岁&#xff0c;作为已结婚有…

搬瓦工日本软银线路VPS测评

搬瓦工日本VPS支持softbank/软银&#xff0c;Japan: Osaka (Softbank) &#xff0c;网络在2.5Gbps-10Gbps之间&#xff0c;底层为KVM虚拟、纯SSD阵列、支持在多机房之间切换。搬瓦工软银来国内的网络情况怎么样&#xff1f;测评数据大致如下&#xff1a; CPU具体型号不知道&…

深入了解指针(6)

文章目录 1.函数指针数组2.转移表3.回调函数 1.函数指针数组 存放函数指针的数组 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int add(int x, int y) {return x y; } int sub(int x, int y) {return x - y; }int main() {int (*p1)(int x, int y) add;int (…

基于python的百度迁徙迁入、迁出数据分析(八)

副标题&#xff1a;从百度迁徙数据看——重大公共卫生事件的影响 先来回顾一下&#xff0c;迁徙规模指数定义&#xff1a;反映迁入或迁出人口规模&#xff0c;城市间可横向对比。 2019年—2022年的部分春运数据已经不可查&#xff0c;用的环哥的数据&#xff0c;可参考环哥的…

LVS原理及相关配置

1. 描述以及工作原理 1. 什么是 LVS linux virtural server 的简称&#xff0c;也就是 linxu 虚拟机服务器&#xff0c;这是一个 由章文嵩博士发起的开源项目&#xff0c;官网是 http://www.linuxvirtualserver.org,现在 lvs 已经是 linux 内核标 准的一部分&#xff0c;使用…

用python的manim库实现表格格式操作【table 下】

1.Table 是 Manim 中用于创建一个包含文本或其他 数学符号的表格的类 Table 是 Manim 中用于创建一个包含文本或其他 数学符号的表格的类它能够帮助你在场景中清晰地展示数据或信息。 参数解释 table: 一个二维数组或列表&#xff0c;表示表格中的内容。每个子列表代表表格的…