@Sneiksus

Как пофиксить рисование квадрата?

Есть код в котором реализована задача на падение квадрата. Не могу сделать так чтобы квадрат был прижат к левой стенке, и еще нужно установить высоту области viewport в соответствии с максимальной достигнутой высотой ymax, ширину в соответствии с длиной стороны бросаемого объекта плюс небольшой отступ.
Если можно с пояснениями, спасибо

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <GL/glut.h>
const float Lmax = 10.0;
float Ymax = 0;
float y0 = 7.0f;
float v0 = 0.2;
float dt = 0.01;
float g = 9.80665;
float t = 0;  
float vY = 0, Y = 0;
float size = 1;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glColor3f(1.0f, 0.0f, 0.0f);
  
    glScalef(0.4, 0.4, 0.4);
    if (Y >= 0) {
        glTranslatef(0, Y, 0.0);
    }  
    glBegin(GL_QUADS);
    glVertex2f(0.0f, 0.0f);
    glVertex2f(0.0f, size);
    glVertex2f(size, size);
    glVertex2f(size, 0.0f);
    glEnd();
    glutSwapBuffers();

}


void timer(int value)
{
    glutPostRedisplay(); 
    glutTimerFunc(10, timer, 0); 
    FILE* fp;
    fp = fopen("data.txt", "a");
    vY = v0 + g * t;
    Y = y0+v0*t - 1 / 2.0 * g * t * t;
    fprintf(fp, "%.2f, %.2f, %.2f\n", t, vY, Y);
    fclose(fp);
    t += dt;
    
}
void obsluhaResize(int width, int height) {
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (width == 0) width++;
    const float aspect_ratio = (float)width / height;
    gluOrtho2D(-0.5 * Lmax * aspect_ratio, 0.5 * Lmax * aspect_ratio, -0.5 * Lmax, 0.5 * Lmax);
}
int main(int argc, char** argv)
{
     y0 = atof(argv[1]);
     v0 = atof(argv[2]);
     size = atof(argv[3]);
     Ymax = y0 + v0 * v0 / (2 * g);
     FILE* fp;
     fp = fopen("data.txt", "a");
     fprintf(fp, "y0 = %.2fm; v0 = %.2fm/s; a = %.2fm; ymax = %.2fm;\nt(s), ysur(m), vy(m/s)", y0, v0, size, Ymax);
     fclose(fp);
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(640, 640);
    glutCreateWindow("DU2");
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glutDisplayFunc(display);
    glutTimerFunc(0, timer, 0);
    glutReshapeFunc(obsluhaResize);
    glutMainLoop();
    return 0;
}
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
@KODYAcoder
Для того, чтобы квадрат был прижат к левой стенке, нужно изменить проекцию в функции obsluhaResize. Вместо текущей строки:

gluOrtho2D(-0.5 * Lmax * aspect_ratio, 0.5 * Lmax * aspect_ratio, -0.5 * Lmax, 0.5 * Lmax);

нужно написать:

gluOrtho2D(0, Lmax * aspect_ratio, 0, Lmax);

Также для того, чтобы установить высоту области viewport в соответствии с максимальной достигнутой высотой ymax и ширину в соответствии с длиной стороны бросаемого объекта плюс небольшой отступ, нужно в функции obsluhaResize после текущих строк написать следующее:

float viewport_width = size + 1.0f;
float viewport_height = Ymax + 1.0f;
glViewport(0, 0, viewport_width, viewport_height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
const float aspect_ratio = viewport_width / viewport_height;
gluOrtho2D(0, Lmax * aspect_ratio, 0, Lmax);

Обратите внимание, что размеры viewport задаются в пикселях, а не в метрах или других единицах измерения, поэтому может потребоваться дополнительное масштабирование при задании размеров объектов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы