实验三 反走样及五环的绘制
一、【实验目的】
1.了解走样和反走样的内容,熟练掌握用opengl实现图形的反走样。 2.学会用反走样消除走样现象。 3.学会五环的绘制方法。
二、【实验内容】
1.通过学习反走样相关课程,用opengl实现光栅图形的反走样。 2.绘制五环。
三、【测试数据及其结果】 四、【实验源代码】
反走样:
#include
#pragma comment(linker,\GLuint lineList; //指定显示列表 void Initial() {
glClearColor(1.0f,1.0f,1.0f,0.0f); glLineWidth(12.0f);
glColor4f(0.0,0.6,1.0,1.0);
lineList=glGenLists(1); //获得一个显示列表标识 glNewList(lineList,GL_COMPILE); //定义显示列表 glBegin(GL_LINE_LOOP); glVertex2f(1.0f,1.0f);
glVertex2f(4.0f,2.0f); glVertex2f(2.0f,5.0f); glEnd(); glEndList(); }
void ChangeSize(GLsizei w,GLsizei h) {
if(h==0) h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION); //指定设置投影参数 glLoadIdentity(); if(w<=h)
gluOrtho2D(0.0,5.0,0.0,6.0*(GLfloat)h/(GLfloat)w); else
gluOrtho2D(0.0,5.0*(GLfloat)w/(GLfloat)h,0.0,6.0); glMatrixMode(GL_MODELVIEW); //指定设置模型视图变换参数 glLoadIdentity(); }
void Displayt(void) {
glClear(GL_COLOR_BUFFER_BIT);
glCallList(lineList); //调用显示列表 glFlush(); }
void Displayw(void){
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_LINE_SMOOTH); //使用反走样 glEnable(GL_BLEND); //启用混合函数
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); //指定混合函数 glCallList(lineList); //调用显示列表 glFlush(); }
void main(void) {
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(300,300); glutCreateWindow(\原始图形\ glutDisplayFunc(Displayt); glutReshapeFunc(ChangeSize); Initial();
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(300,300);
glutInitWindowSize(300,300); glutCreateWindow(\反走样图形\ glutDisplayFunc(Displayw); glutReshapeFunc(ChangeSize); Initial();
glutMainLoop(); }
五环:
#include
#pragma comment(linker,\const float PI=3.1415;
void DrawCircle(GLfloat radius) {
GLfloat x,y,z;
glBegin(GL_LINE_LOOP);
for (int alpha=0;alpha<360;alpha++) {
x=radius*cos(alpha*PI/180); y=radius*sin(alpha*PI/180); z=0;
glVertex3f(x,y,z); }
glEnd(); }
void Display() {
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity();
glTranslatef(0,0,-25); glColor3f(0,1,0); glLineWidth(3); DrawCircle(3.0); glPopMatrix(); glPushMatrix();
glTranslatef(7,0,0); glColor3f(1,0,0); DrawCircle(3.0); glPopMatrix();
glPushMatrix();
glTranslatef(-7,0,0); glColor3f(0,0,1); DrawCircle(3.0); glPopMatrix(); glPushMatrix();
glTranslatef(-3.5,-3.5,0); glColor3f(0.3,0.5,0.7); DrawCircle(3.0); glPopMatrix(); glPushMatrix();
glTranslatef(3.5,-3.5,0); glColor3f(0.7,0.0,0.3); DrawCircle(3.0); glPopMatrix();
glutSwapBuffers(); }
void reshape(int w,int h) {
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION); glLoadIdentity();
gluPerspective(45,GLdouble(w)/h,1,100); glMatrixMode(GL_MODELVIEW); }
void main(int argc,char **argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE); glutInitWindowPosition(10,10); glutInitWindowSize(500,500); glutCreateWindow(\ glutDisplayFunc(Display); glutReshapeFunc(reshape); glutMainLoop(); }
实验四 多视区
一、【实验目的】
1.熟练掌握各种裁剪算法和二维观察变换。
2.学会在屏幕坐标系下创建多个视区、指定视区的宽度和高度,了解二维观察变换中包含窗口到视区的映射。
二、【实验内容】
1.在一个显示窗口内指定多个视区,分别显示具有相同坐标、不同颜色和不同显示模式的各种图形面。
2.在书本给定程序基础上,对程序做一些改变并在视区中绘制各种图形。
三、【测试数据及其结果】 四、【实验源代码】
#include
const float PI=3.1415; void initial(void) {
glClearColor(1.0,1.0,1.0,1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity();
gluOrtho2D(-10.0,10.0,-10.0,10.0); }
void triangle(GLsizei mode) {