资源描述
5.27试用OpenGL程序绘制实线、虚线和点划线。
#include "stdafx.h" //stdafx.h中没有函数库,只是定义了一些环境参数,使得编译出来的//程序能在32位的操作系统环境下运行。
#include<gl/glut.h>
void Init()
{
glClearColor(0.0,0.0,0.0,1.0);
}
void display()
{
// glClearColor(0.0,0.0,0.0,1.0);
glClear(GL_COLOR_BUFFER_BIT);
//绘制实线
glColor3f(1.0,0.0,0.0);
/*注意:glColor系列函数,在参数类型不同时,表示“最大”颜色的值也不同。
采用f和d做后缀的函数,以1.0表示最大的使用。
采用b做后缀的函数,以127表示最大的使用。
采用ub做后缀的函数,以255表示最大的使用。
采用s做后缀的函数,以32767表示最大的使用。
采用us做后缀的函数,以65535表示最大的使用。*/
glLineWidth(5);
glBegin(GL_LINES);
glVertex2f(0,200);
glVertex2f(300,200);
glEnd();
//绘制虚线
glColor3f(1.0,0.0,1.0);//紫色
glLineWidth(5);
glEnable(GL_LINE_STIPPLE);//打开画线模式
glLineStipple(4,0x00FF);
glBegin(GL_LINES);
glVertex2f(0,250);
glVertex2f(300,250);
glEnd();
glDisable(GL_LINE_STIPPLE);
//绘制点划线
glColor3f(1.0,1.0,0.0);//黄色
glLineWidth(5);
glEnable(GL_LINE_STIPPLE);
glLineStipple(2,0xFF0A);
glBegin(GL_LINES);
glVertex2f(0,300);
glVertex2f(300,300);
glEnd();
glDisable(GL_LINE_STIPPLE);
glFlush();
}
void changesize(GLsizei w,GLsizei h)
{
glViewport(100, 100, w, h); //设置视区尺寸
if(h==0)
h=1;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho (0.0f, 500.0f, 0.0f, 500.0f*h/w, 1.0, -1.0);
//gluOrtho2D(0.0f, 500.0f, 0.0f, 500.0f*h/w);
else
glOrtho (0.0f, 500.0f*w/h, 0.0f, 500.0f, 1.0, -1.0);
}
int main(int argc, char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(100,100);
glutInitWindowSize(600,600);
glutCreateWindow("绘制不同的直线");
glutDisplayFunc(display);
glutReshapeFunc(changesize);
Init();
glutMainLoop();
return 0;
}
5.28试用OpenGL实现黑白相间的棋盘图案填充多边形。
#include "stdafx.h"
#include<gl/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
GLubyte chess[]={//定义128字节大小的数组
0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF
};
//未填充的多边形
/* glBegin(GL_POLYGON);
glVertex2f(100,100);
glVertex2f(200,100);
glVertex2f(200,400);
glVertex2f(100,400);
glEnd();*/
//填充的多边形
glEnable(GL_POLYGON_STIPPLE);//启用多边形填充模式
glPolygonStipple(chess);//指定chess数组定义的位图为填充模板
glBegin(GL_POLYGON);
glVertex2f(200,100);
glVertex2f(500,100);
glVertex2f(500,500);
glVertex2f(200,500);
glEnd();
glDisable(GL_POLYGON_STIPPLE);
glFlush();
}
void changesize(int w,int h)
{
glViewport(0,0,w,h);
if(h==0)h=1;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(0,600,0,600*h/w,1,-1);
else
glOrtho(0,600*w/h,0,600,1,-1);
}
int main(int argc, char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
glutInitWindowSize(600,600);
glutInitWindowPosition(100,100);
glutCreateWindow("填充多边形");
glutDisplayFunc(display);
glutReshapeFunc(changesize);
glutMainLoop();
return 0;
}
5.29利用OpenGL,分别用点和折线模式实现正弦和余弦曲线的绘制。
#include "stdafx.h"
#include<gl/glut.h>
#include<math.h>
#include<iostream.h>
float k=0.05;
int mode=1;
void display()
{
glClearColor(0.0,0.0,0.0,1.0);
glClear(GL_COLOR_BUFFER_BIT);
//画出坐标轴
glColor3f(1.0,1.0,1.0);
glBegin(GL_LINES);//OpenGL默认坐标值只能从-1到1
glVertex2f(-1,0);
glVertex2f(1,0);
glVertex2f(0,1);
glVertex2f(0,-1);
glEnd();
if(mode==1) //画线
{
cout<<"现在是线模式,要想转换到点模式请按下p键!"<<endl;
//画正弦曲线
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINE_STRIP);
/* for(float a=-1;a<=1;a=a+0.01)
{
glVertex2f(a,sin(a));
}*/
for(float i=-1/k;i<=1/k;i=i+0.01)//扩大20倍
{
glVertex2f(i*k,sin(i)*0.3);
}
glEnd();
//画余弦曲线
glColor3f(0.0,1.0,0.0);
glBegin(GL_LINE_STRIP);
for(float j=-1/k;j<=1/k;j=j+0.01)
{
glVertex2f(j*k,cos(j)*0.3);
}
glEnd();
}
if(mode==2)//画点
{
cout<<"现在是点模式,要想转换到线模式请按下l键!"<<endl;
glColor3f(1.0,1.0,0.0);
glBegin(GL_POINTS);
for(float m=-1/k;m<=1/k;m=m+0.05)
{
glVertex2f(m*k,sin(m)*0.3);
}
glEnd();
glColor3f(0.5,0.5,1.0);
glBegin(GL_POINTS);
for(float n=-1/k;n<=1/k;n=n+0.05)
{
glVertex2f(n*k,cos(n)*0.3);
}
glEnd();
}
glFlush();
}
void Key(unsigned char key,int x,int y)//实现键盘响应函数
{
switch(key)
{
case 'p':mode=2;break;
case 'l':mode=1;break;
default:break;
}
glutPostRedisplay();
}
int main(int argc, char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(600,600);
glutInitWindowPosition(100,100);
glutCreateWindow("正弦和余弦");
glutDisplayFunc(display);
glutKeyboardFunc(Key);
glutMainLoop();
return 0;
}
5.30利用OpenGL在屏幕上输出"OpenGL"字样.
#include "stdafx.h"
#include<gl/glut.h>
#include<string.h>
/*void output(int x, int y, char *string)
{
int len, i;
glRasterPos2f(x, y);//字符显示的位置
len = (int) strlen(string);
for (i = 0; i < len; i++)
{
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, string[i]);//字符的字体、大小和内容
}
}*/
void display()
{
glClearColor(0.0,0.0,0.0,1.0);
glClear(GL_COLOR_BUFFER_BIT);
//output(100,150,"OpenGL!");
//显示位图字符(指定使用固定宽度的字体)
glColor3f(1.0,0,0.7);
glRasterPos2f(100, 150);//字符显示的位置
glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'O');
glutBitmapCharacter(GLUT_BITMAP_9_BY_15,112);
glutBitmapCharacter(GLUT_BITMAP_9_BY_15,101);
glutBitmapCharacter(GLUT_BITMAP_9_BY_15,110);
glutBitmapCharacter(GLUT_BITMAP_9_BY_15,71);
glutBitmapCharacter(GLUT_BITMAP_9_BY_15,76);
//显示位图字符(24磅的Times-Roman字体)
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,79);
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,112);
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,101);
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,110);
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,71);
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,76);
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,33);
//显示矢量字符(显示一种等距的Roman Simplex字体)
glColor3f(1.0,0,0);
glutStrokeCharacter(GLUT_STROKE_ROMAN,'O');
glColor3f(0,1,0);
glutStrokeCharacter(GLUT_STROKE_ROMAN,112);
glColor3f(1.0,1,0);
glutStrokeCharacter(GLUT_STROKE_ROMAN,101);
glColor3f(1.0,0.5,0.5);
glutStrokeCharacter(GLUT_STROKE_ROMAN,110);
glColor3f(0.0,1,1);
glutStrokeCharacter(GLUT_STROKE_ROMAN,71);
glColor3f(0.0,0,1);
glutStrokeCharacter(GLUT_STROKE_ROMAN,76);
glColor3f(1,0.5,1);
glutStrokeCharacter(GLUT_STROKE_ROMAN,33);
//显示矢量字符(显示一种单一间距的Roman Simplex字体)
glColor3f(1.0,0,0);
glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,79);
glColor3f(0,1,0);
glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,112);
glColor3f(1.0,1,0);
glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,101);
glColor3f(1.0,0.5,0.5);
glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,110);
glColor3f(0.0,1,1);
glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,71);
glColor3f(0.0,0,1);
glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,76);
glFlush();
}
void changesize(int w,int h)
{
glViewport(0,200,w,h);
if(h==0)h=1;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// gluOrtho2D(0,w,0,h);
if(w<=h)
glOrtho(-120,600,-120,600*h/w,1,-1);
else
glOrtho(-120,600*w/h,-120,600,1,-1);
}
int main(int argc, char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(600,600);
glutInitWindowPosition(100,100);
glutCreateWindow("显示字符");
glutDisplayFunc(display);
glutReshapeFunc(changesize);
glutMainLoop();
return 0;
}
展开阅读全文