фрактальная ошибка мандлеброта в построенной функции

Привет, ребята, я пытаюсь построить фрактал мандлеброта, но результат очень далек от него, не могли бы вы помочь мне найти причину?

Вот код:

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

пожалуйста, помогите мне, мой разум сокрушается, думая, как получить красивый набор мандлбротов ... и извините, если я допустил некоторые ошибки, но английский не мой разговорный язык!


person simone dozio    schedule 09.07.2015    source источник


Ответы (2)


У вас есть некоторые нарушения в другом месте. Диапазон, который вы рисуете, не является всем набором, и я бы вычислял x и y непосредственно для каждого пикселя, а не использовал приращения (чтобы избежать накопления ошибки округления).

Но мне кажется, что ваша главная ошибка заключается в итеративных вычислениях. Вы изменяете переменную rez перед тем, как использовать ее для вычисления нового значения imz. Ваш цикл должен выглядеть примерно так:

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

    imz = 2 * rez * imz + y;
    rez = rT;
    iter++;
 }
person Peter Duniho    schedule 09.07.2015
comment
Для каждого поколения я готовил массивы координат x и y в Mset, индексированные координатами пикселей прямоугольника экрана. - person Weather Vane; 11.07.2015

В дополнение к ответу Питера вы должны использовать цветовую палитру вместо рисования только черных и белых пикселей.

Создайте массив цветов, например: (очень простой пример)

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 ... этим последним шагом.

person joe    schedule 09.07.2015
comment
Заставьте это работать, сделайте это правильно, сделайте это быстро. Пока он не может отображаться должным образом, причудливые цвета являются необязательными. - person karatedog; 09.07.2015
comment
Я пытался помочь. Нарисовав множество Мандельброта, вы не увидите результата, используя только два цвета. Поверьте, я их много рисовал. Кроме того, небольшой код, который я вам дал, — это все, что вам нужно для этого — реализация этого делается за одну минуту. - person joe; 09.07.2015
comment
Алгоритм Мандельброта касается того, уйдет ли точка в бесконечность или нет, и это бинарный выбор. Что прекрасно представлено 0 и 1, что на практике в большинстве случаев черно-белое. В любом случае, я бы не отказался от черно-белых изображений Мандельброта, они выглядят хорошо. (google.hu/search?q=mandelbrot+black+and+white ). Я просто хотел указать, что если ему понадобится помощь в создании Мандельброта, смешивание алгоритма раскраски, вероятно, добавит новую проблему к существующей. - person karatedog; 10.07.2015