2012-03-13 53 views
0

我的練習如下: 在display()中添加一個drawLine方法。可能需要使用類似 的drawLine(GL gl,int x1,int y1,int x2,int y2) 現在使用線的方程式,繪製組成線的各個點從x1,y1到x2, y2在JOGL 中使用(例如)gl.glPointSize(1.0f); gl.glBegin(GL.GL_POINTS); 如果你已經有色點白色,並用以下預測OpenGL - 用點劃線

gl.glViewport(-250, -150, 250, 150); 
gl.glMatrixMode(GL.GL_PROJECTION); 
gl.glLoadIdentity(); 
glu.gluOrtho2D(-250.0, 250.0, -150.0, 150.0); 
帶線的從點(0,0)的值(100,100)

然後你會看 像下面的圖片:

enter image description here

迄今,我創造我行事件監聽我的代碼如下:

import javax.media.opengl.*; 
import javax.media.opengl.glu.GLU; 


public class ThirdGLEventListener implements GLEventListener { 

/** 
* Interface to the GLU library. 
*/ 
private GLU glu; 

/** 
* Take care of initialization here. 
*/ 
public void init(GLAutoDrawable gld) { 
    GL gl = gld.getGL(); 
    glu = new GLU(); 

    gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 


    gl.glViewport(-250, -150, 250, 150); 
    gl.glMatrixMode(GL.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    glu.gluOrtho2D(-250.0, 250.0, -150.0, 150.0); 
} 

/** 
* Take care of drawing here. 
*/ 
public void display(GLAutoDrawable drawable) { 



    GL gl = drawable.getGL(); 

    gl.glClear(GL.GL_COLOR_BUFFER_BIT); 

    /* 
    * put your code here 
    */ 

    drawLine(gl, 0, 0, 100, 100); 

} 

public void reshape(GLAutoDrawable drawable, int x, int y, int width, 
     int height) { 
} 

public void displayChanged(GLAutoDrawable drawable, 
     boolean modeChanged, boolean deviceChanged) { 
} 

private void drawLine(GL gl, int x1, int y1, int x2, int y2) { 
    gl.glPointSize(1.0f); 
    gl.glBegin(GL.GL_POINTS); 

    // This is where the whole problem lies. 

    gl.glEnd();//end drawing of points 

} 

}

我的問題是,我不知道如何完成線方程的方法內的代碼。如果你能幫助我,我將不勝感激。我認爲其餘部分是正確的,我只需要找到如何在drawLine()方法內實現線方程。

+0

這聽起來像是有史以來最糟糕的圖形編程作業。你應該做一些閱讀,它會很快顯現出來。 – 2012-03-14 04:34:44

回答

1

這是一種使用OpenGL繪製線條的可怕方法。

GL_LINES好得多。

這就是說:

private void drawLine(GL gl, int x1, int y1, int x2, int y2) { 
    gl.glPointSize(1.0f); 
    gl.glBegin(GL.GL_POINTS); 

    int samples = 100; 
    float dx = (x2 - x1)/(float)samples; 
    float dy = (y2 - y1)/(float)samples; 

    for(int i = 0; i < samples; i++) 
    { 
     gl.glVertex2f(i * dx, i * dy); 
    } 

    gl.glEnd();//end drawing of points 
} 

調整samples的味道。

+0

基本上,我做了同樣的事情:)並加上你應該更仔細地閱讀他的評論!因爲我已經編輯了我的迴應三次! – 2012-03-13 21:00:32

+0

使用這種方法,我意識到每次使用該方法時都必須根據樣本值更改座標值。也就是說,樣本值不能大於我的座標值。當我在我的display()中使用drawline方法時,如下所示: 'drawLine(gl,0,0,250,250);',則樣本值不能大於250.那麼我該如何解決這個問題呢? – 2012-03-13 21:05:42

+1

我的Java非常生疏,但在分割之前嘗試將'samples'轉換爲'float':'float dx =(x2 - x1)/(float)samples;' – genpfault 2012-03-14 09:03:41

1

這就是你如何在OpenGL中做到這一點。

glBegin(GL_POINTS); 
    for(float i = 0; i <= 100;){ 
     glVertex2f(i,i); 
     i+=0.01; 
    } 
glEnd(); 

而且,你想在GL_PROJECTION矩陣的正投影和你的模型視圖像GL_MODELVIEW上面的代碼

編輯玩弄你的+=0.01,你將得到的結果更好的方式建議

glBegin(GL_LINES); 
    glVertex2i(0,0); 
    glVertex2i(100,100); 
glEnd(); 
+0

我明白,但我相信GL_POINTS是必需的。有沒有辦法使用這些點來創建這樣一條從x1,y1開始到x2,y2結束的線? – 2012-03-13 20:41:00

+0

如果您需要使用'GL_POINTS'來完成,請將i + = 0.01更改爲您所需的值。我已經相應更新了 – 2012-03-13 20:44:00

+0

嗯,這似乎是我的問題的一個很好的解決方案。對不起,如果我感到很累,但我不太熟悉OpenGL。由於需要一個drawLine()方法,我不應該使用一些涉及'GL gl,int x1,int y1,int x2,int y2'的代碼嗎? – 2012-03-13 20:50:51