Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenGL неправильно работает glutReshapeFunc 
V
    Опции темы
Antihacker96
Дата 27.6.2015, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2015

Репутация: нет
Всего: нет



Добрый день. Помогите разобраться с проблемой. Функция 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;
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.2819 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.