полет над плазменным фракталом — алгоритм алмазного квадрата

Это заняло у меня некоторое время, но я смог успешно реализовать алгоритм алмазного квадрата для рисования плазменного фрактала с использованием OpenGL. Это делается с помощью рекурсивной функции, которая используется каждый раз, когда генерируется сцена (я думаю). Далее я хотел добавить дополнительную функцию, позволяющую зрителю перемещаться по сгенерированному фракталу. Однако проблема в том, что я не могу заставить его работать … вот мои вопросы:

Может ли алгоритм быть представлен один раз? (Я не использую какие-либо массивы для записи сгенерированных точек или цветов). Это просто вопрос модификации сцены визуализации, чтобы сделать это?

Как я могу избавиться от серых пространств между квадратами?

Если нет другого способа сделать это, кроме хранения записи значений (то есть в массиве), не могли бы вы дать мне совет, потому что я теряюсь в установке индексов массива …

Вот код (хотя комментарии на польском, а также некоторые переменные):

#include <Windows.h>
#include <gl\GL.h>
#include <glut.h>

#include <iostream>
#include <time.h>
#include <math.h>
#include <random>

using namespace std;

typedef float point3[3];

GLfloat ile;
bool kolor = 0;
bool gauss = 0;
int model = 0; // 0- siatka, 1 - trójkąty, 2-próba
static const double pi = 3.1415927;

static GLfloat theta[] = { 0.0, 0.0, 0.0 }; //trzy kąty obroty wokół osi x, y, z

void RenderScene(void);
void sr_boku(GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h, GLfloat c1, GLfloat c2, GLfloat c3, GLfloat c4);

//Rozkład Gaussa
double normal(double mean, double std)
{
default_random_engine generator;
normal_distribution<double> distribution(mean, std);
return distribution(generator);
//std*sqrt(-2 * log(rand() + 1) / (RAND_MAX + 1))*sin(2 * pi * rand() / (RAND_MAX + 1)) + mean;
}

class Kolor
{
public:
GLfloat r;
GLfloat g;
GLfloat b;
};

//Funkcja reagująca na naciskane klawisze
void czytajKlawisz(unsigned char key, int x, int y)
{
switch (key)
{
case '=':
case '+':
{
ile = ile * 2;
break;
}
case '-':
{
ile = ile / 2;
break;
}
case 'k':
{
if (kolor == 0)
kolor = 1;
else
kolor = 0;
break;
}
case 'g':
{
if (gauss == 0)
gauss = 1;
else
gauss = 0;
}
case '1':
case 's':
{
model = 0;
break;
}
case '2':
case 't':
{
model = 1;
break;
}
case '3':
case 'p':
{
model = 2;
break;
}
case 27:
break;
}

glutPostRedisplay();
}void koloruj(GLfloat c, Kolor &kolor)
{
if (c < 0.5)
kolor.r = c * 2;
else
kolor.r = (1.0 - c) * 2;
if (c >= 0.3 && c < 0.8)
kolor.g = (c - 0.3) * 2;
else if (c < 0.3)
kolor.g = (0.3 - c) * 2;
else
kolor.r = (1.3 - c) * 2;
if (c >= 0.5)
kolor.b = (c - 0.5) * 2;
else
kolor.b = (0.5 - c) * 2;
}

GLfloat displace(GLfloat num, int max, int ziarno)
{
GLfloat m = num / (float)(max)* ziarno;
return ((GLfloat)(rand() % 101)*0.01f - 0.5f) * m;
}

//Wyrysowanie osi układu współrzędnych
void Axes(void)
{
point3 xmin = { -5.0f, 0.0f, 0.0f };
point3 xmax = { 5.0f, 0.0f, 0.0f };

point3 ymin = { 0.0f, -5.0f, 0.0f };
point3 ymax = { 0.0f, 5.0f, 0.0f };

point3 zmin = { 0.0f, 0.0f, -5.0f };
point3 zmax = { 0.0f, 0.0f, 5.0f };

glRotated(45.0, 1.0, -0.1, 0.1);

glColor3f(10.0f, 0.0f, 0.0f);   //Ustawienie koloru rysowania na czerwony -oś X
glBegin(GL_LINES);
glVertex3fv(xmin);
glVertex3fv(xmax);
glEnd();

glColor3f(0.0f, 10.0f, 0.0f);   //Ustawienie koloru rysowania na zielony -oś Y
glBegin(GL_LINES);
glVertex3fv(ymin);
glVertex3fv(ymax);
glEnd();

glColor3f(0.0f, 0.0f, 01.0f);   //Ustawienie kolory rysowania na niebieski -oś Z
glBegin(GL_LINES);
glVertex3fv(zmin);
glVertex3fv(zmax);
glEnd();
}

