2016-09-29 20 views
0

私はOpenGLを初めて使用しており、DDAアルゴリズムを学習しています。基本的には、多くの点を塗りつぶすために、またラインにさえも塗りつぶすには、glVertex2i(x, y)を使用するだけです。OpenGLでDDAを使用して線を動的に描画

今、私は動的効果を達成したいと思います。だから毎回ポイントをペイントした後にsleep(0.5)ステートメントを追加すると0.5秒遅れるが、結果は良くない。結果はしばらく空白になり、突然全体の行から出てきます。

void delay(unsigned int mseconds) 
{ 
    clock_t goal = mseconds + clock(); 
    while (goal > clock()); 
} 

結果は同じであるが、キャンバスが最初でしばらく空白になります。

は、私はまた、以下の方法を試してみてください。

他の方法はありますか?ここで


は私のコードです:

#include <GL/glut.h> 
#include <iostream> 
#include <math.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include<time.h> 

using namespace std; 

void delay(unsigned int mseconds) 
{ 
    clock_t goal = mseconds + clock(); 
    while (goal > clock()); 
} 

float xs = 0.0; 
float ys = 0.0; 
float xe = 0.0; 
float ye = 0.0; 

void LineDDA(int x0, int y0, int x1, int y1) 
{ 
    float x = 0.0; 
    float y = 0.0; 
    float m = 0.0; 
    float dx = x1 - x0; 
    float dy = y1 - y0; 
    if (dx != 0) 
    { 
     m = dy/dx; 
     if (m <= 1 && m >= -1) 
     { 
      y = y0; 
      for (x = x0; x <= x1; x++) 
      { 
       glVertex2i(x, int(y+0.5)); 
       delay(2000); 
       y += m; 
      } 
     } 
     if (m>1 || m<-1) 
     { 
      m = 1/m; 
      x = x0; 
      for (y=y0; y<=y1; y++) 
      { 
       glVertex2i(int(x+0.5), y); 
       delay(2000); 
       x += m; 
      } 
     } 
    } 
    else 
    { 
     int x = x0; 
     int y = 0; 
     y = (y0 <= y1) ? y0 : y1; 
     int d = fabs((double) (y0 - y1)); 
     while (d >= 0) 
     { 
      glVertex2i(x, y); 
      delay(2000); 
      y++; 
      d--; 
     } 
    } 
} 

void lineSegment() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(0.0, 0.0, 0.0); 
    glBegin(GL_POINTS); 

    // Make sure changes appear onscreen 
    glutSwapBuffers(); 

    LineDDA(xs, ys, xe, ye); 
    glEnd(); 
    glFlush(); 
} 

int main(int argc, char *argv[]) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE); 
    cout << "input the start and end(range is 0-500, 0-500):"; 
    cin >> xs >> ys >> xe >> ye; 
    glutInitWindowPosition(50, 100); 
    glutInitWindowSize(500, 500); 
    glutCreateWindow("DDA Algothrim"); 
    glClearColor(1.0, 1.0, 1.0, 1.0); 
    glMatrixMode(GL_PROJECTION); 
    gluOrtho2D(0.0, 500, 0.0, 500.0); 


    glutDisplayFunc(lineSegment); 

    glutMainLoop(); 

    return 0; 
} 

そして、ここでは、私はそれを実行する方法である:

[email protected]:~/Workspace/Languages/openGL$ g++ dda.cpp -lglut -lGLU -lGL -lm 
[email protected]:~/Workspace/Languages/openGL$ ./a.out 
input the start and end(range is 0-500, 0-500):0 0 200 300 

マイグラム++バージョンは次のとおりです。gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2)

+0

フレームを表示するには、いくつかのswap-buffers関数を呼び出す必要がありますか? – immibis

+0

@immibis DDA関数の前に 'glutSwapBuffers()'呼び出しを追加しますが、結果は同じです。 –

答えて

0

私はあなたの意図はしていると仮定しますアニメーションとして線を描画します。これを行うには、タイマーを使用する必要があります。 GLUTを使って、表示コードにタイマーを組み込む2つの方法があります。

  1. glutIdleFunc
    この簡単です:ちょうど、あなたの場合には、その引数として表示機能を与えるこのアプローチのlineSegment
    制限は、我々は、タイマーのカチカチ周波数を制御することができないということです。私たちが独自のティッキング頻度を設定したい場合は、2番目の方法を使用する必要があります。
  2. glutTimerFunc
    コールバック関数ポインタと共に各コールバック(ミリ秒単位)をトリガする頻度を入力として取ります。
    どちらのアプローチでも、表示機能を変更して各ティックの値を増やす必要があります。あなたの場合、描画される点のインデックス。
関連する問題