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

曼德勃罗特集被称为“上帝的指纹”。这个点集出自公式:Zn+1=Zn2+C,取Z0=0,然后在复平面上选取一点C,数列{Zn}就能递推下去,如果选取的C能不使{Zn}发散,我们就把它加入曼德勃罗特集。
只要你计算的点足够多,不管你把图案放大多少倍,都能显示出更加复杂的局部,这些局部既与整体不同,又与整体相似,从它出发可以产生无穷无尽美丽图案。
最终交互绘制效果
依次实现步骤
第一步
•实现计算的核心:{Z}数列的计算
•为了方便复数的计算我们还为复数定义了一个结构体

•{Z}数列其递推式Zn+1=Zn2+C很明显可以用递归来实现。
•递归的伪代码如下:

第二步
•根据计算结果得到图案,我们没有办法做到无限次迭代,解决方法有二:
1.我们用“迭代很多次”看成“迭代无限次”,越是边界迭代越多。
2.根据数学上结论,曼德勃罗集图像会被半径为2的圆围住,所以迭代出圆后直接返回。
•然后通过查询easyx可知绘制某个像素点的函数是putpixel
•将背景设为白色,点集上的点设为黑色能得到初步图形(好丑啊啊啊啊)

第三步
•美化一下。
•形状上,为了能更精细化我们增加以下Z数列的迭代次数(10次---->500次)
•颜色上,对于不同的点,想要迭代出去的话,迭代次数可能不同。根据迭代次数来划分颜色,选取的是蓝色,迭代次数越多蓝色越深。

第四步
•实现交互放大效果
•首先实现一个函数calc(double X,double Y,double L),功能是画“左上角坐标为(X,Y),长度为L的矩形内的曼德勃罗集”。其中每个像素点和坐标轴的换算为 L/画布长度。
•具体要放大哪一部分呢?我们可以获取用鼠标点击的坐标,来确定放大的范围。

最终代码
#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=