南宁免费自助建站模板深建小程序
2026/3/7 16:20:29 网站建设 项目流程
南宁免费自助建站模板,深建小程序,国外做logo的网站,外贸网站推广平台有哪些分形#xff08;Fractal#xff09;是具有自相似性的几何图形#xff0c;小尺度下的形态与整体形态高度相似#xff0c;典型代表有曼德博集合#xff08;Mandelbrot Set#xff09;、朱利亚集合#xff08;Julia Set#xff09;、科赫雪花、分形树等。Python结合matplo…分形Fractal是具有自相似性的几何图形小尺度下的形态与整体形态高度相似典型代表有曼德博集合Mandelbrot Set、朱利亚集合Julia Set、科赫雪花、分形树等。Python结合matplotlib、numpy高效数值计算和numba加速循环可以轻松绘制出视觉效果惊艳的分形图本文从基础原理到代码实战教你画出高质量的分形图形。一、前置准备1.1 安装依赖需要的核心库numpy数值计算矩阵运算、复数处理matplotlib绘图与色彩渲染numbaJIT编译加速分形计算涉及大量循环纯Python速度慢PIL可选保存高清图片执行安装命令pipinstallnumpy matplotlib numba pillow1.2 核心优化思路分形计算的核心是迭代判断点是否属于分形集合循环次数多且计算密集用numpy向量化运算替代纯Python循环用numba.jit装饰器编译核心函数提速10~100倍合理设置色彩映射colormap提升视觉效果。二、实战1曼德博集合Mandelbrot Set曼德博集合是最经典的分形定义为复平面上满足 ( z_{n1} z_n^2 c )初始 ( z_00 )迭代不发散的点 ( cxyi ) 的集合。2.1 完整代码高清彩色importnumpyasnpimportmatplotlib.pyplotaspltfromnumbaimportjitfrommatplotlib.colorsimportLinearSegmentedColormap# 1. 核心计算函数Numba加速 jit(nopythonTrue)# JIT编译大幅提速defmandelbrot(c,max_iter):判断单个点c是否属于曼德博集合返回迭代次数用于上色z0n0whileabs(z)2andnmax_iter:zz*zc n1# 平滑上色避免迭代次数突变导致的色块ifnmax_iter:returnmax_iter# 属于集合设为最大迭代次数returnn1-np.log(np.log2(abs(z)))# 平滑后的迭代次数jit(nopythonTrue)defmandelbrot_set(x_min,x_max,y_min,y_max,width,height,max_iter):生成曼德博集合的迭代次数矩阵xnp.linspace(x_min,x_max,width)ynp.linspace(y_min,y_max,height)imgnp.zeros((height,width))foriinrange(height):forjinrange(width):ccomplex(x[j],y[i])img[i,j]mandelbrot(c,max_iter)returnimg# 2. 自定义色彩映射更美观 defcreate_fractal_cmap():创建自定义分形配色深蓝→紫色→粉色→黄色→白色colors[(0.0,0.0,0.1),# 深蓝集合内部(0.2,0.0,0.5),# 深紫(0.5,0.1,0.8),# 粉紫(0.8,0.2,1.0),# 亮粉(1.0,0.8,0.2),# 黄色(1.0,1.0,1.0)# 白色迭代次数最多]returnLinearSegmentedColormap.from_list(fractal,colors,N1024)# 3. 绘制曼德博集合 defplot_mandelbrot():# 1. 配置参数可调整视角比如放大局部细节# 全局视图x∈[-2.0, 1.0], y∈[-1.5, 1.5]# 局部细节比如“海马谷”x∈[-0.8, -0.7], y∈[0.0, 0.1]x_min,x_max-2.0,1.0y_min,y_max-1.5,1.5width,height2000,2000# 分辨率越高越清晰计算越久max_iter1000# 迭代次数越高细节越多# 2. 计算分形数据print(开始计算曼德博集合...)imgmandelbrot_set(x_min,x_max,y_min,y_max,width,height,max_iter)print(计算完成)# 3. 绘图配置plt.figure(figsize(10,10),dpi200)# dpi越高图片越清晰cmapcreate_fractal_cmap()# 自定义配色# 绘制用log缩放让色彩过渡更自然plt.imshow(img,cmapcmap,extent(x_min,x_max,y_min,y_max),aspectequal)# 4. 美化设置无坐标轴、标题等plt.axis(off)# 隐藏坐标轴plt.tight_layout(pad0)# 去除边距plt.title(Mandelbrot Set,fontsize16,colorwhite,pad10)# 可选标题# 5. 保存高清图片plt.savefig(mandelbrot_set.png,dpi300,# 保存分辨率bbox_inchestight,# 去除白边facecolorblack# 背景色分形背景用黑色更美观)plt.show()if__name____main__:plot_mandelbrot()2.2 关键优化与美化说明Numba加速jit(nopythonTrue)编译核心迭代函数2000×2000分辨率的计算时间从几十分钟缩短到几十秒平滑上色传统的“迭代次数上色”会出现明显色块通过n 1 - np.log(np.log2(abs(z)))让色彩过渡更自然自定义配色避开matplotlib默认配色用深蓝→紫色→黄色的渐变贴合曼德博集合的视觉特征高清输出设置dpi300保存无坐标轴、无白边符合壁纸级视觉效果。2.3 效果调整技巧放大局部细节修改x_min/x_max/y_min/y_max比如聚焦“海马谷”x∈[-0.8, -0.7], y∈[0.0, 0.1]能看到更精细的分形结构调整迭代次数max_iter越大细节越多但计算越久局部放大时建议设为2000更换配色修改create_fractal_cmap中的颜色值比如换成“青→绿→橙”的暖色调。三、实战2朱利亚集合Julia Set朱利亚集合与曼德博集合同源区别是迭代公式中 ( c ) 为固定常数( z_0 ) 为复平面上的点( z_{n1}z_n^2 c )。不同的 ( c ) 会生成完全不同的分形形态视觉效果同样惊艳。3.1 完整代码importnumpyasnpimportmatplotlib.pyplotaspltfromnumbaimportjitfrommatplotlib.colorsimportLinearSegmentedColormap# 1. 核心计算函数 jit(nopythonTrue)defjulia(z,c,max_iter):判断点z是否属于朱利亚集合n0whileabs(z)2andnmax_iter:zz*zc n1ifnmax_iter:returnmax_iterreturnn1-np.log(np.log2(abs(z)))jit(nopythonTrue)defjulia_set(c,x_min,x_max,y_min,y_max,width,height,max_iter):生成朱利亚集合数据xnp.linspace(x_min,x_max,width)ynp.linspace(y_min,y_max,height)imgnp.zeros((height,width))foriinrange(height):forjinrange(width):zcomplex(x[j],y[i])img[i,j]julia(z,c,max_iter)returnimg# 2. 自定义配色冷色调 defcreate_julia_cmap():colors[(0.0,0.1,0.2),# 深蓝黑(0.1,0.3,0.8),# 蓝(0.2,0.8,1.0),# 青(0.5,1.0,0.8),# 浅青(1.0,1.0,1.0)# 白]returnLinearSegmentedColormap.from_list(julia,colors,N1024)# 3. 绘制朱利亚集合 defplot_julia():# 1. 核心参数不同的c对应不同形态推荐几个经典值# c -0.8 0.156j 经典螺旋# c 0.285 0.01j 羽毛状# c -0.7269 0.1889j 蝴蝶状ccomplex(-0.8,0.156)x_min,x_max-1.5,1.5y_min,y_max-1.5,1.5width,height2000,2000max_iter1000# 2. 计算数据print(开始计算朱利亚集合...)imgjulia_set(c,x_min,x_max,y_min,y_max,width,height,max_iter)print(计算完成)# 3. 绘图plt.figure(figsize(10,10),dpi200)cmapcreate_julia_cmap()plt.imshow(img,cmapcmap,extent(x_min,x_max,y_min,y_max),aspectequal)plt.axis(off)plt.tight_layout(pad0)plt.savefig(julia_set.png,dpi300,bbox_inchestight,facecolorblack)plt.show()if__name____main__:plot_julia()3.2 经典c值推荐不同的复数 ( c ) 会生成完全不同的朱利亚集合c -0.8 0.156j螺旋状结构视觉冲击力强c 0.285 0.01j羽毛状分形细节丰富c -0.7269 0.1889j蝴蝶状分形对称美感c 0.45 0.1428j类似星系的结构。四、实战3分形树递归实现分形树是递归分形的经典案例通过“主干→分支→子分支”的自相似递归生成代码更简单适合入门。4.1 完整代码importmatplotlib.pyplotaspltimportnumpyasnp# 1. 递归绘制分形树 defdraw_fractal_tree(x,y,angle,length,depth,ax): 递归绘制分形树 :param x/y: 当前起点坐标 :param angle: 当前分支角度弧度 :param length: 当前分支长度 :param depth: 递归深度 :param ax: 绘图轴 ifdepth0:return# 计算分支终点坐标dxlength*np.cos(angle)dylength*np.sin(angle)x2xdx y2ydy# 绘制当前分支深度越浅颜色越绿线条越粗color(0.1,0.60.3*(depth/10),0.1)# 从深绿到浅绿ax.plot([x,x2],[y,y2],colorcolor,linewidthdepth/2,solid_capstyleround)# 递归绘制左分支角度偏转30°长度缩短draw_fractal_tree(x2,y2,anglenp.pi/6,length*0.7,depth-1,ax)# 递归绘制右分支角度偏转30°长度缩短draw_fractal_tree(x2,y2,angle-np.pi/6,length*0.7,depth-1,ax)# 2. 绘制分形树 defplot_fractal_tree():# 1. 初始化画布fig,axplt.subplots(figsize(10,12),dpi200)ax.set_aspect(equal)ax.set_xlim(-20,20)ax.set_ylim(0,30)ax.axis(off)# 隐藏坐标轴ax.set_facecolor(#f0f0f0)# 浅灰色背景# 2. 绘制分形树起点在底部中间初始角度向上递归深度10draw_fractal_tree(0,0,np.pi/2,10,10,ax)# 3. 保存图片plt.tight_layout(pad0)plt.savefig(fractal_tree.png,dpi300,bbox_inchestight,facecolor#f0f0f0)plt.show()if__name____main__:plot_fractal_tree()4.2 效果调整递归深度depth越大树枝越多建议10~12太大易卡顿分支角度修改np.pi/630°角度越大树越“蓬松”长度缩放修改0.7值越小分支越短树越紧凑颜色调整color的RGB值比如换成“红→橙”的秋色调。五、进阶美化技巧5.1 色彩优化避免纯黑/纯白用深灰#101010或浅灰#f8f8f8作为背景更柔和渐变配色用LinearSegmentedColormap自定义渐变贴合分形的层次对数缩放绘图时用np.log(img 1)让低迭代次数的色彩过渡更自然。5.2 高清输出设置dpi300打印级分辨率bbox_inchestight去除白边保存为PNG无损或SVG矢量图无限放大无锯齿对于超大分辨率4000×4000可分块计算避免内存溢出。5.3 动态效果可选结合matplotlib.animation制作分形演化动画比如曼德博集合放大过程# 示例简单动画框架需结合曼德博代码importmatplotlib.animationasanimation fig,axplt.subplots(figsize(10,10))defupdate(frame):# 每次帧调整x/y范围放大局部x_min-2.0frame*0.01x_max1.0-frame*0.01imgmandelbrot_set(x_min,x_max,y_min,y_max,width,height,max_iter)ax.imshow(img,cmapcmap,extent(x_min,x_max,y_min,y_max))ax.axis(off)return[ax]anianimation.FuncAnimation(fig,update,frames100,interval50)ani.save(mandelbrot_animation.mp4,writerffmpeg,dpi150)六、总结核心工具numpy数值matplotlib绘图numba加速是绘制分形的黄金组合美化关键自定义配色、平滑上色、高清无白边输出避开默认样式分形类型曼德博/朱利亚集合适合复杂精细的视觉效果需Numba加速分形树递归实现简单易上手适合入门扩展方向可尝试科赫雪花、谢尔宾斯基三角形或结合OpenCV添加滤镜效果。通过以上代码和技巧你可以轻松画出壁纸级的分形图无论是用于学习、可视化还是艺术创作都能达到专业级效果。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询