【问题标题】:mandlebrot fractal error in the plotted function绘制函数中的 mandelbrot 分形误差
【发布时间】:2015-07-09 05:43:54
【问题描述】:

大家好,我正在尝试绘制 mandlebrot 分形,但结果离它很远,你能帮我找出原因吗?

代码如下:

void Button1Click(object sender, EventArgs e)
{
    Graphics g = pbx.CreateGraphics();
    Pen p = new Pen(Color.Black);

    double xmin = -2.0;
    double ymin = -1.2;
    double xmax = 0;
    double ymax = 0;
    double x = xmin, y = ymin;
    int MAX = 1000;

    double stepY = Math.Abs(ymin - ymax)/(pbx.Height);
    double stepX = Math.Abs(xmin - xmax)/(pbx.Width);

    for(int i = 0; i < pbx.Width; i++)
    {
        y = ymin;
        for(int j = 0; j < pbx.Height; j++)
        {
            double rez = x;
            double imz = y;
            int iter = 0;

            while(rez * rez + imz * imz <= 4 && iter < MAX)
            {
                rez = rez * rez - imz * imz + x;
                imz = 2 * rez * imz + y;
                iter++;
            }
            if(iter == MAX)
            {
                p.Color = Color.Black;
                g.DrawRectangle(p, i, j, 1, 1);
            }
            else
            {
                p.Color = Color.White;
                g.DrawRectangle(p, i, j, 1, 1);
            }
            y += stepY;
        }
        x += stepX;
    }
}

请帮帮我,我的脑子里正在想如何获得漂亮的曼陀罗套装…… 对不起,如果我犯了一些错误,但英语不是我的口语!

【问题讨论】:

    标签: c# fractals mandelbrot


    【解决方案1】:

    您在其他地方有一些违规行为。您绘制的范围不是整个集合,我会直接为每个像素计算 xy,而不是使用增量(以避免累积舍入误差)。

    但在我看来,您的主要错误似乎在于迭代计算。在计算新的imz 值之前,您正在修改rez 变量。你的循环应该看起来更像这样:

    while(rez * rez + imz * imz <= 4 && iter < MAX)
    {
        double rT = rez * rez - imz * imz + x;
    
        imz = 2 * rez * imz + y;
        rez = rT;
        iter++;
     }
    

    【讨论】:

    • 对于每一代,我都会在 Mset 中准备 x 和 y 坐标数组,由屏幕矩形像素坐标索引。
    【解决方案2】:

    除了 Peters 的回答之外,您应该使用调色板而不是仅绘制黑白像素。

    创建一个颜色数组,像这样:(非常简单的例子)

    Color[] colors = new Colors[768];
    for (int i=0; i<256; i++) {
        colors[i    ]=Color.FromArgb(    i,     0, 0);
        colors[i+256]=Color.FromArgb(255-i,     i, 0);
        colors[i+512]=Color.FromArgb(0    , 255-i, i);
    }
    

    然后使用iter的值来拉一个颜色并绘制它:

    int index=(int)((double)iter/MAX*767);
    p.Color c = colors[index];
    g.DrawRectangle(p, i, j, 1, 1);
    

    用最后一步替换整个 if (iter == MAX) ... else ... 语句。

    【讨论】:

    • “让它工作,让它正确,让它快速”。在无法正确渲染之前,花哨的颜色完全是可选的。
    • 我试图提供帮助。绘制 Mandelbrot 集,您仅用两种颜色看不到任何结果。相信我,我画了很多。此外,我给你的小代码就是你所需要的 - 实现这一点只需一分钟。
    • Mandelbrot 算法是关于一个点是否会趋于无穷大,这是二元选择。它可以完美地由 0 和 1 表示,在实践中大部分时间都是黑白的。无论如何,我不会回避 B&W Mandelbrot 图像,它们看起来不错。 (google.hu/search?q=mandelbrot+black+and+white)。我只是想指出,如果他在创建 Mandelbrot 时需要帮助,混合着色算法可能会给现有算法增加一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    相关资源
    最近更新 更多