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