c программирование - множество Мандельброта

Я пытаюсь отобразить фрактал множества Мандельброта, используя программирование на C, openGL, перенасыщение Linux. Вот мой код. он отображает только точку в центре. не могу понять, где я ошибаюсь. любая помощь?

#include <GL/glut.h>    // Header File For The GLUT Library
#include <math.h>
#include <complex.h>

int main (int argc, char *argv[])
{
    int i, j, count;
    float re_max=1.0, re_min=-2.0, im_max=1.0, im_min=-1.0 ; //aspect ratio 3/2
    float real_delta = (re_max - re_min)/750;
    float imag_delta = (im_max - im_min)/500;

    double complex x = 0.0 + 0.0 * I;
    double complex z = re_min + im_min * I;

    double absolute_x;

    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowPosition(150,150);
    glutInitWindowSize(750,500); // aspect ratio of 3/2
    glutCreateWindow (argv[0]);

    glClearColor (0.1, 0.2, 0.3, 0.0);  // choosing the background color
    glClear (GL_COLOR_BUFFER_BIT);      // setting the color buffer to background color
    glColor4f(0.5,0.7,0.3,0.0);
    glPointSize(1);

    for (i=0, z = re_min + im_min * I ; i<750; i++, z = (re_min + real_delta) + im_min * I)
        {

        for (j=0, z = creal(z) + im_min * I; j<500; j++, z = creal(z) + (im_min + imag_delta) * I)
            {
            count = 0;
            x = 0 + 0*I;

            while ((absolute_x = fabs(x))<=2.0 && count < 64)
            {
                x = (x * x) + z;
                count++;
            }

                if (absolute_x <= 2.0){
                    glBegin(GL_POINTS);
                        glVertex2i(i,j);
                    glEnd();
                }
            }
        }

    glFlush();

    glutMainLoop();

    return (0);

}

Поскольку проблема с кодировкой решена, я редактирую этот вопрос с «правильным рабочим кодом» вместе с красивой картинкой получившегося фрактала :-)

Фрактал множества Мандельброта

вот рабочий код:

#include <GL/glut.h>    // Header File For The GLUT Library
#include <math.h>
#include <complex.h>

int main (int argc, char *argv[])
{
    int i, j, count;
    float re_max=1., re_min=-2.0, im_max=1.0, im_min=-1.0 ; //aspect ratio 3/2
    float real_delta = (re_max - re_min)/750;
    float imag_delta = (im_max - im_min)/500;

    double complex x = 0.0 + 0.0 * I;
    double complex z = re_min + im_min * I;

    double absolute_x;

    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowPosition(150,150);
    glutInitWindowSize(750,500); // aspect ratio of 3/2
    glutCreateWindow (argv[0]);

    glClearColor (0.5, 0.2, 0.3, 0.0);  // choosing the background color
    glClear (GL_COLOR_BUFFER_BIT);      // setting the color buffer to background color
    glColor4f(0.5,0.7,0.3,0.0);
    glPointSize(1);

    for (i=0, z = re_min + im_min * I ; i<750; i++, z = (creal(z) + real_delta) + im_min * I)
        {

        for (j=0, z = creal(z) + im_min * I; j<500; j++, z = creal(z) + (cimag(z) + imag_delta) * I)
            {
            count = 0;
            x = 0 + 0*I;

            while ((absolute_x = fabs(x))<=2.0 && count < 64)
            {
                x = (x * x) + z;
                count++;
            }

                if (absolute_x <= 2.0){
                    glBegin(GL_POINTS);
                        glVertex2f(i / 750., j / 500.);;
                    glEnd();
                }
            }
        }

    glFlush();

    glutMainLoop();

    return (0);
}

person KawaiKx    schedule 28.02.2014    source источник
comment
it only displays a dot in the center. Я скомпилировал и запустил ваш код и обнаружил, что ваш вызов glBegin никогда не вызывался, по крайней мере, на моем ноутбуке (Linux x86_64).   -  person starrify    schedule 28.02.2014
comment
Ваш цикл кажется странным: в каждом цикле i у вас есть один и тот же z, и я также думаю, что вы не получаете правильный z из цикла j   -  person starrify    schedule 28.02.2014
comment
Вы никогда не используете i и j.   -  person n. 1.8e9-where's-my-share m.    schedule 28.02.2014
comment
Если у вас есть ошибка No display callback registered for window 1, как у меня, просто добавьте glutDisplayFunc(display);, которая указывает на пустую функцию display.   -  person sZpak    schedule 25.02.2017


Ответы (1)


Есть две основные ошибки:

  1. Ваши петли выглядят странно. Цикл i не изменяет значение z на каждой своей итерации, как и j.
    Предложение: не обновляйте z в операторе цикла, что только усложнит ситуацию, вместо этого вычисляйте его непосредственно в теле цикла. как это:

    for (i=0; i<750; i++)
    {
        for (j=0; j<500; j++)
        {
            z = re_min + real_delta * i + (im_min + imag_delta * j) * I;
            /* other of your codes */
         }
     }
    
  2. Вы неправильно используете OpenGL. Вызывая glVertex2i(i, j);, вы указываете координаты x=i и y=j, но окном просмотра по умолчанию для OpenGL является (-1,1)x(-1,1).
    Вот два решения, которые вы можете использовать:

    • Размещение glScalef после создания окна, чтобы указать масштабы по координатам и не изменять другую часть вашего кода:

      /* ... */
      glutCreateWindow(argv[0]);
      glScalef(1. / 750., 1. / 500., 1.);
      /* ... */
      
    • Передача масштабированных координат:

      /* don't use this line of your code: */
      /* glVertex2i(i, j); */
      /* while use this line: */
      glVertex2f(i / 750., j / 500.);
      
person starrify    schedule 28.02.2014
comment
@Saurabh Очень приятно помочь. :D - person starrify; 28.02.2014
comment
@Saurabh Может быть, опубликуете фрактальную картинку? - person chux - Reinstate Monica; 28.02.2014
comment
@chux Теперь я добавил фрактальную картинку в сам вопрос :-) - person KawaiKx; 05.03.2014