2012-08-17 35 views
1

到目前为止,这是我的代码:opengGL画线

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

void keyboard(unsigned char key, int x, int y); 
void display(void); 
void timer(int); 
static float x=0.0f,y=0.0f; 

int main(int argc, char** argv) 
{ 
glutInit(&argc, argv); 
glutInitWindowPosition(200,200); 
glutInitWindowSize(640,480); 
glutCreateWindow("draw a line"); 
glutKeyboardFunc(&keyboard); 
glutDisplayFunc(&display); 

glutTimerFunc(10,timer,0); 

glutMainLoop(); 

return EXIT_SUCCESS; 
} 


void keyboard(unsigned char key, int x, int y) 
{ 
switch (key) 
{ 
case '\x1B': 
    exit(EXIT_SUCCESS); 
    break; 
} 
} 

void timer(int value){ 
x+=0.001; 
y+=0.0005; 
glutPostRedisplay(); 
glutTimerFunc(10,timer,0); 
} 

void display() 
{ 

glClear(GL_COLOR_BUFFER_BIT); 
glLoadIdentity(); 
glColor3f(0.0f, 1.0f, 0.0f); 

glBegin(GL_POINTS); 
glVertex2f(x,y); 
glEnd(); 


glFlush(); 
} 

这里做的事情是,它照亮一个像素从点(0,0)每10毫秒至(1,0.5)。我想要的是当一个像素点亮时,它保持在该状态,所以最终你会看到一条线。我怎样才能做到这一点?

回答

2

我不熟悉glut但我猜display是在每次重绘时调用的函数。该功能从glClear(GL_COLOR_BUFFER_BIT)开始。这个函数清除每次重绘时的颜色缓冲区。

您可能会发现删除glClear并不能完全解决您的问题。这很可能是因为您的图形上下文可能会被双缓冲,并且使其效率更高,所以在每次动画运行时前缓冲区都不会被复制到后台缓冲区。

你最好打赌得到想要的效果可能是画出一条线,每一个动画运行增长。

+0

我删除了glClear,现在像素仍然变亮。谢谢 – Badshah 2012-08-17 11:12:36

+0

如果你使用双缓冲,你需要在显示函数的末尾调用'glutSwapBuffers()'而不是'glFlush()'。 – Derek 2012-08-17 12:34:38

1

为什么事情难办?虽然上了年纪OGL API已被弃用,你可以使用GL_LINES做到这一点:

glBegin(GL_LINES); 
glVertex2f(x_start,y_start); 
glVertex2f(x_end,y_end); 
glEnd(); 

这将完全划清界线一气呵成,这是更容易,有些更有效(它也可以让你从受益在线反锯齿提示)。

+1

它不仅适用于直线,我也想做抛物线或双曲线 – Badshah 2012-08-17 11:10:29

+1

@Badshah:在这种情况下,您需要一个线列表,并且每个计算图点都有一个点,并且您也确实需要AA,所以这些曲线看起来并不超级锯齿。 – Necrolis 2012-08-17 11:17:01

0

每次拨打glutPostRedisplay()时都会调用显示功能。每次调用显示功能时,清除屏幕。

您需要编写一个函数来遍历所有要显示的点。每次迭代都会调用类似于drawPoint()函数的函数。

也许是这样的:

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(0.0f, 1.0f, 0.0f); 
    for (int i = 0; i < num_points; i++) 
    { 
     drawPoint(points(i)); 
    } 
    glFlush(); 
} 

或者,你可以跳过写一个新的功能,做到这一点:

glBegin(GL_POINTS); 
for (int i = 0; i < num_points; i++) 
{ 
    glVertex2f(points(i).getX(), points(i).getY()); 
} 
glEnd(); 
0

如果您使用,GL_LINES。要做到这一点,有一个要绘制EG的点阵列:p [0],p [1],p [2],p [3],p [4],p [5] ...线古怪的工作,他们不联系起来你:然后使用一些for循环

glBegin(GL_LINES); 
for(...) { 
    glVertex2f(p[i ]->x,p[i ]->y); 
    glVertex2f(p[i+1]->x,p[i+1]->y); 
} 
glEnd(); 

因此,使用这种方法,你可以替换p []与功能,允许你做出漂亮的形状

glVertex2f(functionx(i ),functiony(i )); 
glVertex2f(functionx(i+1),functiony(i+1)); 

记绘制需要有一个起点到终点类的东西,因此我想你试图绘制像心形使用极坐标的东西?