1

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

#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) 到 (1,0.5) 每 10 毫秒点亮一个像素。我想要的是当一个像素点亮时它保持在那个状态,所以最终你会看到一条线。我怎样才能做到这一点?

4

4 回答 4

2

我不熟悉,glut但我猜display是每次重绘时调用的函数。此函数以 开头glClear(GL_COLOR_BUFFER_BIT)。此函数在每次重绘时清除您的颜色缓冲区。

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

获得所需效果的最佳选择可能是绘制一条在每次动画运行时都会增长的线。

于 2012-08-17T11:05:14.020 回答
1

为什么要艰难地做事?尽管旧的 OGL API 已被弃用,但您可以使用 GL_LINES 来执行此操作:

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

这将一次性完全绘制线条,这更容易且更有效(它还允许您从线条抗锯齿提示中受益)。

于 2012-08-17T11:05:31.123 回答
0

每次调用时都会调用 display 函数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();
于 2012-08-17T12:33:12.683 回答
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));

注意:线条的工作方式很奇怪,它们没有连接起来,您需要有一个起点到终点之类的东西,因此 i+1

我猜你想用极坐标画心形的东西?

于 2012-08-20T04:42:22.533 回答