//Funkcja zwrotną odpowiedzialna za obrót modelu wokół osi
void spin()
{
theta[0] -= 0.000005;
if (theta[0] > 360.0)
theta[0] -= 360.0;

theta[1] -= 0.000005;
if (theta[1] > 360)
theta[1] -= 360.0;

theta[2] -= 0.00005;
if (theta[2] > 360.0)
theta[2] -= 360.0;

glutPostRedisplay(); //odświeżenie zawartości aktualnego okna
}

//Fraktal
void fraktal(int w, int h)
{
float c1, c2, c3, c4;
int x, y;

x = w / 2;
y = h / 2;
GLfloat z = (GLfloat)(rand() % 101) / 10.0f;

c1 = (GLfloat)(rand() % 101) / 100.0f;
c2 = (GLfloat)(rand() % 101) / 100.0f;
c3 = (GLfloat)(rand() % 101) / 100.0f;
c4 = (GLfloat)(rand() % 101) / 100.0f;

sr_boku(-x, -y, z, w, h, c1, c2, c3, c4);
}

//Główna funkcja rysująca
void sr_boku(GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h, GLfloat c1, GLfloat c2, GLfloat c3, GLfloat c4)
{
GLfloat middle;
GLfloat w1, w2, w3, w4;
GLfloat new_w = w / 2.0f;
GLfloat new_h = h / 2.0f;

//inne podejście
if (model == 0)     //siatka
{
if (h> ile || w > ile)
{
middle = (c1 + c2 + c3 + c4)*0.25 + displace(h + w, 30, 3);
w1 = (c1 + c2) / 2.0f;
w2 = (c2 + c3) / 2.0f;
w3 = (c3 + c4) / 2.0f;
w4 = (c4 + c1) / 2.0f;if (middle > 1.0f)
middle = 1.0f;
if (middle < 0.0f)
middle = 0.5f;

sr_boku(x, y, z, new_w, new_h, w4, middle, w3, c4);// , n - 1);
sr_boku(x + new_w, y, z, new_w, new_h, middle, w2, c3, w3);// , n - 1);
sr_boku(x + new_w, y+new_h, z, new_w, new_h, w1, c2, w2, middle);// , n - 1);
sr_boku(x, y+new_h, z, new_w, new_h, c1, w1, middle, w4);// , n - 1);

}
else
{
GLfloat z1 = c1 * 5;
GLfloat z2 = c2 * 5;
GLfloat z3 = c3 * 5;
GLfloat z4 = c4 * 5;
Kolor kk;
glBegin(GL_QUADS);
koloruj(c1, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y + new_h, z1 - 2.5f);
koloruj(c2, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x + new_w, y + new_h, z2 - 2.5f);
koloruj(c3, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x + new_w, y, z3 - 2.5f);
koloruj(c4, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y, z4 - 2.5f);
glEnd();

}
}
if (model == 1)     //trójkąty
{
if (h> ile || w > ile)
{
middle = (c1 + c2 + c3 + c4)*0.25 + displace(h + w, 60, 3);
w1 = (c1 + c2) / 2.0f;
w2 = (c2 + c3) / 2.0f;
w3 = (c3 + c4) / 2.0f;
w4 = (c4 + c1) / 2.0f;if (middle > 1.0f)
middle = 1.0f;
if (middle < 0.0f)
middle = 0.0f;

sr_boku(x, y, z, new_w, new_h, w4, middle, w3, c4);// , n - 1);
sr_boku(x + new_w, y, z, new_w, new_h, middle, w2, c3, w3);// , n - 1);
sr_boku(x + new_w, y +new_h, z, new_w, new_h, w1, c2, w2, middle);// , n - 1);
sr_boku(x, y+new_h, z, new_w, new_h, c1, w1, middle, w4);// , n - 1);

}
else
{
GLfloat z1 = c1 * 5;
GLfloat z2 = c2 * 5;
GLfloat z3 = c3 * 5;
GLfloat z4 = c4 * 5;
Kolor kk;
glBegin(GL_TRIANGLE_FAN);
koloruj(c1, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y + new_h, z1 - 2.5f);
koloruj(c2, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x + new_w, y + new_h, z2 - 2.5f);
koloruj(c3, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x + new_w, y, z3 - 2.5f);
koloruj(c4, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y, z4 - 2.5f);
glEnd();
}
}
if (model == 2)     //proby
{
if (h > ile || w > ile)
{
middle = (c1 + c2 + c3 + c4)*0.25 + displace(h + w, 60, 3);
w1 = (c1 + c2) / 2.0f;
w2 = (c2 + c3) / 2.0f;
w3 = (c3 + c4) / 2.0f;
w4 = (c4 + c1) / 2.0f;if (middle > 1.0f)
middle = 1.0f;
if (middle < 0.0f)
middle = 0.0f;

sr_boku(x, y, z, new_w, new_h, w4, middle, w3, c4);// , n - 1);
sr_boku(x + new_w, y, z, new_w, new_h, middle, w2, c3, w3);// , n - 1);
sr_boku(x + new_w, y + new_h, z, new_w, new_h, w1, c2, w2, middle);// , n - 1);
sr_boku(x, y + new_h, z, new_w, new_h, c1, w1, middle, w4);// , n - 1);

}
else
{
GLfloat z1 = normal(5, 5);
GLfloat z2 = normal(5, 5);
GLfloat z3 = normal(5, 5);
GLfloat z4 = normal(5, 5);
Kolor kk;
glBegin(GL_TRIANGLES);
koloruj(c1, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y + new_h, z1 - 2.5f);
koloruj(c2, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x + new_w, y + new_h, z2 - 2.5f);
koloruj(c4, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y, z4 - 2.5f);
glEnd();

glBegin(GL_TRIANGLES);
koloruj(c2, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x + new_w, y + new_h, z2 - 2.5f);
koloruj(c3, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y, z4 - 2.5f);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x + new_w, y, z3 - 2.5f);
koloruj(c4, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y, z4 - 2.5f);
glEnd();
}
}

}

