openGL——01、二维螺旋线demo

需求

使用opengl实现如下图所示的二维螺旋线:

螺旋线.png

原理

利用圆的参数方程

x = x0 + r * cos(θ);
y = y0 + r * sin(θ);

在变化角度的同时,圆的半径也匀速减小。

代码:

vs环境可运行。

/**
 * @date: 2017.06.05
 * @description: 螺旋线。
 */

#include 
#include 

void init(void) {
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0.0, 1000.0, 0.0, 900.0);
}

void simulate(void) {
    GLfloat pi2 = 3.1415936 * 2;
    GLfloat one = 1.0;
    GLfloat zero = 0.0;
    GLfloat r = 450;
    GLfloat x = 500.0;
    GLfloat y = 450.0;
    GLfloat c = 0.08;

    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0, 0.0, 0.0);

    glBegin(GL_POINTS);

    for (GLfloat j = 0; j < pi2 * 10; j += 0.01) {
        r = r < zero ? zero : r;
        glVertex2f(x + r * cos(j) + one, y + r * sin(j) + one);
        glVertex2f(x + r * cos(j) + one, y + r * sin(j) - one);
        glVertex2f(x + r * cos(j) - one, y + r * sin(j) + one);
        glVertex2f(x + r * cos(j) - one, y + r * sin(j) - one);
        glVertex2f(x + r * cos(j), y + r * sin(j));
        r -= c;     

    }

    glEnd();
    glFlush();
}

int main(int argc, char** argv) {

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(50, 100);
    glutInitWindowSize(1000,900);
    glutCreateWindow("an example OpenGL Program");

    init();
    glutDisplayFunc(simulate);
    glutMainLoop();

    return 0;
}

More

上述代码中的:gluOrtho2D(0.0, 1000.0, 0.0, 900.0);glutInitWindowSize(1000, 900);,前者表示裁剪窗口的参数,后者表示视口的参数,其高宽比若不一致,则会导致图像拉伸。

可以在githup上面查看:
https://github.com/lifeSo/graphicsDemo/blob/master/01.get start/02.spiral line.c

你可能感兴趣的:(openGL——01、二维螺旋线demo)