2012-03-13 4 views
0

L'exercice que j'ai est le suivant: Dans display(), ajoutez une méthode drawLine. Probablement, vous aurez besoin de quelque chose comme drawLine (GL gl, int x1, int y1, int x2, int y2) maintenant en utilisant l'équation d'une ligne, tracer les différents points qui composent la ligne de x1, y1 à x2, y2 dans JOGL en utilisant (par exemple) gl.glPointSize (1.0f); gl.glBegin (GL.GL_POINTS); Si vous avez des points de couleur les blancs, et utilisé les projections suivantesOpenGL - tracez la ligne avec des points

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

puis avec une valeur d'une ligne à partir de points (0,0) (100100) votre sera quelque chose comme l'image suivante:

enter image description here

mon code jusqu'à présent pour le EventListener où je crée ma ligne est la suivante:

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 

} 

}

Mon problème est que je ne sais pas trop comment compléter le code dans la méthode pour l'équation de ligne. Je vous serais reconnaissant si vous pouviez m'aider avec ce peu. Je pense que le reste est juste, j'ai juste besoin de trouver comment implémenter l'équation de ligne dans la méthode drawLine().

+0

Cela ressemble au pire devoir de programmation graphique jamais conçu. Vous devriez lire et cela deviendra vite apparent. –

Répondre

1

C'est une manière terrible de tracer une ligne en utilisant OpenGL.

GL_LINES est beaucoup mieux.

Cela dit:

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 
} 

Adjust samples au goût.

+0

Fondamentalement, faire la même chose que j'ai fait :) et plus vous devriez lire ses commentaires plus attentivement! à cause de laquelle j'ai édité mes réponses trois fois! –

+0

En utilisant cette approche, j'ai réalisé que je devais changer les valeurs de coordonnées chaque fois que j'utilise la méthode en fonction de la valeur des échantillons. C'est-à-dire que la valeur des échantillons ne peut pas être plus grande que mes valeurs de coordonnées.Lorsque j'utilise la méthode drawline dans mon affichage() comme ceci: 'drawLine (gl, 0, 0, 250, 250);', alors la valeur des échantillons ne peut pas être supérieure à 250. Comment puis-je résoudre ce problème? –

+1

Mon Java est assez rouillé, mais essayez de lancer 'samples' à' float' avant de diviser: 'float dx = (x2 - x1)/(float) des échantillons;' – genpfault

1

Voilà comment vous le faites dans OpenGL.

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

En outre, une suggestion que vous voulez avoir vos projections orthographiques dans la matrice de GL_PROJECTION et votre modelview comme le code ci-dessus dans GL_MODELVIEW

Edité jouer avec votre +=0.01 et vous obtiendrez les meilleurs résultats WAY

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

Je comprends, cependant je crois que le GL_POINTS est requis. Est-il possible d'utiliser les points pour créer une telle ligne commençant à x1, y1 et se terminant à x2, y2? –

+0

Changez le i + = 0.01 pour ce dont vous avez besoin si vous avez besoin de le faire avec 'GL_POINTS'. Je l'ai mis à jour en conséquence –

+0

hmmm Cela semble être une excellente solution à mon problème. Excusez-moi si je commence à me fatiguer mais je ne connais pas trop OpenGL. Comme une méthode drawLine() est nécessaire, ne devrais-je pas utiliser un code qui implique le 'GL gl, int x1, int y1, int x2, int y2'? –

Questions connexes