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

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

朱利亚集合(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!

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Julia光线追踪是一种计算机图形学中的渲染技术。它通过追踪光线的路径来模拟光线在场景中的传播和相互作用,从而生成逼真的图像。 Julia光线追踪采用了著名的朱利亚集合(也称作朱利亚图形)的数学概念。朱利亚集合是一种由复平面上的数值构成的集合,其结构充满了丰富的几何和分形特性。Julia光线追踪算法根据朱利亚集合的特性,在场景的不同位置追踪光线并计算它们与朱利亚集合的交点。 具体而言,Julia光线追踪包含以下几个步骤:首先,确定光线的起点和方向。接下来,计算光线与朱利亚集合的交点,并根据交点的位置和属性计算光线的反射、折射或吸收。然后,继续追踪下一条光线,直到达到指定的终止条件。最后,通过收集每条光线在场景中的亮度和颜色信息,生成最终的渲染图像。 Julia光线追踪技术在计算机图形学领域具有广泛的应用。它可以用于生成逼真的3D场景,如渲染动画、电影特效和虚拟现实环境。相比其他渲染技术,Julia光线追踪能够更准确地模拟光线与物体之间的相互作用,从而呈现出更真实的光影效果。 总之,Julia光线追踪是一种基于朱利亚集合数学概念的渲染技术。通过追踪光线的路径和计算与朱利亚集合的交点,它可以生成逼真的图像。这项技术在计算机图形学领域有着广泛的应用,能够产生高质量的图像和视觉效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习&实践爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值