OpenGL编程指南5:学习绘制不同风格的曲线

来源:互联网 发布:java类设计工具 编辑:程序博客网 时间:2024/05/01 10:59

1.不同风格曲线绘制

#include <vgl.h>//宏定义;当定义的宏不能用一行表达完整时,可以用"\"表示下一行继续#define drawOneLine(x1,y1,x2,y2) \glBegin(GL_LINES);\glVertex2f((x1),(y1));\glVertex2f((x2),(y2));\glEnd();void init(void){glClearColor(0.0,0.0,0.0,0.0); glShadeModel(GL_FLAT);}void display(void){int i;glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,1.0,0);//in 1st row, 3 lines,each with a different stipplesglEnable(GL_LINE_STIPPLE);glLineStipple(1,0x0101);drawOneLine(50,125,150,125);glLineStipple(1,0x00FF);drawOneLine(150,125,250,125);glLineStipple(1,0x1c47);drawOneLine(250,125,350,125);//in 2nd row, 3 wide lines,each with different stippleglLineWidth(5.0);glLineStipple(1,0x0101);drawOneLine(50,100,150,100);glLineStipple(1,0x00FF);drawOneLine(150,100,250,100);glLineStipple(1,0x1c47);drawOneLine(250,100,350,100);glLineWidth(1.0);//in 3rd row,6 line,with dash/dot/dash stippleglLineStipple(1,0x1c47);glBegin(GL_LINE_STIPPLE);for (int i = 0; i<7; i++){glVertex2f(50+((GLfloat)i*50),75);}glEnd();//in 4th row,6 independent lines with same stipplefor (int i = 0; i<6; i++){drawOneLine(50.0+((GLfloat)i*50),50,        50+((GLfloat)(i+1)*50),50);}//in 5th row, 1line,glLineStipple(5,0x1c47);drawOneLine(50,25,350,25);glDisable(GL_LINE_STIPPLE);glFlush();}void reshape(int w,int h){glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0,(GLdouble)w,0,(GLdouble)h);}int main(int argc,char **argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400,150);glutInitWindowPosition(200,200);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0;}
输出结果:

2.程序中关键点剖析

2.1 #define宏定义中‘\’神奇用法

\=行继续操作:当定义的宏不能用一行表达完整时,可以用"\"表示下一行继续此宏的定义。注意:最后一行不要加续行符啊。VC的预处理器在编译之前会自动将\与换行回车去掉(写成多行时,反斜杠后不能有空格,否则编译器(ARM或VC)会报错!),这样一来既不影响阅读,又不影响逻辑,皆大欢喜.

2.2 glLineStipple()

viod glLineStipple(GLint factor,GLshort pattern);
从这个模式的低位开始,一个像素一个像素的进行处理。如果模式中对应的位是1,就绘制这个像素,否则就不绘制。模式可以使用factor参数(表示重复因子)进行扩展,它与1和0的连续子序列相乘。因此,如果模式中出现了3个1,并且factor是2,那么它们就扩展为6个连续的1。必须以GL_LINE_STIPPLE为参数调用glEnable()才能启用直线点画功能。为了禁用直线点画功能,可以向glDisable()函数传递同一个参数

3.参看资料

[1]施莱尔, GrahamSellers, JohnKessenich,等. OpenGL编程指南[M]. 机械工业出版社, 2014.
1 0
原创粉丝点击