绘制函数中的曼德布洛特分形误差

本文关键字:布洛特 分形 误差 函数 绘制 | 更新日期: 2023-09-27 18:01:40

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

代码如下:

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;
    }
}

请帮帮我,我的心被压碎了,想着如何得到美丽的披肩套装…如果我犯了一些错误,我很抱歉,但英语不是我的母语!

绘制函数中的曼德布洛特分形误差

你有一些不规则的地方。你绘制的范围不是整个集合,我会直接为每个像素计算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++;
 }

除了彼得斯的回答,你还应该使用调色板,而不是只画黑白像素。

创建一个颜色数组,如下所示:(非常简单的例子)

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 ...语句