Рисование зигзагообразной линии с помощью glutPostRedisplay () - PullRequest
2 голосов
/ 05 июня 2019

Итак, я пытаюсь нарисовать зигзагообразную линию внутри окна, которая получает координаты x и y от щелчков мыши.Поэтому после каждого щелчка по окну последние две вершины будут соединены вместе и т. Д.

#include <iostream>
#include <GL/glut.h>

void init(){
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glViewport(0, 0, 800, 400);
    gluOrtho2D(0.0, 800.0, 0.0, 400.0);
}

int x1, y1, x2, y2, count = -1;

void mouse(int key, int state, int x, int y){

    if(key == GLUT_LEFT_BUTTON){
      if(state == GLUT_DOWN){
        count++;
        if(count%2 == 0){
            x1 = x;
            y1 = 400.0-y;
        }
        else{
            x2 = x;
            y2 = 400.0-y;
            glutPostRedisplay();
        }
      }
    }
}

void Display(){

    glClear(GL_COLOR_BUFFER_BIT);
    glColor3i(1, 1, 1);

    if(count != 0){

        glBegin(GL_LINE_STRIP);

            glVertex2i(x1, y1);
            glVertex2i(x2, y2);

        glEnd();
    }
    glFlush();
}

int main(int argc, char* argv[]) {

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowSize(800, 400);
    glutCreateWindow("Vije e thyer");
    init();
    glutMouseFunc(mouse);
    glutDisplayFunc(Display);
    glutMainLoop();
    return 0;
}

Я ожидаю, что он покажет каждую линию, нарисованную в окне, но последняя линия исчезнет, ​​как тольконовый создан.Я думаю, что это проблема с glutPostRedisplay.

1 Ответ

3 голосов
/ 05 июня 2019

Все ваши старые линии исчезают, потому что вы звоните glClear, который очищает ваш экран.Вызывать glClear для каждого кадра - хорошая идея, но теперь после вызова glClear вы рисуете только один отрезок линии между двумя последними точками, на которые нажали.

Чтобы сделать это, просто пропустите вызовдо glClear, но на самом деле это не тот способ, которым OpenGL предназначен для использования, и он совсем не гибкий (что, если вы хотите, чтобы линии немного извивались или меняли цвет?).Кроме того, он подвержен ошибкам, особенно с двойной буферизацией.Предположим, вы дважды щелкнули по последовательным кадрам.Один из ваших отрезков линии отображается только в одном кадре, поэтому он обращается только к одному из двух буферов.Это заставит ваш сегмент мерцать на вашем экране.Или, если вы измените размер окна, вы определенно потеряете некоторую информацию в ваших экранных буферах (если не все содержимое буфера).

Что вам нужно сделать, это отслеживать все точки, которые вы хотитенарисовать в виде списка или чего-то еще, затем перерисовать всю зигзагообразную линию в каждом кадре.

...