用opengl1通过循环浏览链接的向量列表来绘制直线旅行。

问题描述 投票:1回答:1

我以前曾问过一个 疑问 关于将点击的坐标附加到一个单独的链接列表中,为了在链接列表中循环,将顶点放在点击的位置并将它们连接起来。a linestrip with 6 vertices

给出的答案解决了我的链接列表溢出的问题,但之后我在显示功能上出现了问题,比如当我循环浏览链接列表并将这些坐标添加到 glVertex2i();当我在图形窗口上多次点击时,它不会画出一条直线。

我试着看一下,如果我去掉了那个 "我 "字,会发生什么情况?while 循环,但这将导致分段故障。

这些是结构。

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() 为了让程序能够像图中一样画出直线?

c opengl linked-list glut opengl-compat
1个回答
2
投票

prev 是列表的头部。实际上,当你进行以下操作时,你会将列表的头部改为列表的尾部 elem = elem->next;. 保留列表的头部,并使用一个本地变量 elem 来迭代这个列表。此外,正交投影矩阵 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();
}
© www.soinside.com 2019 - 2024. All rights reserved.