// Funkcjs określająca co ma byc narysowane
void RenderScene(void)
{
// Czyszczenie okna aktualnym kolorem czyszczącym
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

srand(time(NULL));

//Obrócenie modelu wokół osi x, y, z
//glRotatef(theta[0], 0.01, 0.0, 0.0);
//glRotatef(theta[1], 0.0, 0.01, 0.0);
//glRotatef(theta[2], 0.0, 0.0, 0.01);

Axes();
fraktal(60, 60);
//fraktal(-90, 90, 180);

// Przekazanie poleceń rysujących do wykonania
glFlush();

glutSwapBuffers();
}

// Funkcja ustalająca stan renderowania
void MyInit(void)
{
// Kolor wnętrza okna - szary
glClearColor(0.5, 0.5f, 0.5f, 1.0f);
}

// Funkcja zachowująca proporcje rysowanych obiektów
void ChangeSize(GLsizei horizontal, GLsizei vertical)
{
GLfloat AspectRatio;

if (vertical == 0)
vertical = 1;

//Ustawienia wielkości okna urządzenia
glViewport(0, 0, horizontal, vertical);

// Określenie układu współrzędnych obserwatora
glMatrixMode(GL_PROJECTION);

// Określenie przestrzeni ograniczającej
glLoadIdentity();

// Współczynnik proporcji okna
AspectRatio = (GLfloat)horizontal / (GLfloat)vertical;

if (horizontal <= vertical)
glOrtho(-7.5, 7.5, -7.5 / AspectRatio, 7.5 / AspectRatio, 10.0, -10.0);
else
glOrtho(-7.5*AspectRatio, 7.5*AspectRatio, -7.5, 7.5, 10.0, -10.0);

// Określenie układu współrzędnych
glMatrixMode(GL_MODELVIEW);

glLoadIdentity();
}

