opengGL绘制一条线

opengGL drawing a line

本文关键字:一条 绘制 opengGL      更新时间:2023-10-16

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

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

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

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

要获得所需效果,最好的办法可能是在每次动画运行时绘制一条增长的线。

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

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

这将一次画出完整的线条,这更容易,也更高效(它还允许您从线条抗锯齿提示中受益)。

每次调用glutPostRedisplay()时都会调用显示函数。每次调用display函数时,都会清除屏幕。

您需要编写一个函数,该函数将遍历您想要显示的所有点。每次迭代都会调用类似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();

如果您使用GL_LINES。一种方法是使用要绘制的点数组,例如:p[0]、p[1]、p[2]、p[3]、p[4]、p[5]。。。然后使用一些for loop 绘制

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

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