通过循环访问向量的链接列表,使用 opengl1 绘制线条
Drawing a linestrip with opengl1 by looping through a linked list of vectors
我之前问过一个 about appending coordinates of clicks to a singly linked list, in order to loop through the linked list ,put vertices at the positions of the clicks and connect them
给出的答案解决了我的链表溢出问题,但后来我在显示功能方面遇到了问题,以至于当我循环遍历链表并将这些坐标添加到 glVertex2i();
时,它没有'在图形 window.
上多次单击时未绘制线条
我试图看看当我删除 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()
需要做哪些改动才能让程序像图中那样画出线条?
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();
}
我之前问过一个
给出的答案解决了我的链表溢出问题,但后来我在显示功能方面遇到了问题,以至于当我循环遍历链表并将这些坐标添加到 glVertex2i();
时,它没有'在图形 window.
我试图看看当我删除 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()
需要做哪些改动才能让程序像图中那样画出线条?
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();
}