坐标轴
二维坐标轴由x,y轴两条直线组成,因此我们只需画两条直线就行。
glBegin(GL_LINES);
glVertex3f(-1.0, 0.0, 0.0);
glVertex3f(1.0, 0.0, 0.0);
glVertex3f(0.0, 1.0, 0.0);
glVertex3f(0.0,-1.0, 0.0);
glEnd();
glVertex3f()参数的范围为-1.0到1.0
椭圆
因为椭圆是在圆画法的基础上改进,所以先学圆的画法。
glBegin(GL_POLYGON);
for (int i = 1;i <= n;i++)
{
glVertex2f(R * cos(2 * P / i * n), R * sin(2 * P / i * n));
}
glEnd();
R为圆的半径,n为圆的精度,n越大则画的图形越接近圆。
椭圆则将R替换为a和b(a为长轴长,b短轴长)
注意我们所画的圆和椭圆的中心都在原点上,想要中心不在原点的椭圆,可以修改函数glVertex2f()里的参数,非原点的中心在原点中心的参数上进行相应的加减就行了。
需要注意的一点是,窗口的图形是左减右加,与数学公式里的左加右减相反。
运行结果如图
glVertex2f(0.5+a * cos(2 * P / i * n), b * sin(2 * P / i * n));
#include<GL/glut.h>
#include<math.h>
void renderScene(void) {
const GLfloat a = 0.5, b = 0.3;//a为长轴长,b为短轴长
const GLfloat P = 3.1415926536;
int n = 5000;//椭圆精度
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINES);//2维坐标轴
glVertex3f(-1.0, 0.0, 0.0);
glVertex3f(1.0, 0.0, 0.0);
glVertex3f(0.0, 1.0, 0.0);
glVertex3f(0.0,-1.0, 0.0);
glEnd();
glBegin(GL_POLYGON);//椭圆
for (int i = 1;i <= n;i++)
{
glVertex2f(a * cos(2 * P / i * n), b * sin(2 * P / i * n));
}
glEnd();
glFlush();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);//初始化
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition(100,100);//设置窗口出现的位置
glutInitWindowSize(320, 320);//设置窗口大小
glutCreateWindow("椭圆");//创建窗口
glutDisplayFunc(renderScene);
glutMainLoop();
}