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 に答える