OpenGL从1.0开始--曲线图形
来源:互联网 发布:xp无法添加网络打印机 编辑:程序博客网 时间:2024/05/17 08:56
这一节我们继续来实现一些有趣的高级图形,例如蜗形线limacon、心形线cardioid、三叶草threeLeaf、四叶草fourLeaf和螺旋线spiral等漂亮的曲线图形,如下面这些图形所示。
#include <gl/glut.h>#include <stdlib.h>#include <math.h>#include <iostream>using namespace std;const GLdouble twoPi = 6.283185;class screenPt{public: GLint x, y;};typedef enum{limacon=1,cardioid,threeLeaf,fourLeaf,spiral}curveName;//五种图形的枚举GLsizei winWidth = 600, winHeight = 500;void init(void){ glClearColor(1.0, 1.0, 1.0, 1.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, 200.0, 0.0, 150.0);}void lineSegment(screenPt pt1, screenPt pt2)//线段绘制函数,本节也是用曲线细分的方法绘制图形{ glBegin(GL_LINES); glVertex2i(pt1.x, pt1.y); glVertex2i(pt2.x, pt2.y); glEnd();}void drawCurve(GLint curveNum)//核心绘制函数{ const GLint a = 175, b = 60;//任意的两个曲线参数 GLfloat r, theta, dtheta = 1.0 / float(a); GLint x0 = 200, y0 = 250;//设置一个任意的屏幕初始坐标 screenPt curvePt[2]; glColor3f(0.0, 0.0, 0.0); curvePt[0].x = x0;//初始化曲线位置 curvePt[0].y = y0; switch (curveNum) { case limacon:curvePt[0].x += a + b; break; case cardioid:curvePt[0].x += a + a; break; case threeLeaf : curvePt[0].x += a; break; case fourLeaf:curvePt[0].x += a; break; case spiral:break; default: break; } theta = dtheta; while (theta<twoPi)//曲线细分 { switch (curveNum)//不同的曲线适用不同的极函数 { case limacon: r = a*cos(theta) + b; break; case cardioid: r = a*(1 + cos(theta)); break; case threeLeaf: r = a*cos(3 * theta); break; case fourLeaf: r = a*cos(2 * theta);break; case spiral: r = (a / 4.0)*theta; break; default: break; } curvePt[1].x = x0 + r*cos(theta);//绘制细分线段的终点 curvePt[1].y = y0 + r*sin(theta); lineSegment(curvePt[0], curvePt[1]);//绘制该细分线段 curvePt[0].x = curvePt[1].x;//细分线段的起点坐标更新为终点坐标 curvePt[0].y = curvePt[1].y; theta += dtheta;//曲线往前绘制 }}void displayFcn(void){ GLint curveNum; glClear(GL_COLOR_BUFFER_BIT); cout << "\nEnter the integer value corresponding to\n"; cout <<"one of the following curve names.\n"; cout << "\Press any other key to exit.\n"; cout << "\n1-limacon,2-cardioid,3-threeLeaf,4-fourLeaf,5-spiral:"; cin >> curveNum;//选择要绘制的曲线类型 if (curveNum == 1 || curveNum == 2 || curveNum == 3 || curveNum == 4 || curveNum == 5) { drawCurve(curveNum);//调用曲线绘制函数 } else { exit(0); } glFlush();}void winReshapeFcn(GLint newWidth, GLint newHeight){ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight)); glClear(GL_COLOR_BUFFER_BIT);}void main(int argc, char**argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(100, 100); glutInitWindowSize(winWidth, winHeight); glutCreateWindow("Draw Curves"); init(); glutDisplayFunc(displayFcn); glutReshapeFunc(winReshapeFcn); glutMainLoop();}
阅读全文
0 0
- OpenGL从1.0开始--曲线图形
- OpenGL从1.0开始--输出图元
- OpenGL从1.0开始--绘制常用统计图
- OpenGL从1.0开始--颜色调和
- OpenGL从1.0开始--填充区属性
- OpenGL从1.0开始--二维几何变换
- OpenGL从1.0开始--二维观察
- OpenGL从1.0开始--三维观察
- OpenGL从1.0开始--计算机动画
- OpenGL从1.0开始--绘制规则多面体
- OpenGL从1.0开始--绘制二次曲面
- OpenGL从1.0开始--拾取操作
- OpenGL从1.0开始--GLUT菜单
- OpenGL从1.0开始--第一个OpenGL程序
- OpenGL从1.0开始--OpenGL显示表(上)
- OpenGL从1.0开始--OpenGL显示表(下)
- 【OpenGL图形开发】开始新的方向
- OpenGL从1.0开始-顶点数组简析
- 在cmd导入导出oracle数据库
- 例说STM32F7高速缓存——Cache一致性问题(一)
- 成功没有奇迹,只有轨迹!!!
- C++数值类型与string的相互转换
- 关于颜色缓存 GL_FRONT、GL_BACK、GL_BAK_LEFT、GL_FRONT_LEFT......
- OpenGL从1.0开始--曲线图形
- 学习笔记--实现ArrayList
- linux 安装nginx
- Unity_ini配置文件应用(用于读取或写入程序设置)
- 正则表达式
- Android PopupWindow用法(五) showAtLocation
- idea15更改编辑器模版,生成时间到分钟
- PopupWindow 的实现
- 关于ref和out的学习和思考