2016-09-29 50 views
0

我是openGL的新手,我正在學習DDA算法。基本上它只是使用glVertex2i(x, y)繪製很多點甚至是一條線。使用DDA在openGL下動態繪製一條線

現在我想實現動態效果。因此,我添加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 

我的G ++版本是:gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2)

+0

您是否需要調用一些交換緩衝區功能來顯示幀? – immibis

+0

@immibis我在DDA函數前添加'glutSwapBuffers()'調用,但結果是一樣的。 –

回答

0

我假設你的意圖是畫線作爲動畫。要做到這一點,你應該使用計時器。使用GLUT,我們有兩種方法將計時器合併到顯示代碼中。

  1. glutIdleFunc
    這是直截了當:只給顯示功能作爲它的參數,你的情況,lineSegment
    這種方法的侷限性是我們無法控制的計時器的滴答聲的頻率。如果我們想設置自己的滴答頻率,我們需要使用第二種方法。
  2. glutTimerFunc
    它以輸入的形式觸發每個回調的頻率(以毫秒爲單位)以及回調函數指針。
    在這兩種方法中,您都需要修改顯示函數以增加每個刻度的值;在你的情況下,要繪製的點的索引。