当分辨率高于 320 像素时,Mandelbrot 代码不令人兴奋? [复制]

Posted

技术标签:

【中文标题】当分辨率高于 320 像素时,Mandelbrot 代码不令人兴奋? [复制]【英文标题】:Mandelbrot code not exciting when resolution is higher than 320 pixels? [duplicate] 【发布时间】:2019-10-16 02:36:16 【问题描述】:

我正在学习 C 并尝试新事物来测试我能做什么。我编写了代码,该代码生成了一个具有给定分辨率 (RES) 的 Mandelbrot 集,该分辨率在 .h 文件中为 #define RES。这对小于 321 的分辨率有效并产生良好的输出。由于某种原因,当 RES > 321 时代码不再执行。

我正在使用 GCC 运行并使用 Gnuplot 绘制输出。我尝试使用调试器进行调试,但是对于RES > 321main 函数不再运行?我在main() 的第一行添加了一个打印来查看,但这并没有运行。生成了可执行文件并且程序编译没有错误?

#include <stdio.h>
#include <math.h>

#define MAX_DEPTH 100
#define RES       321

typedef struct complex_t 
    double re;
    double im;
 complex;

void init_complex_grid(complex complex_grid[RES][RES], double left, double right, double top, double bottom);
int converge(complex a);
complex add_complex(complex a, complex b);
complex square_complex(complex a);
double mag_complex(complex a);
void output_grid(unsigned int grid[RES][RES]);

int main(void) 
    // printf("HERE\n");
    int i, j;
    unsigned int convergence_grid[RES][RES];
    complex complex_grid[RES][RES];
    init_complex_grid(complex_grid, -2.5, 1, 1, -1);
    for (i = 0; i < RES; i++) 
        for (j = 0; j < RES; j++) 
            convergence_grid[i][j] = converge(complex_grid[i][j]);
        
    
    output_grid(convergence_grid);
    return 0;


void init_complex_grid(complex complex_grid[RES][RES], 
                       double left, double right, 
                       double top, double bottom) 
    int i, j;
    double restep = (top - bottom) / RES;
    double imstep = (right - left) / RES;
    for (i = 0; i < RES; i++) 
        for (j = 0; j < RES; j++) 
            complex_grid[i][j].re = left + j * imstep;
            complex_grid[i][j].im = bottom + i * restep;
        
    


int converge(complex a) 
    complex z =  0, 0 ;
    int cnt = 0;
    while (cnt <= MAX_DEPTH && mag_complex(z) <= 2) 
        z = add_complex(square_complex(z), a);
        cnt++;
       
    return cnt;


complex add_complex(complex a, complex b) 
    complex added =  a.re + b.re, a.im + b.im ;
    return added;


complex square_complex(complex a) 
    complex b;
    b.re = a.re * a.re - a.im * a.im;
    b.im = 2 * a.re * b.im;
    return b;


double mag_complex(complex a) 
    return sqrt(a.re * a.re + a.im * a.im);


void output_grid(unsigned int grid[RES][RES]) 
    FILE *f = fopen("mandelbrot.dat", "w");
    int i, j;
    for (i = 0; i < RES; i++) 
        for (j = 0; j < RES; j++) 
            fprintf(f, "%d ", grid[i][j]);
        
        fprintf(f, "\n");
    
    fclose(f);
    printf("\nFILE CLOSED\n");

我还添加了printf("\nFILE CLOSED\n"); 行,这样我就知道输出已写入文件,但这也不会与RES &gt; 321 一起运行。

【问题讨论】:

您可能用完了 (stack) 空间。也许试试malloc() 和朋友complex_grid 然后我是否需要根据指针重写所有内容(例如 *((a+i)) + j))或者我仍然可以使用像 a[i][j] 这样的数组吗? 您可以使用数组表示法来访问数据。事实上,这是使用动态内存编写代码的常用方法。 fprintf(f, "%d ", grid[i][j]); 使用了不匹配的转换说明符,grid[i][j]unsigned(可能是故意的) 【参考方案1】:

您在 main() 函数中使用自动存储定义了太多数据:要么将大型数组设为全局、静态,要么从堆中分配它们。

您可以尝试以下简单的解决方法:

int main(void) 
    int i, j;
    static unsigned int convergence_grid[RES][RES];
    static complex complex_grid[RES][RES];
    init_complex_grid(complex_grid, -2.5, 1, 1, -1);
    for (i = 0; i < RES; i++) 
        for (j = 0; j < RES; j++) 
            convergence_grid[i][j] = converge(complex_grid[i][j]);
        
    
    output_grid(convergence_grid);
    return 0;

这是使用堆分配的替代方法:

int main(void) 
    int i, j;
    unsigned int (*convergence_grid)[RES] = calloc(sizeof(*convergence_grid), RES);
    complex (*complex_grid)[RES] = calloc(sizeof(*complex_grid), RES);
    if (!convergence_grid || !complex_grid) 
        fprintf(stderr, "cannot allocate arrays\n");
        return 1;
    
    init_complex_grid(complex_grid, -2.5, 1, 1, -1);
    for (i = 0; i < RES; i++) 
        for (j = 0; j < RES; j++) 
            convergence_grid[i][j] = converge(complex_grid[i][j]);
        
    
    output_grid(convergence_grid);
    free(complex_grid);
    free(convergence_grid);
    return 0;

【讨论】:

谢谢,静态再次只能达到一个限制,但使用:c complex **complex_grid; complex_grid = malloc(RES*sizeof(complex*)); for(i=0;i&lt;RES;i++) complex_grid[i] = malloc(RES*sizeof(complex)); 得到了所有排序 问题中发布的二维数组与评论中指向数组的指针或其他函数需要不同原型的指针之间存在差异。使用我的答案中的定义从堆中分配真正的二维数组并将指针传递给它们。

以上是关于当分辨率高于 320 像素时,Mandelbrot 代码不令人兴奋? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

opencv,图片像素和尺寸大小

当屏幕分辨率高于 1920x1080 时捕获视频

手机常见分辨率

iOS 字体规范和多屏适配

Mandelbrot的每个像素计算如何划分到不同的节点?

Meta viewport iPhone 4s 升级设计