简体   繁体   English

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

[英]How to create a spiral of squares in OpenGL? (JAVA)

I need to create a spiral of squares (same size) which, upon completion of a 360 degree cycle, will change colour. 我需要创建一个正方形螺旋(相同大小),在完成360度循环后,它将改变颜色。 So for instance, I'd like to make a three color spiral. 所以,例如,我想做一个三色螺旋。 the first part could be blue, after the first cycle the squares turn green and lastly they become red. 第一部分可能是蓝色,在第一个周期后,方块变为绿色,最后变成红色。 Here's a visualisation of what I'm looking for: 这是我正在寻找的可视化:

方形螺旋

My code so far (except of the JPanel thingy) is the following: 到目前为止我的代码(除了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) {}

}

Do you have any suggestions as to how I could implement this? 您对我如何实现这一点有什么建议吗?

Put two and two together: 两个两个放在一起:

#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;
}

截图 It's in C++ and GLUT but porting the core logic to Java should be easy. 它在C ++和GLUT中,但将核心逻辑移植到Java应该很容易。

for square spiral if needed: 如果需要,用于方形螺旋:

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
      }
   }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM