C语言递归分形实验-曼德勃罗集

本文介绍了大一学生在C语言课程中通过递归理解分形,以曼德勃罗集为例,详细阐述了从计算核心到交互绘制的实现过程,包括复数结构体、递归算法、迭代优化、色彩处理和交互功能。同时,讨论了代码优化和团队合作的重要性。
摘要由CSDN通过智能技术生成

这学期的线下C语言课程,大一学生学完递归后,为了加深对递归的理解,布置了一次分形图片生成实验的PBL。这次,介绍同学们实现的曼德勃罗集。以下提供了分步骤的实现思路、代码,大家可以参考。

同学们调研的目标效果

v2-e54d3b7f6d7da59498183394e25a6cfe_b.jpg

曼德勃罗特集被称为“上帝的指纹”。这个点集出自公式:Zn+1=Zn2+C,取Z0=0,然后在复平面上选取一点C,数列{Zn}就能递推下去,如果选取的C能不使{Zn}发散,我们就把它加入曼德勃罗特集。

只要你计算的点足够多,不管你把图案放大多少倍,都能显示出更加复杂的局部,这些局部既与整体不同,又与整体相似,从它出发可以产生无穷无尽美丽图案。

最终交互绘制效果

依次实现步骤

第一步

•实现计算的核心:{Z}数列的计算

•为了方便复数的计算我们还为复数定义了一个结构体

v2-7ee8286db0eafef07cb94602145d1b7a_b.jpg

•{Z}数列其递推式Zn+1=Zn2+C很明显可以用递归来实现。

•递归的伪代码如下:

v2-ae17974d3656a8efcabdc6c9ef9b9adb_b.jpg

第二步

•根据计算结果得到图案,我们没有办法做到无限次迭代,解决方法有二:

1.我们用“迭代很多次”看成“迭代无限次”,越是边界迭代越多。

2.根据数学上结论,曼德勃罗集图像会被半径为2的圆围住,所以迭代出圆后直接返回。

•然后通过查询easyx可知绘制某个像素点的函数是putpixel

•将背景设为白色,点集上的点设为黑色能得到初步图形(好丑啊啊啊啊)

v2-675fa8fa902aed14d3c34770973b6cc0_b.jpg

第三步

•美化一下。

•形状上,为了能更精细化我们增加以下Z数列的迭代次数(10次---->500次)

•颜色上,对于不同的点,想要迭代出去的话,迭代次数可能不同。根据迭代次数来划分颜色,选取的是蓝色,迭代次数越多蓝色越深。

v2-b4fc1a04f5b40a11ef274f29d8f025bb_b.jpg

第四步

•实现交互放大效果

•首先实现一个函数calc(double X,double Y,double L),功能是画“左上角坐标为(X,Y),长度为L的矩形内的曼德勃罗集”。其中每个像素点和坐标轴的换算为 L/画布长度。

•具体要放大哪一部分呢?我们可以获取用鼠标点击的坐标,来确定放大的范围。

v2-d4f29d4dadf483d06dedc533ad8ea94f_b.jpg

最终代码

#include <graphics.h>  
#include <conio.h>
#include <stdio.h>
COLORREF ys[810][810];
MOUSEMSG m1,m2;
int lastx=0,lasty=0,now,maxnow;
double goneX[233],goneY[233],goneL[233];
struct fushu
{
     
	double a,b;
};

int pan(double x,double y)
{
     
	int i;double a,b;fushu Z;
	Z.a=
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值