Engee 文档
Notebook

基于Julia集创建分形动画

导言

1918年,法国科学家加斯顿*朱莉娅(Gaston Julia)在迭代过程中研究了复杂函数的行为,但只有随着计算机的出现,世界才看到了隐藏在他的方程中的美丽。

Julia集是秩序与混沌边界的视觉体现。 一个简单的方程 创建无限多种自相似的分形,其中每个点都冲向无穷大或保留在有限区域内。

在这个例子中,我们将看看如何使用复数,迭代和配色方案来创建Julia set形状的动画,该形状根据常量的变化角度改变其状态。

我们将附加必要的库。

In [ ]:
# import Pkg
# Pkg.add(["LinearAlgebra", "Printf", "ProgressMeter", "FileIO", "Images", "ColorSchemes", "VideoIO"])
using LinearAlgebra, Printf, ProgressMeter, FileIO, Images, ColorSchemes, VideoIO

形状和动画参数

定义动画参数。 所需参数:

*动画持续时间;
*框架宽度;
*框架高度;
*每秒帧数;
*常数的初始角度;
*常数的最终角度;
*形状的半径;
*迭代次数;
*复杂平面的尺寸(与框架的宽度和高度成比例地转换)。

In [ ]:
сек = 60  # 动画持续时间
ш = 1920  # 框架宽度
в = 1080  # 框架高度
квс = 60  # 每秒帧数
α = 2π*0.14  # 常数的初始角度
β = 2π*0.86  # 常数的最终角度
r = 0.78  # 半径
итер = 20  # 迭代次数
л = 1.5  # 复平面的线性宽度

复平面

基于初始帧,我们将计算动画中的帧数,并为复平面创建数字数组。 哪里 -实部阵列, -虚部的阵列。

In [ ]:
кадры = сек * квс  # 总帧数
# 创建一个复杂的平面
X=[x表示范围内的y(-l,l,长度=h),范围内的x(-l,l,长度=w)];
Y=[y对于范围内的y(-l,l,长度=h),范围内的x(-l,l,长度=w)];

具有表达式和迭代的函数

让我们定义一个计算每个复数的函数,并执行计算函数的迭代,并将结果值替换为函数参数。

函数定义如下:

,

哪里:

,

,

-常数的变化角度,影响图形的动画,

-假想单位。

In [ ]:
Julia的函数(X,Y,a,r,iter)
    Z = X .+ im .* Y
    C = r .* cos(a) .+ im .* r .* sin(a)
    
    对于k in1:迭代
        Z = Z .^ 2 .+ C
    end
    return exp.(-abs.(Z)), C
end

创建字幕

让我们定义一个函数,以srt格式创建字幕,以显示与形状的当前状态相对应的当前Z值。

In [ ]:
function_frame时间(k,kvs)
    T = zeros(UInt32, 4)
    квч = 3600 * квс  # 每小时帧数
    квм = 60 * квс    # 每分钟帧数
    бч = mod(к, квч)  # 没有手表的镜头
    бм = mod(бч, квм)  # 没有分钟和小时的帧
    T[1] = (к - бч) ÷ квч  # 手表
    T[2] = (бч - бм) ÷ квм  # 分钟
    T[4] = mod(бм, квс)  # 没有秒、分钟或小时的帧
    T[3] = (бм - T[4]) ÷ квс  # 秒数
    ms=round(Int,999*T[4]/(fac-1))
    субт = string(lpad(T[1], 2, '0'), ':', lpad(T[2], 2, '0'), ':', lpad(T[3], 2, '0'), ',', lpad(мс, 3, '0'))
    返回子
end

创建动画

让我们创建一个进度条并开始动画创建过程。

In [ ]:
=0
t = 0.0
时间=0.0
视频=[]
п = Progress(кадры, 1, "创建动画:")
субтитры = open("朱莉娅的设置。高级行政人员", "w")
ProgressMeter.ijulia_behavior(:clear)
对于范围内的a(α+(β-α)/帧,stop=β,step=(β-α)/帧)
    开始=时间()
    时间+=t
    框架+=1 
    速度=/最大(时间,0.001)
    剩余=(-)/速度
    ProgressMeter.next!(п; showvalues = [(:Время, @sprintf "%d秒" round(Int, время)), (:Создано, @sprintf "%d帧" кадр), (:Скорость, @sprintf "%.每秒4f帧" скорость), (:Осталось, @sprintf "%d秒" round(Int, осталось))])
    J,C=Julia(X,Y,a,r,iter)
    J[isnan.(J)] .= 0.0
    推!(视频,转换。(RGB{N0f8},得到。(Ref(ColorSchemes.岩浆),夹钳。(J,0.0,1.0))))
    write(субтитры, string(string(кадр), "\n", кадр_время(кадр-1, квс), " --> ", кадр_время(кадр, квс), "\n", "f(z) = z² ", real(C) >= 0 ? "+ " : "- ", @sprintf("%.5f", abs(real(C))), " ", imag(C) >= 0 ? "+ " : "- ", @sprintf("%.5fi", abs(imag(C))), "\n\n"))
    t=时间()-开始
end

如果!isempty(视频)
    @info "保存视频。.."
    параметры = (crf=23, preset="medium")
    VideoIO.save("很多朱莉娅.mp4", видео, framerate=квс, encoder_options=параметры)
end

关闭(字幕)

println("\重症监护室创建成功!")
println("  -总帧数:$帧数")
println("  -创建时间:∞(round(Int,time))秒")
println("  -平均创建率:$(round(frames/time,digits=4))每秒帧数")

完成动画创建过程后,当前文件夹中会出现一个带有图形的视频文件。:

Z^2.gif

如果在计算迭代而不是表达式的函数中 替换为 ,并将配色方案替换为 turbo, 我们将得到一个同样有趣的数字。

Z^3.gif

如果我们将表达式定义为 通过将配色方案替换为 rainbow,我们得到一个更不寻常的形状。

Z^Z.gif

结论

Julia集的动画不仅展示了美学,还展示了分形几何的应用价值。 基于复平面迭代变换原理的算法被用于各种科学和工程领域。

主要应用领域

*电信。
具有自相似结构的分形天线提供具有最小尺寸的多频带,这对于移动设备和卫星通信至关重要。
*计算机建模。
分形生成算法用于合成计算机图形中的自然景观,以及对多孔材料和生物结构进行建模。
*医疗诊断。
分形分析用于医学图像处理,以量化血管,神经网络和肺组织的复杂性。
*加密和数据保护。
分形系统的确定性混沌用于伪随机数生成器和隐写方法。

因此,从一个抽象的数学对象到一个实用的工具,分形代表了理论数学和应用技术之间的重要桥梁。 所展示的动画技术不仅可以可视化这些概念,还可以通过参数实验来探索动态系统中秩序和混沌之间的界限。