需求
使用opengl实现如下图所示的二维螺旋线:
原理
利用圆的参数方程
x = x0 + r * cos(θ);
y = y0 + r * sin(θ);
在变化角度的同时,圆的半径也匀速减小。
代码:
vs环境可运行。
/**
* @date: 2017.06.05
* @description: 螺旋线。
*/
#include <GL/glut.h>
#include <math.h>
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