我在C#中的Mandelbrot素描程序无法正常工作

时间:2018-12-13 21:02:34

标签: c# mandelbrot

我必须制作一个c#程序来创建一个窗体,并且其中的一个控件必须是一个绘制Mandelbrot集草图的控件,您可以在其中放大并指出要居中的点。我认为我做对了,但是当我想启动程序时,却没有得到标准Mandelbrot集的理想图像。对于Mandelbrot草图控件,我有了Mandelbrot类的下一部分:

class Mandelbrotsketchscreen : UserControl
{
    //a method that draws every point with a certain paint
    //a method that chooses the right colour
    //a method that translates the pixel coordinates of the control to the actual coordinates

    //gives the number how many times the function has to be used
    private static int Mandelnumber(PointF p, PointF middle, double scale, int max, Size size) 
    {
        PointF realpoint = new PointF();
        realpoint.X = (float)(middle.X + (p.X - size.Width / 2) * scale);
        realpoint.Y = (float)(middle.Y + (p.Y - size.Height / 2) * scale);
        PointF help = new PointF(0, 0);
        int i;
        for (i = 1; i <= max; i++)
        {
            help.X = help.X * help.X - help.Y * help.Y + realpoint.X;
            help.Y = 2 * help.X * help.Y + realpoint.Y;

            if (Math.Sqrt(help.X * help.X + help.Y * help.Y) > 2)
                break;
        }
        return i;
    }
}

有人可以告诉我我做错了计算还是循环不正确?

我现在得到的结果是:enter image description here

1 个答案:

答案 0 :(得分:2)

需要根据help.Xhelp.Y的先前值来计算help.Xhelp.Y的新值。

您的代码首先根据先前的 help.X help.Y 值计算新的help.X值。到目前为止,一切都很好。但是,然后,您的代码将使用新的 help.X 值而不是上一个 help.X 值来计算help.Y

因此,针对您的问题的解决方案/解决方案可以很简单:

    for (i = 1; i <= max; i++)
    {
        var newX = help.X * help.X - help.Y * help.Y + realpoint.X;
        var newY = 2 * help.X * help.Y + realpoint.Y;

        help.X = newX;
        help.Y = newY;

        if (Math.Sqrt(help.X * help.X + help.Y * help.Y) > 2)
            break;
    }

(附带说明:在我的示例中, newY 变量不是严格必需的。我选择使用它来清楚地说明help.X和help.Y的先前值与新值之间的区别。 )


埃里克·利珀特(Eric Lippert)在评论中提到了一个不同的解决方案:只需创建一个新的help点,而不要更改/修改现有的help点:

    for (i = 1; i <= max; i++)
    {
        help = new PointF(
            help.X * help.X - help.Y * help.Y + realpoint.X,
            2 * help.X * help.Y + realpoint.Y
        );

        if (help.X * help.X + help.Y * help.Y > 4)
            break;
    }

这种较短的解决方案还通过与2(= 4)的平方进行比较,消除了相当慢的平方根计算。