我以前曾问过一个 疑问 关于将点击的坐标附加到一个单独的链接列表中,为了在链接列表中循环,将顶点放在点击的位置并将它们连接起来。
给出的答案解决了我的链接列表溢出的问题,但之后我在显示功能上出现了问题,比如当我循环浏览链接列表并将这些坐标添加到 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()
为了让程序能够像图中一样画出直线?
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();
}