@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 задаются в пикселях, а не в метрах или других единицах измерения, поэтому может потребоваться дополнительное масштабирование при задании размеров объектов.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы