分形是永无止境的模式。分形是无限复杂的模式,它们在不同尺度上是自相似的。通过在不断进行的反馈循环中反复重复一个简单的过程来创建它们。数学上的分形可以解释如下。
- 屏幕上的点的位置作为初始解被输入到一个方程式中,并且该方程式被迭代了很多次。
- 如果该方程趋向于零(即,迭代结束时的值小于初始值),则该点被涂成黑色。
- 如果等式趋于无穷大(即最终值大于初始值),则根据增加速率(即该值趋于无穷大的速率),用适当的颜色绘制像素。
Mandelbrot套装:
Mandelbrot集是复数c的集合,当从z = 0迭代时,函数f c (z)= z 2 + c不会发散,即序列fc(0),fc(fc(0 ))等,但仍以绝对值为界。
Mandelbrot集是复平面中c的值的集合,对于该值,在二次映射Z n + 1 = Z n 2 + c的迭代下0的轨道仍然是有界的。也就是说,复数c是Mandelbrot集的一部分,如果当从Z 0 = 0开始并重复应用迭代时,Z n的绝对值仍然是有界的,尽管n大。下面给出的是Mandelbrot集缩放序列的初始图像。黑点对应于集合外的数字。
Mandelbrot集的属性:
- Mandelbrot集是一个连通集,因为它始终具有从集合的一个点到集合的另一点的路径,因此路径中的所有点也都在集合中。
- Mandelbrot集具有有限的区域,但是边界的长度是无限的。
- Mandelbrot集相对于实轴对称。这意味着,如果复数属于该集合,则其共轭也将属于该集合。
- Mandelbrot集是有界的。
- Mandelbrot集本身在非精确意义上是相似的。
- Mandelbrot集的边界是具有未知分形维数的分形结构。
实现:由于分形的概念涉及方程的数学性质,因此创建分形的算法和程序很难编写和优化。人们可以找到许多产生分形的商业软件。这些程序代表已创建的一些最优化的,也许是最好的分形算法和实现。下面给出的是方法:
- 对于绘制Mandelbrot集,设置为复数的像素。
- 为像素着色(如果它属于集合)。
- 迭代通过每个像素,并计算出相应的复数,其结果将保存在c_real的实部和c_imaginary为虚部。
- 计算定义为z = z * z + c的Mandelbrot函数,其中z为复数。
- 由于复数乘法比较困难,因此请打破方程式并分别计算子部分,即实部和虚部。
- 作为复数的平方(a + ib) 2 = a 2 – b 2 + 2abi,其中2 -b 2是实部,2abi是虚部。
- 在计算z时,分别计算它们,即
Z_real = z_real*z_real – z_imaginary*z_imaginary + c_real
Z_imaginary = 2*z_real*z_imaginary + c_imaginary - 继续为每个像素计算这些值,直到达到最大迭代次数,并且z的绝对值不小于2。最后,为像素着色。
// C++ implementation for mandelbrot set fractals
#include
#include
#define MAXCOUNT 30
// Function to draw mandelbrot set
void fractal(float left, float top, float xside, float yside)
{
float xscale, yscale, zx, zy, cx, tempx, cy;
int x, y, i, j;
int maxx, maxy, count;
// getting maximum value of x-axis of screen
maxx = getmaxx();
// getting maximum value of y-axis of screen
maxy = getmaxy();
// setting up the xscale and yscale
xscale = xside / maxx;
yscale = yside / maxy;
// calling rectangle function
// where required image will be seen
rectangle(0, 0, maxx, maxy);
// scanning every point in that rectangular area.
// Each point represents a Complex number (x + yi).
// Iterate that complex number
for (y = 1; y <= maxy - 1; y++) {
for (x = 1; x <= maxx - 1; x++)
{
// c_real
cx = x * xscale + left;
// c_imaginary
cy = y * yscale + top;
// z_real
zx = 0;
// z_imaginary
zy = 0;
count = 0;
// Calculate whether c(c_real + c_imaginary) belongs
// to the Mandelbrot set or not and draw a pixel
// at coordinates (x, y) accordingly
// If you reach the Maximum number of iterations
// and If the distance from the origin is
// greater than 2 exit the loop
while ((zx * zx + zy * zy < 4) && (count < MAXCOUNT))
{
// Calculate Mandelbrot function
// z = z*z + c where z is a complex number
// tempx = z_real*_real - z_imaginary*z_imaginary + c_real
tempx = zx * zx - zy * zy + cx;
// 2*z_real*z_imaginary + c_imaginary
zy = 2 * zx * zy + cy;
// Updating z_real = tempx
zx = tempx;
// Increment count
count = count + 1;
}
// To display the created fractal
putpixel(x, y, count);
}
}
}
// Driver code
int main()
{
// gm is Graphics mode which is
// a computer display mode that
// generates image using pixels.
// DETECT is a macro defined in
// "graphics.h" header file
int gd = DETECT, gm, errorcode;
float left, top, xside, yside;
// setting the left, top, xside and yside
// for the screen and image to be displayed
left = -1.75;
top = -0.25;
xside = 0.25;
yside = 0.45;
char driver[] = "";
// initgraph initializes the
// graphics system by loading a
// graphics driver from disk
initgraph(&gd, &gm, driver);
// Function calling
fractal(left, top, xside, yside);
getch();
// closegraph function closes the
// graphics mode and deallocates
// all memory allocated by
// graphics system
closegraph();
return 0;
}
输出 :
分形的应用:分形的基本思想是在现有的不规则中找到规律。下面给出了分形的一些应用:
- 基于分形几何的事实,分形图像压缩被用于计算机科学中。通过使用此技术,与JPEG,GIF等相比,图像的压缩程度大大提高。此外,在放大图片时也没有像素化。
- 为了简化对湍流的研究,使用了分形表示法。同样,分形被用来代表石油科学中使用的多孔介质。
- 分形天线最近已被使用,这有助于减小天线的尺寸和重量并提供高性能。
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。