Добрый день. Помогите разобраться с проблемой. Функция Reshape работает неправильно. При увеличении размера окна активная область остается того же размера, что и была, а всё остальное - чёрный фон. Код | #include <iostream> #include <glut.h> #include <time.h> #include <cstdlib> #include <cmath> #define DT 0.1 #define N 5 #define PI 3.14 using namespace std; class Window{ public: int delay; // скорость анимации int WinWid; // ширина поля int WinHei; // высота поля int WinPosX; // стартовая позиция окна программы по оси X int WinPosY; // стартовая позиция окна программы по оси Y int n; // кол-во частиц int l; // кол-во молекул Window(){ delay = 50; WinWid = 640; WinHei = 480; WinPosX = 1366 - WinWid - 10; WinPosY = 100; n = InputParticle(); l = InputMolecule(); } int InputParticle(); int InputMolecule(); } settings; class Particle{ public: float x; float y; float vx; float vy; float vxm; float vym; int m; Particle(){ x = rand() % settings.WinWid; y = rand() % settings.WinHei; vx = (rand() % 151 + 600) * DT; vy = (rand() % 151 + 600) * DT; m = rand() % 11 + 15; } void DrawParticle(int i); void MoveParticle(int i); void CrashParticle(int i, int j); void CrashParticleMolecule(int i, int j); } Particles[N]; class Molecule{ public: float x; float y; float vx; float vy; float vxm; float vym; int m = 2 * N; Molecule(){ x = rand() % settings.WinWid; y = rand() % settings.WinHei; vx = (rand() % 50 + 500) * DT; vy = (rand() % 50 + 500) * DT; } void DrawMolecule(int i); void MoveMolecule(int i); void CrashMolecule(int i, int j); } Molecules[N * 10]; int Window::InputParticle() { int n; cout << "Input the number of particles from 1 to 5: "; cin >> n; return n; } int Window::InputMolecule() { int l; cout << "Input the number of molecules from 10 to 25: "; cin >> l; return l; } void Particle::DrawParticle(int i) { glColor3f(1.0, 0.0, 0.0); glBegin(GL_POLYGON); for (float a = 0; a < 36; ++a) { float x1 = Particles[i].m * cos(a * PI / 18); float y1 = Particles[i].m * sin(a * PI / 18); glVertex2f(Particles[i].x + x1, Particles[i].y + y1); x1 = Particles[i].m * cos((a + 1) * PI / 18); y1 = Particles[i].m * sin((a + 1) * PI / 18); glVertex2f(Particles[i].x + x1, Particles[i].y + y1); } glEnd(); } void Particle::MoveParticle(int i) { if (Particles[i].x < Particles[i].m) Particles[i].vx = -Particles[i].vx; if (Particles[i].y < Particles[i].m) Particles[i].vy = -Particles[i].vy; if (Particles[i].x > settings.WinWid - Particles[i].m) Particles[i].vx = -Particles[i].vx; if (Particles[i].y > settings.WinHei - Particles[i].m) Particles[i].vy = -Particles[i].vy; Particles[i].x += Particles[i].vx * DT; Particles[i].y += Particles[i].vy * DT; } void Particle::CrashParticle(int i, int j) { float d = sqrt((Particles[i].x - Particles[j].x) * (Particles[i].x - Particles[j].x) + (Particles[i].y - Particles[j].y) * (Particles[i].y - Particles[j].y)); if (d < Particles[i].m + Particles[j].m) { Particles[i].vxm = ((Particles[i].m - Particles[j].m) * abs(Particles[i].vx) + 2 * Particles[j].m * abs(Particles[j].vx)) / (Particles[i].m + Particles[j].m); Particles[i].vym = ((Particles[i].m - Particles[j].m) * abs(Particles[i].vy) + 2 * Particles[j].m * abs(Particles[j].vy)) / (Particles[i].m + Particles[j].m); Particles[j].vxm = ((Particles[j].m - Particles[i].m) * abs(Particles[j].vx) + 2 * Particles[i].m * abs(Particles[i].vx)) / (Particles[j].m + Particles[i].m); Particles[j].vym = ((Particles[j].m - Particles[i].m) * abs(Particles[j].vy) + 2 * Particles[i].m * abs(Particles[i].vy)) / (Particles[j].m + Particles[i].m); Particles[i].vx = Particles[i].vxm; Particles[i].vy = Particles[i].vym; Particles[j].vx = Particles[j].vxm; Particles[j].vy = Particles[j].vym; if (Particles[i].x < Particles[j].x) { if (Particles[i].vx > 0) Particles[i].vx *= -1; if (Particles[j].vx < 0) Particles[j].vx *= -1; if (Particles[i].y < Particles[j].y) { if (Particles[i].vy > 0) Particles[i].vy *= -1; if (Particles[j].vy < 0) Particles[j].vy *= -1; } else { if (Particles[i].vy < 0) Particles[i].vy *= -1; if (Particles[j].vy > 0) Particles[j].vy *= -1; } } else { if (Particles[i].vx < 0) Particles[i].vx *= -1; if (Particles[j].vx > 0) Particles[j].vx *= -1; if (Particles[i].y < Particles[j].y) { if (Particles[i].vy > 0) Particles[i].vy *= -1; if (Particles[j].vy < 0) Particles[j].vy *= -1; } else { if (Particles[i].vy < 0) Particles[i].vy *= -1; if (Particles[j].vy > 0) Particles[j].vy *= -1; } } Particles[i].MoveParticle(i); Particles[j].MoveParticle(j); } } void Particle::CrashParticleMolecule(int i, int j) { float d = sqrt((Particles[i].x - Molecules[j].x) * (Particles[i].x - Molecules[j].x) + (Particles[i].y - Molecules[j].y) * (Particles[i].y - Molecules[j].y)); if (d < Particles[i].m + Molecules[j].m) { Particles[i].vxm = ((Particles[i].m - Molecules[j].m) * abs(Particles[i].vx) + 2 * Molecules[j].m * abs(Molecules[j].vx)) / (Particles[i].m + Molecules[j].m); Particles[i].vym = ((Particles[i].m - Molecules[j].m) * abs(Particles[i].vy) + 2 * Molecules[j].m * abs(Molecules[j].vy)) / (Particles[i].m + Molecules[j].m); Molecules[j].vxm = ((Molecules[j].m - Particles[i].m) * abs(Molecules[j].vx) + 2 * Particles[i].m * abs(Particles[i].vx)) / (Molecules[j].m + Particles[i].m); Molecules[j].vym = ((Molecules[j].m - Particles[i].m) * abs(Molecules[j].vy) + 2 * Particles[i].m * abs(Particles[i].vy)) / (Molecules[j].m + Particles[i].m); Particles[i].vx = Particles[i].vxm; Particles[i].vy = Particles[i].vym; Molecules[j].vx = Molecules[j].vxm; Molecules[j].vy = Molecules[j].vym; if (Particles[i].x < Molecules[j].x) { if (Particles[i].vx > 0) Particles[i].vx *= -1; if (Molecules[j].vx < 0) Molecules[j].vx *= -1; if (Particles[i].y < Molecules[j].y) { if (Particles[i].vy > 0) Particles[i].vy *= -1; if (Molecules[j].vy < 0) Molecules[j].vy *= -1; } else { if (Particles[i].vy < 0) Particles[i].vy *= -1; if (Molecules[j].vy > 0) Molecules[j].vy *= -1; } } else { if (Particles[i].vx < 0) Particles[i].vx *= -1; if (Molecules[j].vx > 0) Molecules[j].vx *= -1; if (Particles[i].y < Molecules[j].y) { if (Particles[i].vy > 0) Particles[i].vy *= -1; if (Molecules[j].vy < 0) Molecules[j].vy *= -1; } else { if (Particles[i].vy < 0) Particles[i].vy *= -1; if (Molecules[j].vy > 0) Molecules[j].vy *= -1; } } Particles[i].MoveParticle(i); Molecules[j].MoveMolecule(j); } } void Molecule::DrawMolecule(int i) { glColor3f(0.0, 0.0, 1.0); glBegin(GL_POLYGON); for (float a = 0; a < 36; ++a) { float x1 = Molecules[i].m * cos(a * PI / 18); float y1 = Molecules[i].m * sin(a * PI / 18); glVertex2f(Molecules[i].x + x1, Molecules[i].y + y1); x1 = Molecules[i].m * cos((a + 1) * PI / 18); y1 = Molecules[i].m * sin((a + 1) * PI / 18); glVertex2f(Molecules[i].x + x1, Molecules[i].y + y1); } glEnd(); } void Molecule::MoveMolecule(int i) { if (Molecules[i].x < Molecules[i].m) Molecules[i].vx = -Molecules[i].vx; if (Molecules[i].y < Molecules[i].m) Molecules[i].vy = -Molecules[i].vy; if (Molecules[i].x > settings.WinWid - Molecules[i].m) Molecules[i].vx = -Molecules[i].vx; if (Molecules[i].y > settings.WinHei - Molecules[i].m) Molecules[i].vy = -Molecules[i].vy; Molecules[i].x += Molecules[i].vx * 2 * DT; Molecules[i].y += Molecules[i].vy * 2 * DT; } void Molecule::CrashMolecule(int i, int j) { float d = sqrt((Molecules[i].x - Molecules[j].x) * (Molecules[i].x - Molecules[j].x) + (Molecules[i].y - Molecules[j].y) * (Molecules[i].y - Molecules[j].y)); if (d < Molecules[i].m + Molecules[j].m) { swap(Molecules[i].vx, Molecules[j].vx); swap(Molecules[i].vy, Molecules[j].vy); if (Molecules[i].x < Molecules[j].x) { if (Molecules[i].vx > 0) Molecules[i].vx *= -1; if (Molecules[j].vx < 0) Molecules[j].vx *= -1; if (Molecules[i].y < Molecules[j].y) { if (Molecules[i].vy > 0) Molecules[i].vy *= -1; if (Molecules[j].vy < 0) Molecules[j].vy *= -1; } else { if (Molecules[i].vy < 0) Molecules[i].vy *= -1; if (Molecules[j].vy > 0) Molecules[j].vy *= -1; } } else { if (Molecules[i].vx < 0) Molecules[i].vx *= -1; if (Molecules[j].vx > 0) Molecules[j].vx *= -1; if (Molecules[i].y < Molecules[j].y) { if (Molecules[i].vy > 0) Molecules[i].vy *= -1; if (Molecules[j].vy < 0) Molecules[j].vy *= -1; } else { if (Molecules[i].vy < 0) Molecules[i].vy *= -1; if (Molecules[j].vy > 0) Molecules[j].vy *= -1; } } Molecules[i].MoveMolecule(i); Molecules[j].MoveMolecule(j); } } void Reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, w, 0, h); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } Particle Particling; Molecule Moleculing; void Timer(int value) { for (int i = 0; i < settings.n; i++) { Particling.MoveParticle(i); } for (int i = 0; i < settings.l; i++) { Moleculing.MoveMolecule(i); } for (int i = 0; i < settings.n; i++) { for (int j = 0; j < settings.n; j++) { if (i != j) { Particling.CrashParticle(i, j); } } } for (int i = 0; i < settings.n; i++) { for (int j = 0; j < settings.l; j++) { Particling.CrashParticleMolecule(i, j); } } for (int i = 0; i < settings.l; i++) { for (int j = 0; j < settings.l; j++) { if (i != j) { Moleculing.CrashMolecule(i, j); } } } glutPostRedisplay(); glutTimerFunc(settings.delay, Timer, 0); } void Draw() { glClear(GL_COLOR_BUFFER_BIT); for (int i = 0; i < settings.n; i++) { Particling.DrawParticle(i); } for (int i = 0; i < settings.l; i++) { Moleculing.DrawMolecule(i); } glFlush(); glutSwapBuffers(); } int main(int argc, char **argv) { setlocale(LC_ALL, "Russian"); glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(settings.WinWid, settings.WinHei); glutInitWindowPosition(settings.WinPosX, settings.WinPosY); glutCreateWindow("Brownian motion"); glClearColor(0, 0, 0, 1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, settings.WinWid, settings.WinHei, 0, -1, 1); glutDisplayFunc(Draw); glutTimerFunc(settings.delay, Timer, 0); glutReshapeFunc(Reshape); glutMainLoop(); return 0; }
|
|