本小节的代码参考了
http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html里的内容。
1、用正多边形模拟一个圆,主要思想是求出把圆n等分的各个顶点坐标,然后连线即可。第一个顶点的坐标为(R,0)。
核心代码如下:
#include <math.h> const int n = 20; const GLfloat R = 0.5f; const GLfloat Pi = 3.1415926536f; void display(void) { int i; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINE_LOOP); for(i=0; i<n; ++i) glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i)); glEnd(); glFlush(); }
下图2是n=200的结果
2、画一个五角星,效果如下所示
代码思路是设正五边形边长为1。
圆半径为R,圆心O为坐标原点,
显然有R=0.5/sin36°;
第一个顶点A的坐标为(0,R),
则B点的横坐标bx=R*cos18°,纵坐标by=R*sin18°
C点的横坐标cx=1/=0.5,纵坐标cy=-R*sin54°
DE两点和BC关于y轴对称,所以最终的代码如下:
#include <math.h> const GLfloat Pi = 3.1415926536f; const GLfloat arc= Pi/180; //1度角所对应的弧度 void display(void) { const GLfloat r = 0.5f/sin(36 * arc) ; GLfloat bx = r * cos(18 * arc); GLfloat by = r * sin(18 * arc); GLfloat cx = 0.5f; GLfloat cy = -r * sin(54 * arc); //各定点坐标 GLfloat A[2] = { 0, r }, B[2] = { bx, by }, C[2] = { cx, cy }, D[2] = { -cx, cy }, E[2] = { -bx, by }; // 按照A->C->E->B->D->A的顺序,可以一笔将五角星画出 glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINE_LOOP); glColor3f(1.0, 0.0, 0.0); glVertex2fv(A); glVertex2fv(C); glVertex2fv(E); glVertex2fv(B); glVertex2fv(D); glEnd(); glFlush(); }3、画正弦函数图形
/* 由于OpenGL默认坐标值只能从-1到1,(可以修改,但方法留到以后讲) 所以我们设置一个因子factor,把所有的坐标值等比例缩小, 这样就可以画出更多个正弦周期 试修改factor的值,观察变化情况 */
#include <math.h> const GLfloat factor = 0.1f; //缩放因子,将普通正弦函数的图像缩小10倍画到屏幕上。 void display(void) { GLfloat x; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); glVertex2f(-1.0f, 0.0f); glVertex2f(1.0f, 0.0f); // 以上两个点可以画x轴 glVertex2f(0.0f, -1.0f); glVertex2f(0.0f, 1.0f); // 以上两个点可以画y轴 glEnd(); //用描点法画出缩放后的正弦函数图像 glBegin(GL_LINE_STRIP); for(x=-1.0f/factor; x<1.0f/factor; x+=0.01f) { glVertex2f(x*factor, sin(x)*factor); } glEnd(); glFlush(); }运行结果如下: