2012-08-17 34 views
1

到目前爲止,這是我的代碼:opengGL畫線

#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)每10毫秒至(1,0.5)。我想要的是當一個像素點亮時,它保持在該狀態,所以最終你會看到一條線。我怎樣才能做到這一點?

回答

2

我不熟悉glut但我猜display是在每次重繪時調用的函數。該功能從glClear(GL_COLOR_BUFFER_BIT)開始。這個函數清除每次重繪時的顏色緩衝區。

您可能會發現刪除glClear並不能完全解決您的問題。這很可能是因爲您的圖形上下文可能會被雙緩衝,並且使其效率更高,所以在每次動畫運行時前緩衝區都不會被複制到後臺緩衝區。

你最好打賭得到想要的效果可能是畫出一條線,每一個動畫運行增長。

+0

我刪除了glClear,現在像素仍然變亮。謝謝 – Badshah 2012-08-17 11:12:36

+0

如果你使用雙緩衝,你需要在顯示函數的末尾調用'glutSwapBuffers()'而不是'glFlush()'。 – Derek 2012-08-17 12:34:38

1

爲什麼事情難辦?雖然上了年紀OGL API已被棄用,你可以使用GL_LINES做到這一點:

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

這將完全劃清界線一氣呵成,這是更容易,有些更有效(它也可以讓你從受益在線反鋸齒提示)。

+1

它不僅適用於直線,我也想做拋物線或雙曲線 – Badshah 2012-08-17 11:10:29

+1

@Badshah:在這種情況下,您需要一個線列表,並且每個計算圖點都有一個點,並且您也確實需要AA,所以這些曲線看起來並不超級鋸齒。 – Necrolis 2012-08-17 11:17:01

0

每次撥打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(); 
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)); 

記繪製需要有一個起點到終點類的東西,因此我想你試圖繪製像心形使用極座標的東西?