OpenGl и ввод значений

348
04 мая 2017, 15:27

Здравствуйте, помогите пожалуйста.

Пользователь должен ввести значения и по ним должен построиться полигон. Нужно ввести 9 точек для его построения.

#include <iostream>
#include "ptlist.h"
#include <GL/glew.h>
#include <GL/glut.h>

void showStructure();
int main(int argc,char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE |  GLUT_DEPTH);
    glutInitWindowSize(400, 400);
    glutCreateWindow("PointList");
    glutDisplayFunc(showStructure);
    glutMainLoop();
    system("pause");
    return 0;
}
void showStructure()
{

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glBegin(GL_POLYGON);
    GLfloat first(0.2);
    GLfloat second(0.1);
    GLfloat third(-0.5);
        std::cout << "Point 1: ";
        std::cin >> first;
        std::cout << "Point 2: ";
        std::cin >> second;
        std::cout << "Point 3: ";
        std::cin >> third;

        glVertex3f(GLfloat(first), GLfloat(second), GLfloat(third));
        glVertex3f(0.5f, 1.0f, -0.5f); 
        glVertex3f(0.5f, 0.0f, 0.0f); 
    glEnd();
    glutSwapBuffers();
}

Проблема в том , что если я делаю так:

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glBegin(GL_POLYGON);
GLfloat first(0.2);
GLfloat second(0.1);
GLfloat third(-0.5);
for (int i = 0; i < 3; i++)
{ 
        std::cout << "Point 1: ";
        std::cin >> first;
        std::cout << "Point 2: ";
        std::cin >> second;
        std::cout << "Point 3: ";
        std::cin >> third;
    glVertex3f(GLfloat(first), GLfloat(second), GLfloat(third));
}
    glEnd();
    glutSwapBuffers();

То цикл уходит в бесконечность и полигон не рисуется.

В случае таком, полигон рисуется после ввода трех точек, но в ожидании ввода дальше(т.е. цикл тоже в бесконечность):

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glBegin(GL_POLYGON);
    GLfloat first(0.2);
    GLfloat second(0.1);
    GLfloat third(-0.5);

        std::cout << "Point 1: ";
        std::cin >> first;
        std::cout << "Point 2: ";
        std::cin >> second;
        std::cout << "Point 3: ";
        std::cin >> third;

        glVertex3f(GLfloat(first), GLfloat(second), GLfloat(third));
        glVertex3f(0.5f, 1.0f, -0.5f); // Bottom Left
        glVertex3f(0.5f, 0.0f, 0.0f); // Bottom Left*/
    glEnd();
    glutSwapBuffers();

Подскажите , пожалуйста, как правильно реализовать ввод данных?

Answer 1

Ваш цикл вызывается бесконечно, т.к. функция showStructure вызывается для каждой отрисовки. А при 30 fps это раз в 1000/30 = 33 мсек. Судя по всему вам необходимо прочитать параметры полигона один раз и рисовать его не предлагая пользователю вводить информацию. Ввод можно организовать вот так:

const int pointsNumber = 9;
float points[pointsNumber];
int main(int argc,char** argv)
{
    for (int i = 0; i < pointsNumber; i++)
    { 
        std::cout << "Point " << pointsNumber << ": ";
        std::cin >> points[i];
    }

...

А рисовать используя данные из points.

READ ALSO
Класс для pаботы с комплексными числами. [требует правки]

Класс для pаботы с комплексными числами. [требует правки]

Подскажите, как создать наследников класса: 1класс, хранящий число так же в виде строки и имеющий методы перевода строки в число и назад; 2

224
JavaScript: привязка контекста [дубликат]

JavaScript: привязка контекста [дубликат]

На данный вопрос уже ответили:

245
AJAX: пустой $_FILES

AJAX: пустой $_FILES

Здравствуйте! Отправляю файл на сервер (локальный: vertrigo(apache)) с помощью AJAX и drag & drop HTML5Файл записывается в папку, на страницу с AJAX возвращается...

329
Как подключиться к firebase?

Как подключиться к firebase?

При разработке приложения на Реакте появилась такая проблемаЕсть Удаленная база данных Firebase, из которой мне нужно выгружать данные

440