void main(void)
{

//wywołanie funkcji wypełniającej funkcje W(x) i Wc(x)
//funkcja_grey(250);
ile = 0.1;

// Ustawienia trybu wyświetlania (podwójny or rgb or głęboki)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

// Utworzenie okna z nazwą na pasku stanu
glutCreateWindow("Fraktal Plazmowy w 3d v0.8");

//Funkcja reagująca na naciskane klawisze
glutKeyboardFunc(czytajKlawisz);

// Określenie funkcji RenderScene jako funkcji zwrotnej
glutDisplayFunc(RenderScene);

//Funkcja rejestrująca funkcje zwrotną
//glutIdleFunc(spin);

// Określenie funkcji zwrotnej odpowiedzialnej za rozmiar okna
glutReshapeFunc(ChangeSize);

// Wykonanie wszelki przygotowań przed rozpoczęciem renderowania
MyInit();

glEnable(GL_DEPTH_TEST);

// Uruchomienie szkieletu biblioteki GLUT
glutMainLoop();
}

Вот как это выглядит:

1

Решение

Если вы не можете или не хотите реорганизовать свой генератор для выделения геометрии вместо вызовов OpenGL, вы можете использовать списки отображения для захвата выходных данных:

#include <GL/glut.h>
#include <iostream>
#include <time.h>
#include <cmath>
#include <random>

using namespace std;

typedef float point3[3];

GLfloat ile;
int model = 0; // 0- siatka, 1 - trójkąty, 2-próba
static const double pi = 3.1415927;

//Rozkład Gaussa
double normal(double mean, double std)
{
default_random_engine generator;
normal_distribution<double> distribution(mean, std);
return distribution(generator);
}

class Kolor
{
public:
GLfloat r;
GLfloat g;
GLfloat b;
};

void koloruj(GLfloat c, Kolor &kolor)
{
if (c < 0.5)
kolor.r = c * 2;
else
kolor.r = (1.0 - c) * 2;
if (c >= 0.3 && c < 0.8)
kolor.g = (c - 0.3) * 2;
else if (c < 0.3)
kolor.g = (0.3 - c) * 2;
else
kolor.r = (1.3 - c) * 2;
if (c >= 0.5)
kolor.b = (c - 0.5) * 2;
else
kolor.b = (0.5 - c) * 2;
}

GLfloat displace(GLfloat num, int max, int ziarno)
{
GLfloat m = num / (float)(max)* ziarno;
return ((GLfloat)(rand() % 101)*0.01f - 0.5f) * m;
}

