如何在OpenGL中创建正方形螺旋? (JAVA)

时间:2012-03-14 14:29:38

标签: java opengl jogl

我需要创建一个正方形螺旋(相同大小),在完成360度循环后,它将改变颜色。所以,例如,我想做一个三色螺旋。第一部分可能是蓝色,在第一个周期后,方块变为绿色,最后变成红色。这是我正在寻找的可视化:

square spiral

到目前为止我的代码(除了JPanel之外)如下:

import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;


public class SecondGLEventListener implements GLEventListener {

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

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

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

        gl.glViewport(0, 0, 500, 300);
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        glu.gluOrtho2D(0.0, 500.0, 0.0, 300.0);
    }
    /**
     * Take care of drawing here.
     */
    public void display(GLAutoDrawable drawable)
    {

        GL gl = drawable.getGL();

        gl.glClear(GL.GL_COLOR_BUFFER_BIT);

        for (int i=0; i<50; i++)
        {
            gl.glColor3f(0.0f,0.0f,1.0f);
            gl.glPointSize(3);
            gl.glBegin(GL.GL_POINTS);
            //some code for the spiral thing.  
            gl.glEnd();
        }

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

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

}

您对我如何实现这一点有什么建议吗?

2 个答案:

答案 0 :(得分:4)

twotwo放在一起:

#include <GL/glut.h>
#include <cmath>

void glSpiral(float a, float b, float thetaStart, float thetaEnd, unsigned int samples = 200 )
{
    glBegin( GL_QUADS );

    const float sz = 1.0f;

    float dt = (thetaEnd - thetaStart) / (float)samples;

    for( unsigned int i = 0; i <= samples; ++i )
    {
        // archimedean spiral
        float theta = thetaStart + (i * dt);
        float r = a + b * theta;

        // polar to cartesian
        float x = r * cos( theta );
        float y = r * sin( theta );

        glVertex2f( x - sz, y - sz );
        glVertex2f( x + sz, y - sz );
        glVertex2f( x + sz, y + sz );
        glVertex2f( x - sz, y + sz );
    }

    glEnd();
}

size_t win_w = 0;
size_t win_h = 0;
double aspect_ratio = 0;
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-100*aspect_ratio, 100*aspect_ratio, -100, 100, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    const float PI = 3.14159;
    for( unsigned int i = 0; i < 6; i++ )
    {
        switch( i )
        {
        case 0: glColor3ub(255,0,0);        break; 
        case 1: glColor3ub(0,255,0);        break; 
        case 2: glColor3ub(0,0,255);        break; 
        case 3: glColor3ub(255,255,0);      break; 
        case 4: glColor3ub(0,255,255);      break; 
        case 5: glColor3ub(255,255,255);    break; 
        default: glColor3ub(128,128,128);   break;
        }

        float beg = (i+0)*2*PI;
        float end = (i+1)*2*PI;
        glSpiral( 0, 3, beg, end, 80 );
    }

    glFlush();
    glutSwapBuffers();
}

void reshape(int w, int h)
{
    win_w = w;
    win_h = h;
    aspect_ratio = (double)win_w / (double)win_h;
    glViewport(0, 0, w, h);
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);

    glutInitWindowSize(800,600);
    glutCreateWindow("Spiral");

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
}

screenshot 它在C ++和GLUT中,但将核心逻辑移植到Java应该很容易。

答案 1 :(得分:-1)

如果需要方形螺旋:

import java.awt.*;
public class Spiral {
    public static void main(String[] args) {
      DrawingPanel panel = new DrawingPanel(170, 170);
      Graphics g = panel.getGraphics();
      for (int i = 0; i < 8; i++) {
        g.drawLine(      10*i,   10 + 10*i, 160 - 10*i,  10 + 10*i);  // top
        g.drawLine(160 - 10*i,   10 + 10*i, 160 - 10*i, 160 - 10*i);  // right
        g.drawLine( 10 + 10*i,  160 - 10*i, 160 - 10*i, 160 - 10*i);  // bottom
        g.drawLine( 10 + 10*i,   20 + 10*i,  10 + 10*i, 160 - 10*i);  // left
      }
   }
}