Рисование по циклу через связанный список - PullRequest
1 голос
/ 01 мая 2020

Ранее я задавал вопрос о добавлении координат кликов в односвязный список, чтобы l oop через связанный список, расположить вершины в местах щелчков и соединить их a linestrip with 6 vertices

Полученный ответ решил мои проблемы с переполнением связанного списка, но впоследствии у меня возникли проблемы с функцией отображения, например, когда il oop просматривал связанный список и добавлял те координаты glVertex2i();, он не рисует полосу, когда я нажимаю несколько раз в графическом окне.

Я пытался увидеть, что произойдет, если я удалю while l oop, но это вызовет ошибку сегментации.

Это структуры.

typedef struct vector{int x;int y;}Vector;
typedef struct VectorList{Vector X; struct VectorList*next; }node_v;

И я объявил эти

Vector P;
node_v * prev;

И с помощью ответа на мой предыдущий вопрос , инициализированный Vector P с координатами кликов и добавленный в связанный список векторов node_v * prev;

static void _display_CB()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glOrtho(0,window_width,window_height,0,-1,1);

    glClear(GL_COLOR_BUFFER_BIT);

    glColor3ub(0,0,0);
    glBegin(GL_LINE_STRIP);
    while(prev){
        glVertex2i( prev->X.x, prev->X.y);
        prev=prev->next;
    }

    glEnd();
    glFlush();
  glutSwapBuffers();
glutPostRedisplay();
}

Какие изменения нужно сделать в _display_CB() для программа для рисования полос, как на картинке?

1 Ответ

2 голосов
/ 01 мая 2020

prev является главой списка. Вы фактически меняете заголовок списка на конец списка, когда делаете elem = elem->next;. Держите заголовок списка и используйте локальную переменную elem для итерации по списку.
Кроме того, для матрицы проекции orthographi c glOrtho должна быть установлена ​​текущая матрица проекции (GL_PROJECTION):

void _display_CB() {

    node_v * elem = prev;

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, window_width, window_height, 0, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glClear(GL_COLOR_BUFFER_BIT);

    glColor3ub(0, 0, 0);
    glBegin(GL_LINE_STRIP);
    while(elem){
        glVertex2i(elem->X.x, elem->X.y);
        elem = elem->next;
    }
    glEnd();

    glutSwapBuffers();
    glutPostRedisplay();
}
...