//Główna funkcja rysująca
void sr_boku(GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h, GLfloat c1, GLfloat c2, GLfloat c3, GLfloat c4)
{
GLfloat middle;
GLfloat w1, w2, w3, w4;
GLfloat new_w = w / 2.0f;
GLfloat new_h = h / 2.0f;

//inne podejście
if (model == 0)     //siatka
{
if (h> ile || w > ile)
{
middle = (c1 + c2 + c3 + c4)*0.25 + displace(h + w, 30, 3);
w1 = (c1 + c2) / 2.0f;
w2 = (c2 + c3) / 2.0f;
w3 = (c3 + c4) / 2.0f;
w4 = (c4 + c1) / 2.0f;if (middle > 1.0f)
middle = 1.0f;
if (middle < 0.0f)
middle = 0.5f;

sr_boku(x, y, z, new_w, new_h, w4, middle, w3, c4);// , n - 1);
sr_boku(x + new_w, y, z, new_w, new_h, middle, w2, c3, w3);// , n - 1);
sr_boku(x + new_w, y+new_h, z, new_w, new_h, w1, c2, w2, middle);// , n - 1);
sr_boku(x, y+new_h, z, new_w, new_h, c1, w1, middle, w4);// , n - 1);
}
else
{
GLfloat z1 = c1 * 5;
GLfloat z2 = c2 * 5;
GLfloat z3 = c3 * 5;
GLfloat z4 = c4 * 5;
Kolor kk;
glBegin(GL_QUADS);
koloruj(c1, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y + new_h, z1 - 2.5f);
koloruj(c2, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x + new_w, y + new_h, z2 - 2.5f);
koloruj(c3, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x + new_w, y, z3 - 2.5f);
koloruj(c4, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y, z4 - 2.5f);
glEnd();
}
}
if (model == 1)     //trójkąty
{
if (h> ile || w > ile)
{
middle = (c1 + c2 + c3 + c4)*0.25 + displace(h + w, 60, 3);
w1 = (c1 + c2) / 2.0f;
w2 = (c2 + c3) / 2.0f;
w3 = (c3 + c4) / 2.0f;
w4 = (c4 + c1) / 2.0f;

if (middle > 1.0f)
middle = 1.0f;
if (middle < 0.0f)
middle = 0.0f;

sr_boku(x, y, z, new_w, new_h, w4, middle, w3, c4);// , n - 1);
sr_boku(x + new_w, y, z, new_w, new_h, middle, w2, c3, w3);// , n - 1);
sr_boku(x + new_w, y +new_h, z, new_w, new_h, w1, c2, w2, middle);// , n - 1);
sr_boku(x, y+new_h, z, new_w, new_h, c1, w1, middle, w4);// , n - 1);
}
else
{
GLfloat z1 = c1 * 5;
GLfloat z2 = c2 * 5;
GLfloat z3 = c3 * 5;
GLfloat z4 = c4 * 5;
Kolor kk;
glBegin(GL_TRIANGLE_FAN);
koloruj(c1, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y + new_h, z1 - 2.5f);
koloruj(c2, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x + new_w, y + new_h, z2 - 2.5f);
koloruj(c3, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x + new_w, y, z3 - 2.5f);
koloruj(c4, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y, z4 - 2.5f);
glEnd();
}
}
if (model == 2)     //proby
{
if (h > ile || w > ile)
{
middle = (c1 + c2 + c3 + c4)*0.25 + displace(h + w, 60, 3);
w1 = (c1 + c2) / 2.0f;
w2 = (c2 + c3) / 2.0f;
w3 = (c3 + c4) / 2.0f;
w4 = (c4 + c1) / 2.0f;

if (middle > 1.0f)
middle = 1.0f;
if (middle < 0.0f)
middle = 0.0f;

sr_boku(x, y, z, new_w, new_h, w4, middle, w3, c4);// , n - 1);
sr_boku(x + new_w, y, z, new_w, new_h, middle, w2, c3, w3);// , n - 1);
sr_boku(x + new_w, y + new_h, z, new_w, new_h, w1, c2, w2, middle);// , n - 1);
sr_boku(x, y + new_h, z, new_w, new_h, c1, w1, middle, w4);// , n - 1);
}
else
{
GLfloat z1 = normal(5, 5);
GLfloat z2 = normal(5, 5);
GLfloat z3 = normal(5, 5);
GLfloat z4 = normal(5, 5);
Kolor kk;
glBegin(GL_TRIANGLES);
koloruj(c1, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y + new_h, z1 - 2.5f);
koloruj(c2, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x + new_w, y + new_h, z2 - 2.5f);
koloruj(c4, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y, z4 - 2.5f);
glEnd();

glBegin(GL_TRIANGLES);
koloruj(c2, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x + new_w, y + new_h, z2 - 2.5f);
koloruj(c3, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y, z4 - 2.5f);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x + new_w, y, z3 - 2.5f);
koloruj(c4, kk);
glColor3f(kk.r, kk.g, kk.b);
glVertex3f(x, y, z4 - 2.5f);
glEnd();
}
}
}

//Fraktal
void fraktal(int w, int h)
{
float c1, c2, c3, c4;
int x, y;

x = w / 2;
y = h / 2;
GLfloat z = (GLfloat)(rand() % 101) / 10.0f;

c1 = (GLfloat)(rand() % 101) / 100.0f;
c2 = (GLfloat)(rand() % 101) / 100.0f;
c3 = (GLfloat)(rand() % 101) / 100.0f;
c4 = (GLfloat)(rand() % 101) / 100.0f;

sr_boku(-x, -y, z, w, h, c1, c2, c3, c4);
}

