📜  C / C++中的分形

📅  最后修改于: 2021-05-25 20:22:05             🧑  作者: Mango

分形是永无止境的模式。分形是无限复杂的模式,它们在不同尺度上是自相似的。通过在不断进行的反馈循环中反复重复一个简单的过程来创建它们。数学上的分形可以解释如下。

  • 屏幕上的点的位置作为初始解被输入到一个方程式中,并且该方程式被迭代了很多次。
  • 如果该方程趋向于零(即,迭代结束时的值小于初始值),则该点被涂成黑色。
  • 如果等式趋于无穷大(即最终值大于初始值),则根据增加速率(即该值趋于无穷大的速率),用适当的颜色绘制像素。

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的绝对值不小于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基础课程》。