GLuint list = 0;
void RebuildList()
{
if( list > 0 ) glDeleteLists( list, 1 );

list = glGenLists( 1 );
glNewList( list, GL_COMPILE );
fraktal(60, 60);
//fraktal(-90, 90, 180);
glEndList();
}

//Funkcja reagująca na naciskane klawisze
void czytajKlawisz(unsigned char key, int x, int y)
{
switch (key)
{
case '=':
case '+':
{
ile = ile * 2;
RebuildList();
break;
}
case '-':
{
ile = ile / 2;
RebuildList();
break;
}
case '1':
case 's':
{
model = 0;
RebuildList();
break;
}
case '2':
case 't':
{
model = 1;
RebuildList();
break;
}
case '3':
case 'p':
{
model = 2;
RebuildList();
break;
}
case 27:
break;
}

glutPostRedisplay();
}

GLfloat theta[] = { 0.0, 0.0, 0.0 }; //trzy kąty obroty wokół osi x, y, z
void timer( int value )
{
theta[0] += 0.05;
if (theta[0] > 360.0)
theta[0] -= 360.0;

theta[1] += 0.05;
if (theta[1] > 360)
theta[1] -= 360.0;

theta[2] += 0.05;
if (theta[2] > 360.0)
theta[2] -= 360.0;

glutTimerFunc( 16, timer, 0 );
glutPostRedisplay(); //odświeżenie zawartości aktualnego okna
}

//Wyrysowanie osi układu współrzędnych
void Axes(void)
{
point3 xmin = { -5.0f, 0.0f, 0.0f };
point3 xmax = { 5.0f, 0.0f, 0.0f };

point3 ymin = { 0.0f, -5.0f, 0.0f };
point3 ymax = { 0.0f, 5.0f, 0.0f };

point3 zmin = { 0.0f, 0.0f, -5.0f };
point3 zmax = { 0.0f, 0.0f, 5.0f };

glPushMatrix();
glRotated(45.0, 1.0, -0.1, 0.1);
glBegin(GL_LINES);
glColor3f(10.0f, 0.0f, 0.0f);   //Ustawienie koloru rysowania na czerwony -oś X
glVertex3fv(xmin);
glVertex3fv(xmax);
glColor3f(0.0f, 10.0f, 0.0f);   //Ustawienie koloru rysowania na zielony -oś Y
glVertex3fv(ymin);
glVertex3fv(ymax);
glColor3f(0.0f, 0.0f, 01.0f);   //Ustawienie kolory rysowania na niebieski -oś Z
glVertex3fv(zmin);
glVertex3fv(zmax);
glEnd();
glPopMatrix();
}

void RenderScene(void)
{
glClearColor(0.5, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

float horizontal = glutGet( GLUT_WINDOW_WIDTH );
float vertical = glutGet( GLUT_WINDOW_HEIGHT );
GLfloat AspectRatio = (GLfloat)horizontal / (GLfloat)vertical;
glOrtho(-7.5*AspectRatio, 7.5*AspectRatio, -7.5, 7.5, 100.0, -10.00);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

//Obrócenie modelu wokół osi x, y, z
glRotatef(theta[0], 1, 0, 0);
glRotatef(theta[1], 0, 1, 0);
glRotatef(theta[2], 0, 0, 1);

Axes();
glCallList( list );

glutSwapBuffers();
}

void main( int argc, char** argv )
{
//wywołanie funkcji wypełniającej funkcje W(x) i Wc(x)
//funkcja_grey(250);
ile = 0.1;

glutInit( &argc, argv );
glutInitWindowSize( 800,600 );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
glutCreateWindow("Fraktal Plazmowy w 3d v0.8");

glutKeyboardFunc(czytajKlawisz);
glutDisplayFunc(RenderScene);
glutTimerFunc( 16, timer, 0 );

glEnable(GL_DEPTH_TEST);

srand(time(NULL));
RebuildList();
glutMainLoop();
}

я высоко рекомендовать выделять глобальные переменные, которые влияют fraktal(),

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]