计算机图形学实验指导 源代码
《计算机图形学》实验报告

《计算机图形学》实验报告《实验名称》姓名=学号6010203165专业软件外包班级三班任课教师刘世光天津大学仁爱学院计算机系2012年3 月20 日一、实验目的初步熟悉OpenGL这一图形系统的用法,利用Visual C++编程平台。
学习并掌握常用的三维绘制函数。
二、实验内容准备glut库,并联系使用Visual C++进行最简单的图形处理。
调试并学习Teapot绘制程序。
总结三维绘制和二维绘制的异同点。
三、实验结果程序1程序2程序3四、实验分析和总结五、源代码程序1#include <GL/glut.h>//初始化OpenGLvoid init(void){glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//设置背景颜色glShadeModel(GL_FLAT);//设置明暗处理}//主要的绘制过程void display(void){glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存glColor3f(0.0f,0.0f,1.0f);glRectf(250.0f,250.0f,400.0f,400.0f);glBegin(GL_LINES);//开始画直线glColor3f(1.0f, 1.0f, 1.0f);//设置颜色为白色glVertex2f(30.0f, 30.0f);//第一根线的两个端点glVertex2f(200.0f, 400.0f);glColor3f(1.0f, 0.0f, 0.0f);//设置第二根线的颜色为红色glVertex2f(25.0f, 350.0f);//第二根线的两个端点glVertex2f(250.0f, 50.0f);glEnd();//画线结束glBegin(GL_TRIANGLES);//开始画三角形,注意,没有设颜色,所以还是红色glVertex2f(400.0f, 100.0f);//三角形的三个顶点glVertex2f(600.0f, 100.0f);glVertex2f(500.0f, 300.0f);glEnd();//结束画三角形glFlush();//开始绘制}//在窗口改变大小时调用void reshape(int width, int height)glViewport(0, 0, width, height);//设置视口glMatrixMode(GL_PROJECTION);//设置当前为投影变换模式glLoadIdentity();//用单位矩阵替换当前变换矩阵gluOrtho2D(0.0, width, 0.0, height);//设置正交投影视图体}//处理键盘void keyboard(unsigned char key, int x, int y){switch (key){case 27://esc键退出exit(0);break;default:break;}}int main(int argc, char** argv){glutInit(&argc, argv);//初始化glutglutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//设置为单缓存,RGB模式glutInitWindowSize(640, 480); //设置窗口大小glutInitWindowPosition(0, 0);//设置窗口起始位置glutCreateWindow("Basic");//设置窗口标题init();//初始化OpenGLglutDisplayFunc(display);//设置显示回调函数glutReshapeFunc(reshape);//设置reshape回调函数glutKeyboardFunc(keyboard);//设置键盘回调函数glutMainLoop();//进入主循环return 0;}//代码要有详细的注释程序2#include "StdAfx.h"#include <stdlib.h>#include <GL/glut.h>void init(void){glEnable(GL_DEPTH_TEST);GLfloat position[] = {1.0, 1.0, 1.0, 0.0};glLightfv(GL_LIGHT0, GL_POSITION, position);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};GLfloat diffuse[] = {0.8, 0.4, 0.3, 0.7};GLfloat specular[] = {0.5, 0.3, 0.3, 0.0};glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, specular);glMaterialf(GL_FRONT, GL_SHININESS, 50.0);}void display(void){glClearColor(0.65f, 0.3f, 0.05f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glNewList(1, GL_COMPILE);glutSolidTeapot(0.5);glEndList();glCallList(1);glFlush();}void reshape(GLsizei w, GLsizei h){glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);glMatrixMode(GL_MODELVIEW);}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowPosition(260, 100);glutInitWindowSize(500, 500);glutCreateWindow(argv[0]);init();glutReshapeFunc(reshape);glutDisplayFunc(display);glutMainLoop();return 0;}程序3#include <GL/glut.h>//初始化OpenGLvoid init(void){glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//设置背景颜色glShadeModel(GL_FLAT);//设置明暗处理}//主要的绘制过程void display(void){glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存glColor3f(0.0f,0.0f,1.0f);glRectf(250.0f,250.0f,400.0f,400.0f);glBegin(GL_LINES);//开始画直线glColor3f(1.0f, 1.0f, 1.0f);//设置颜色为白色glVertex2f(30.0f, 30.0f);//第一根线的两个端点glVertex2f(200.0f, 400.0f);glColor3f(1.0f, 0.0f, 0.0f);//设置第二根线的颜色为红色glVertex2f(25.0f, 350.0f);//第二根线的两个端点glVertex2f(250.0f, 50.0f);glEnd();//画线结束glBegin(GL_TRIANGLES);//开始画三角形,注意,没有设颜色,所以还是红色glVertex2f(400.0f, 100.0f);//三角形的三个顶点glVertex2f(600.0f, 100.0f);glVertex2f(500.0f, 300.0f);glEnd();//结束画三角形glFlush();//开始绘制}//在窗口改变大小时调用void reshape(int width, int height){glViewport(0, 0, width, height);//设置视口glMatrixMode(GL_PROJECTION);//设置当前为投影变换模式glLoadIdentity();//用单位矩阵替换当前变换矩阵gluOrtho2D(0.0, width, 0.0, height);//设置正交投影视图体}//处理键盘void keyboard(unsigned char key, int x, int y){switch (key){case 27://esc键退出exit(0);break;default:break;}}int main(int argc, char** argv){glutInit(&argc, argv);//初始化glutglutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//设置为单缓存,RGB模式glutInitWindowSize(640, 480); //设置窗口大小glutInitWindowPosition(0, 0);//设置窗口起始位置glutCreateWindow("Basic");//设置窗口标题init();//初始化OpenGLglutDisplayFunc(display);//设置显示回调函数glutReshapeFunc(reshape);//设置reshape回调函数glutKeyboardFunc(keyboard);//设置键盘回调函数glutMainLoop();//进入主循环return 0;}//代码要有详细的注释。
计算机图形学实习全部代码 View调用

// GraphicsView.cpp : CGraphicsView 类的实现//#include "stdafx.h"// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的// ATL 项目中进行定义,并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS#include "Graphics.h"#endif#include "GraphicsDoc.h"#include "GraphicsView.h"#include <cmath>#ifdef _DEBUG#define new DEBUG_NEW#endif// CGraphicsViewIMPLEMENT_DYNCREATE(CGraphicsView, CView)BEGIN_MESSAGE_MAP(CGraphicsView, CView)// 标准打印命令ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CGraphicsView::OnFilePrintPreview) ON_WM_CONTEXTMENU()ON_WM_RBUTTONUP()ON_COMMAND(ID_32771, &CGraphicsView::OnDDA)ON_COMMAND(ID_32772, &CGraphicsView::OnMidline)ON_COMMAND(ID_32773, &CGraphicsView::On32773)ON_COMMAND(ID_32774, &CGraphicsView::OncircleMid)ON_COMMAND(ID_32775, &CGraphicsView::ONddacircle)ON_COMMAND(ID_32776, &CGraphicsView::OnBresenhamcircle)ON_COMMAND(ID_32777, &CGraphicsView::OnMidEllipse)ON_COMMAND(ID_32778, &CGraphicsView::Onlugrange)ON_COMMAND(ID_32779, &CGraphicsView::OnScanLineseed)ON_COMMAND(ID_32780, &CGraphicsView::Ontranslation)ON_COMMAND(ID_32781, &CGraphicsView::Onrotation)ON_COMMAND(ID_32782, &CGraphicsView::Onscaling)ON_COMMAND(ID_32783, &CGraphicsView::OnBezier)ON_COMMAND(ID_32784, &CGraphicsView::OnSeedfilledALg) END_MESSAGE_MAP()// CGraphicsView 构造/析构CGraphicsView::CGraphicsView(){// TODO: 在此处添加构造代码}CGraphicsView::~CGraphicsView(){}BOOL CGraphicsView::PreCreateWindow(CREATESTRUCT& cs){// TODO: 在此处通过修改// CREATESTRUCT cs 来修改窗口类或样式return CView::PreCreateWindow(cs);}// CGraphicsView 绘制//Bezier曲线的混合函数////////////double b03(double t)//{return(pow(1-t,3)); }//double b13(double t)//{return(3*t*pow(1-t,2));}////double b23(double t)//{return(3*(1-t)*t*t);}////double b33(double t)//{return(t*t*t);}#include "SeqStack.h"void CGraphicsView::OnDraw(CDC*pDC){CGraphicsDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;//pDC->MoveTo(100,100);//pDC->LineTo(300,300);// pDC->MoveTo(300,300);//pDC->LineTo(200,300);// pDC->MoveTo(200,300);//pDC->LineTo(100,100);//// TODO: 在此处为本机数据添加绘制代码// SeqStack<POINT> sta;// POINT s[100000];//int i=0;// s[i].x=150;//s[i].y=160;//int m,n;//sta.Push(s[i]);//起始点入栈//// while(!sta.IsEmpty())// {// sta.Pop(s[i]);// m=s[i].x;// n=s[i].y;// if(pDC->GetPixel(m,n)!=RGB(0,0,0) )// {// pDC->SetPixel(m,n,RGB(0,0,0));// i++;// }// if(pDC->GetPixel(m+1,n)!=RGB(0,0,0) ) // {// s[i].x=m+1;// s[i].y=n;// sta.Push(s[i]);// i++;// }// if(pDC->GetPixel(m-1,n)!=RGB(0,0,0))// {// s[i].x=m-1;// s[i].y=n;// sta.Push(s[i]);// i++;// }// if(pDC->GetPixel(m,n+1)!=RGB(0,0,0) )// {// s[i].x=m;// s[i].y=n+1;// sta.Push(s[i]);// i++;// }// if(pDC->GetPixel(m,n-1)!=RGB(0,0,0))// {// s[i].x=m;// s[i].y=n-1;// sta.Push(s[i]);// }//}}// CGraphicsView 打印void CGraphicsView::OnFilePrintPreview(){#ifndef SHARED_HANDLERSAFXPrintPreview(this);#endif}BOOL CGraphicsView::OnPreparePrinting(CPrintInfo* pInfo){// 默认准备return DoPreparePrinting(pInfo);}void CGraphicsView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: 添加额外的打印前进行的初始化过程}void CGraphicsView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: 添加打印后进行的清理过程}void CGraphicsView::OnRButtonUp(UINT /* nFlags */, CPoint point){ClientToScreen(&point);OnContextMenu(this, point);}void CGraphicsView::OnContextMenu(CWnd* /* pWnd */, CPoint point){#ifndef SHARED_HANDLERStheApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);#endif}// CGraphicsView 诊断#ifdef _DEBUGvoid CGraphicsView::AssertValid() const{CView::AssertValid();}void CGraphicsView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CGraphicsDoc* CGraphicsView::GetDocument() const // 非调试版本是内联的{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGraphicsDoc)));return (CGraphicsDoc*)m_pDocument;}#endif //_DEBUG// CGraphicsView 消息处理程序void CGraphicsView::OnDDA(){CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC); //设置坐标系pDC-> SetViewportOrg(100,100);obj.DDA(100,100,200,200,pDC);ReleaseDC(pDC);// TODO: 在此添加命令处理程序代码}void CGraphicsView::OnMidline(){CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC); //设置坐标系pDC-> SetViewportOrg(0,100);obj.mpline(100,100,200,200,pDC);ReleaseDC(pDC);// TODO: 在此添加命令处理程序代码}void CGraphicsView::On32773(){CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC);//该函数设置指定设备环境的映射方式,映射方式定义了将逻辑单位转换为设备单位的度量单位,并定义了设备的X、Y轴的方向pDC-> SetViewportOrg(500,200);//pDC->SetWindowOrg(100,100);obj.Bresenham(100,100,200,200,pDC);ReleaseDC(pDC);// TODO: 在此添加命令处理程序代码}void CGraphicsView::OncircleMid(){CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC);pDC-> SetViewportOrg(500,200);obj.circleMidpoint(10,100,300,pDC);ReleaseDC(pDC);// TODO: 在此添加命令处理程序代码}////////////////dda画圆算法//////////////////////// void CGraphicsView::ONddacircle(){// TODO: 在此添加命令处理程序代码CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC);pDC-> SetViewportOrg(500,200);obj.ddacircle(10,100,500,pDC);ReleaseDC(pDC);}void CGraphicsView::OnBresenhamcircle(){// TODO: 在此添加命令处理程序代码CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC);pDC-> SetViewportOrg(500,200);obj.Bresenham_Circle(100,pDC);ReleaseDC(pDC);}void CGraphicsView::OnMidEllipse(){// TODO: 在此添加命令处理程序代码CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC);pDC-> SetViewportOrg(500,200);obj.ellipseMidpoint( 20,100,100, 200,pDC);ReleaseDC(pDC);}void CGraphicsView::Onlugrange(){// TODO: 在此添加命令处理程序代码CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC);pDC-> SetViewportOrg(500,200);int xa[4]={100,50,280,400};int ya[4]={100,150,280,400};int za[4]={100,150,280,400};int k=4,l_section=40;obj.Lugrange( xa, ya,za, k, l_section,pDC);ReleaseDC(pDC);}void CGraphicsView::OnScanLineseed(){// TODO: 在此添加命令处理程序代码CDC*pDC=GetDC();Geo obj(pDC);/*pDC-> SetMapMode(MM_LOMETRIC);pDC-> SetViewportOrg(500,400);*///obj.ScanLineSeedFill(150,160,pDC);//obj.ScanLineSeedFill(400,600-200,pDC);obj.ScanLineSeedFill(101,200,pDC);ReleaseDC(pDC);}void CGraphicsView::Ontranslation(){// TODO: 在此添加命令处理程序代码CDC* pDC = GetDC();Geo obj(pDC);obj.Algorithm1(100,100,200,200,RGB(255,0,0),pDC);obj.Algorithm2(100,100,200,200,RGB(255,0,0),pDC);ReleaseDC(pDC);}void CGraphicsView::Onrotation(){// TODO: 在此添加命令处理程序代码CDC* pDC = GetDC();Geo obj(pDC);obj.Algorithm3(100,100,200,200,RGB(255,0,0),pDC);ReleaseDC(pDC);}void CGraphicsView::Onscaling(){// TODO: 在此添加命令处理程序代码CDC* pDC = GetDC();Geo obj(pDC);obj.Algorithm4(100,100,200,200,RGB(255,0,0),pDC);ReleaseDC(pDC);}void CGraphicsView::OnBezier(){// TODO: 在此添加命令处理程序代码CDC *pDC=GetDC();pDC-> SetMapMode(MM_LOMETRIC);pDC-> SetViewportOrg(150,600);Geo obj(pDC);obj.Bezier(pDC);ReleaseDC(pDC);}void CGraphicsView::OnSeedfilledALg(){// TODO: 在此添加命令处理程序代码CDC *pDC=GetDC();//pDC-> SetMapMode(MM_LOMETRIC);//pDC-> SetViewportOrg(150,600);Geo obj(pDC);obj.SeedFiled(pDC);ReleaseDC(pDC);}。
计算机图形学实验报告,DOC

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);//定义显示列表
glVertex2f(x,y);
if(d<0)d+=2*x+3;
else{
d+=2*(x-y)+5;
y--;
}
x++;
}
glEnd();
}
voiddisplay()
{
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT);
winWidth=newWidth;
winHeight=newHeight;
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glBegin(GL_POINTS);
glVertex2i(int(x+0.5),(int)(y+0.5));
glEnd();
x+=xIncre;
y+=yIncre;
}
}
voidDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
计算机图形学实验_透视茶壶源代码

glScalef(sx,sy,sz);
Draw_Scene();
if(bAnim)
fRotate+=0.3f;
//todo hint:when you want to rotate the teepot you may like to add another line here =
case 'c':{center[1]=center[1]-1;break;}
case 'r':{center[0]=0;center[1]=0;center[2]=0;};//恢复原状
//茶壶相关操作
case 'j':{tx++;break;}
case 'l':{tx--;break;}
case 'i':{ty++;break;}
glMatrixMode(GL_PROJECTION);//select the projection matrix
glLoadIdentity();//reset the projection matrix
float whRatio=(GLfloat)width/(GLfloat)height;
if(bPersp)
float center[]={0,0,0};
//todo:hint:you may need another array when you operate the teapot
void key(unsigned char k,int x,int y)
{
switch(k)
{
case 27:
《计算机图形学》实验指导书

计算机图形学实验指导书袁科计算机技术实验中心目录实验一实现DDA、中点画线算法和Bresenham画线算法 (24)实验二实现Bezier曲线 (25)实验三实现B样条曲线 (26)实验四实现多边形填充的边界标志算法 (27)实验五实现裁剪多边形的Cohen-Sutherland算法 (28)实验六二维图形的基本几何变换 (30)实验七画图软件的编制 (31)实验一实现DDA、中点画线算法和Bresenham画线算法【实验目的】1、掌握直线的多种生成算法;2、掌握二维图形显示原理。
【实验环境】VC++6.0/ BC【实验性质及学时】验证性实验,2学时,必做实验【实验内容】利用任意的一个实验环境,编制源程序,分别实现直线的三种生成算法,即数字微分法(DDA)、中点画线法以及Bresenham画线算法。
【实验原理】1、数字微分法(Digital Differential Analyzer,DDA)算法思想:基于直线的微分方程来生成直线。
ε=1/max(|△x|,|△y|)max(|△x|,|△y|)=|△x|,即|k|≤1 的情况:max(|△x|,|△y|)=|△y|,此时|k|≥1:2、中点画线法算法思想:每次在最大位移方向上走一步,另一方向是否走步取决于误差项的判断。
3、Bresenham画线算法算法思想:其基本思想同中点算法一样,即每次在最大位移方向上走一步,而另一个方向是否走步取决于误差项的判断。
【实验要求】1.上交源程序;2.上交实验报告,实验报告内容如下:(1) 实验名称(2) 实验目的(3) 算法实现的设计方法及程序流程图(4) 程序结果分析【分析与思考】(1) 上述所阐述的三个算法,其基本算法只能适用于直线的斜率(|K|<=1) 的情形,如何将上述算法进行推广,使其能够处理任意斜率的直线?(2) 计算机显示屏幕的坐标圆心在哪里,与我们平时的习惯有什么差异,如何协调二者?实验二 实现Bezier 曲线【实验目的】1、掌握Bezier 曲线的定义;2、能编程实现N 次Bezier 曲线的绘制与显示。
计算机图形学-3D机器人实验代码和截图

学院名称 课程名称
年级、专 业、班 实验项目 计算机图形学 名称
学 号3D ຫໍສະໝຸດ 器人姓 同组姓名名 指导 教师
实验类型
验证 √
综合 □
设计 □
创新 □ 成绩
教师 评语
教师签名:
年月日
实验报告内容一般包括以下几个内容:1、目的要求 2、仪器用具及材料(仪器名称及主要规格、用具名称) 3、实验内容及原理(简 单但要抓住要点,写出依据原理) 4、操作方法与实验步骤 5、数据图表格(照片) 6、实验过程原始记录 7 数据处理及结果(按 实验要求处理数据、结论) 8、作业题 9、讨论(对实验中存在的问题、进一步的想法等进行讨论)
}
int main(int argc, char** argv) {
//初始化 glutInit(&argc, argv); //设置显示模式 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //初始化窗口大小 glutInitWindowSize(500, 500); //定义左上角窗口位置 glutInitWindowPosition(100, 100); //创建窗口 glutCreateWindow(argv[0]); //初始化 init(); //显示函数 glutDisplayFunc(display); //窗口大小改变时的响应 glutReshapeFunc(reshape); //鼠标点击事件,鼠标点击或者松开时调用 glutMouseFunc(mouseClick); //鼠标移动事件,鼠标按下并移动时调用 glutMotionFunc(mouseMove); //键盘事件 glutKeyboardFunc(keyPressed); //循环 glutMainLoop(); return 0; } (2)实验截图:
计算机图形学代码

四、实验结果抓图与分析1、目标的平移的源程序2、绕任意点旋转的源程序实验一、直线的生成一、实验内容根据提供的程序框架,修改部分代码,完成画一条直线的功能(中点画线法或者Bresenham画线法任选一),只要求实现在第一象限内的直线。
二、算法原理介绍双击直线生成.dsw打开给定的程序,或者先启动VC++,文件(file)→打开工作空间(open workspace)。
打开直线生成view.cpp,按注释改写下列函数:1.void CMyView::OnDdaline() (此为DDA生成直线)2.void CMyView::OnBresenhamline()(此为Bresenham画直线)3.void CMYView::OnMidPointLine()(此为中点画线法)三、程序源代码1.DDA生成直线画法程序:float x,y,dx,dy,k;dx=(float)(xb-xa);dy=(float)(yb-ya);k=dy/dx;x=xa;y=ya;if(abs(k)<1){for (x=xa;x<=xb;x++){pdc->SetPixel(x, int(y+0.5),COLOR);y=y+k;}}if(abs(k)>=1){for(y=ya;y<=yb;y++){pdc->SetPixel(int(x+0.5),y,COLOR);x=x+1/k;}}//DDA画直线结束}2.Bresenham画直线源程序:float b,d,xi,yi;int i;float k;k=(yb-ya)/(xb-xa);b=(ya*xb-yb*xa)/(xb-xa);if(k>0&&k<=1)for(i=0;i<abs(xb-xa);i++){ d=ya+0.5-k*(xa+1)-b;if(d>=0){ xi=xa+1;yi=ya;xa++;ya=ya+0.5;}if(d<0){ xi=xa+1;yi=ya+1;xa++;ya=ya+1.5;}pdc->SetPixel(xi,yi,COLOR); }//BresenHam画直线结束}3.中点画线法源程序:float b,d,xi,yi;int i;float k;k=(yb-ya)/(xb-xa);b=(ya*xb-yb*xa)/(xb-xa);if(k>0&&k<=1)for(i=0;i<abs(xb-xa);i++){ d=ya+0.5-k*(xa+1)-b;if(d>=0){ xi=xa+1;yi=ya;xa++;ya=ya+0.5;}if(d<0){ xi=xa+1;yi=ya+1;xa++;ya=ya+1.5;}pdc->SetPixel(xi,yi,COLOR); }//BresenHam画直线结束}四、实验结果抓图与分析1、DDA生成直线2、Bresenham画直线3、中点画线法实验二、bresenham画圆一、实验内容根据提供的程序框架,修改部分代码,用Bresenham画法画一段圆弧或者画圆。
计算机图形学 实验一:生成彩色立方体(含源代码)

实验一实验目的:生成彩色立方体实验代码://ColorCube1.javaimport java.applet.Applet; //可以插入htmlimport java.awt.BorderLayout; //窗口采用BorderLayout方式布局import com.sun.j3d.utils.applet.MainFrame; //applicationimport com.sun.j3d.utils.geometry.ColorCube;//调用生成ColorCube的Utility import com.sun.j3d.utils.geometry.Primitive;import com.sun.j3d.utils.universe.*; //观测位置的设置import javax.media.j3d.*; //核心类import javax.vecmath.*; //矢量计算import com.sun.j3d.utils.behaviors.mouse.*;public class ColorCube1 extends Applet {public BranchGroup createSceneGraph() {BranchGroup objRoot=new BranchGroup();//BranchGroup的一个对象objRoot(放置背景、灯光)BoundingSphere bounds=new BoundingSphere(newPoint3d(0.0,0.0,0.0),100.0);//有效范围TransformGroup objTrans=new TransformGroup();objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);objRoot.addChild(objTrans);MouseRotate behavior = new MouseRotate();behavior.setTransformGroup(objTrans);objRoot.addChild(behavior);behavior.setSchedulingBounds(bounds);MouseZoom behavior2 = new MouseZoom();behavior2.setTransformGroup(objTrans);objRoot.addChild(behavior2);behavior2.setSchedulingBounds(bounds);MouseTranslate behavior3 = new MouseTranslate();behavior3.setTransformGroup(objTrans);objRoot.addChild(behavior3);behavior3.setSchedulingBounds(bounds);Color3f bgColor=new Color3f(0.0f,0.0f,0.0f);//背景颜色Background bg=new Background(bgColor);bg.setApplicationBounds(bounds);objRoot.addChild(bg);Color3f directionalColor=new Color3f(1.f,1.f,1.f);Vector3f vec=new Vector3f(1.f,1.f,-1.0f);DirectionalLight directionalLight=new DirectionalLight(directionalColor,vec);directionalLight.setInfluencingBounds(bounds);objRoot.addChild(directionalLight);Appearance app=new Appearance();//外观材质Material material=new Material();//圆锥颜色//material.setEmissiveColor(new Color3f(1.0f,1.0f,0.0f));material.setDiffuseColor(new Color3f(1.0f,1.0f,0.0f));//辐射光效果app.setMaterial(material);ColorCube cone=new ColorCube(0.2);objTrans.addChild(cone);//pile();return objRoot;}public ColorCube1() {setLayout(new BorderLayout());Canvas3D c=new Canvas3D(null);add("Center",c);BranchGroup scene=createSceneGraph();SimpleUniverse u=new SimpleUniverse(c);u.getViewingPlatform().setNominalViewingTransform();u.addBranchGraph(scene);}public static void main(String[] args) {new MainFrame(new ColorCube1(),400,300);}}运行截图:。
计算机图形学实验报告及代码

九、作业
课后习题
十、本章小结
在本章中,对计算机图形学的基本概念和研究内容进行了概述,对发展概况和应用领域进行了说明。
第2章计算机图形系统
一、教学目标
通过对本章的学习,要求熟悉计算机图形系统的组成/各种图形显示器、图形输入/输出设备。
二、教学要求
1、了解计算机图形系统的组成;
(5).计算机网络
计算机网络是指将上述四类计算机平台,或者其中某一类通过某种互联技术彼此连接,按照某种通信协议进行数据传输、数据共享、数据处理的多机工作环境。
它的特点是多种计算机相连,可以充分发挥各个机器的性能和特点,以达到很高的性能价格比。
网络图形系统要考虑的关键问题是网络服务器的性能,图形数据的通信、传输、共享以及图形资源的利用问题。
(3).中、小型计算机
一般在特定的部门、单位和应用领域中采用此类环境。它是大型信息系统建立的重要环境,这种环境中信息和数据的处理量是很大的,要求机器有极高的处理速度和极大的存储容量。
(4).大型机
以大型计算机为基础,具有容量庞大的存储器和极强的计算功能,大量的显示终端及
高精度、大幅面的硬拷贝设备。还往往拥有自行开发的、功能齐全的应用软件系统。例如,美国第三大汽车公司(CHRYSLER汽车公司)就拥有庞大的计算机系统来进行计算机辅助设计、实体造型、结构分析、运动模拟、工程和科学计算、项目管理、生产过程控制等。
1.1计算机图形学的研究内容
计算机图形表现形式
(1).线条式(线框架图)
用线段来表现图形,容易反映客观实体的内部结构,如各类工程技术中结构图的表示,机械设计中零件结构图及电路设计中的电路原理图等。具有面模型、色彩、浓淡和明暗层次效应,适合表现客观实体的外形或外貌,如汽车、飞机、轮船等的外形设计以及各种艺术品造型设计等。
计算机图形学opengl动画的实现源代码

实验目的:
在VC6.0的opengl的环境下,实现固定物体的连续变化,从而使简单动画得以实现。
实验思想:
由于是简单图形的变化过程,所以问题关键在于:
1、物体的位置变化如何实现,而位置变化在opengl中体现在坐标的变化中,因而设置坐标的每一步物体的位置变化情况是该问题的关键,此关键代码如下:
wAngleX += 1.0f;
wAngleY += 10.0f;
wAngleZ += 5.0f;
2、再有就是如何使得连续的变化得以实现,这就实现了手动变化相自动变化的转变,为了实现这一问题,我们想到设置一个变化时间,使得物体在每个时间段变换一次位置,当这个时间适当小时,就实现了物体的连续变化;这就需要引进一个计时器,通过设置间隔时间实现物体的连续变化,此关键代码如下:
SetTimer(1, 150, NULL);
实验步骤:
1、初始化OpenGL。
2、设置菜单与关联函数初始化,设置视口与窗口匹配,重新设置坐标系统。
3、建立正交变换下的剪切体(即变换物体)。
4、编写变换幅度函数,设置没不变换情况。
5、编写连续变换计时器,使得在一定间隔下连续变换。
实验关键代码:
实验结果:。
计算机图形学OpenGL版实验1-4

实验1 OpenGL初识一、实验目的:熟悉编程环境;了解光栅图形显示器的特点;了解计算机绘图的特点;利用VC+OpenGL作为开发平台设计程序,以能够在屏幕上生成任意一个像素点为本实验的结束。
二、实验内容:(1)了解和使用VC的开发环境,理解简单的OpenGL程序结构。
(2)掌握OpenGL提供的基本图形函数,尤其是生成点的函数。
三、该程序的作用是在一个黑色的窗口中央画一个矩形、三角形和三个点,如图所示。
下面对各行语句进行说明:首先,需要包含头文件#include <GL/glut.h>,这是GLUT的头文件。
然后看main函数。
int main(int argc, char *argv[]),这个是带命令行参数的main函数。
这种以glut开头的函数都是GLUT工具包所提供的函数,下面对用到的几个函数进行介绍;1)glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。
其格式比较固定,一般都是glutInit(&argc, argv)就行;2) glutInitDisplayMode,设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。
GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。
更多信息,以后的实验教程会有讲解介绍;3) glutInitWindowPosition,设置窗口在屏幕中的位置;4) glutInitWindowSize,设置窗口的大小;5) glutCreateWindow,根据前述设置的信息创建窗口。
参数将被作为窗口的标题。
注意:窗口被创建后,并不立即显示到屏幕上。
需要调用glutMainLoop才能看到窗口;6) glutDisplayFunc,设置一个函数,当需要进行画图时,这个函数就会被调用。
(暂且这样理解);7) glutMainLoop,进行一个消息循环。
计算机图形学实验报告及代码

计算机图形学实验报告及代码第 1 章概述一、教学目标通过本章的学习,使学生能够了解计算机图形学的基本概念、研究内容;当前的发展概况;本门课程的特点和应用。
二、教学要求1.了解计算机图形学的概念和研究内容;2.了解本门课程的发展概况。
三、教学内容提要1. 计算机图形学的研究内容2. 计算机图形学发展概况3. 计算机图形学特点和应用4. 计算机图形学当前研究的课题5. 计算机图形生成和输出的流水线四、教学重点、难点及解决方法本章将主要围绕计算机图形学的基本概念进行介绍,介绍研究内容;当前的发展概况;本门课程的特点和应用等等。
五、课时安排2学时六、教学设备多媒体七、检测教学目标实现程度的具体措施和要求通过课堂提问的方式来检测学生对基本概念的掌握程度。
八、教学内容1.1 计算机图形学的研究内容计算机图形学(Computer Graphics): 研究通过计算机将数据转换为图形,并在专用显示设备上显示的原理、方法和技术的学科。
计算机图形表现形式(1).线条式(线框架图)用线段来表现图形,容易反映客观实体的内部结构,如各类工程技术中结构图的表示,机械设计中零件结构图及电路设计中的电路原理图等。
具有面模型、色彩、浓淡和明暗层次效应,适合表现客观实体的外形或外貌,如汽车、飞机、轮船等的外形设计以及各种艺术品造型设计等。
(2).真实感面模型图形跑车靓照计算机图形分类(空间)(1).二维图形(2D):在平面坐标系中定义的图形(2).三维图形(3D):在三维坐标系中定义的图形计算机图形产生方法(1).矢量法(短折线法)任何形状的曲线都用许多首尾相连的短直线(矢量)逼近。
(2).描点法(像素点串接法)每一曲线都是由一定大小的像素点组成计算机绘图方式:(1)交互式绘图允许操作者以某种方式(对话方式或命令方式)来控制和操纵图形生成过程,使得图形可以边生成、边显示、边修改,直至符合要求为止。
如AUTOCAD等(2)被动式绘图图形在生成过程中,操作者无法对图形进行操作和控制。
计算机图形学部分代码

一、使用MFC AppWizard(exe)生成直线应用程序的框架画直线:(下面红色部分是我们要添加的代码)详见课本P75-76页法一、中点画直线法(1)主代码:void MPline(int x1,int y1,int x2,int y2,int color,CDC* pDC){int x,y,a,b,d,d1,d2;a=y2-y1;b=x2-x1;y=y1;d=2*a+b;d1=2*a;d2=2*(a+b);pDC->SetPixel(x,y,color);for(x=x1;x<=x2;x++){if(d<0){y++;d+=d2;}else{d+=d1;}pDC->SetPixel(x,y,color);// for (i=-2;i<=2;i++) //详见课本P126页// for (j=-2;j<=2;j++)// pDC->SetPixel(x+i,y+j,color);}}void CLineView::OnDraw(CDC* pDC){CLineDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);int i,j,x1=450,y1=300,x2=1000,y2=300,color=RGB(255,128,0);MPline(x1, y1, x2,y2,color,pDC);(2)代码运行图:法二、Bresenham算法绘制直线(1)、主要代码void BHline(int x1,int y1,int x2,int y2,int color,CDC* pDC) {int x,y,dx,dy,dk;dx=x2-x1;dy=y2-y1;dk=2*dy-dx;y=y1;for(x=x1;x<=x2;x++){pDC->SetPixel(x,y,color); // for (i=-2;i<=2;i++)// for (j=-2;j<=2;j++)// pDC->SetPixel(x+i,y+j,color);dk=dk+2*dy;if(dk>=0){y++;dk=dk-2*dx;}}}void CLineView::OnDraw(CDC* pDC){CLineDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);int i,j,x1=300,y1=100,x2=1000,y2=300,color=RGB(0,175,255);BHline(x1, y1, x2,y2+500,color,pDC);(2)代码运行图:法三、数值微分法DDALine()算法画直线(1)主要代码void DDLine(int x1,int y1,int x2, int y2,int color,CDC *pDC){int x;float k,y=y1;k=(y2-y1)/(x2-x1);for(x=x1;x<=x2;x++){pDC->SetPixel(x,int(y+0.5),color); // for (i=-2;i<=2;i++)// for (j=-2;j<=2;j++)// pDC->SetPixel(x,int(y+0.5),color);y=y+k;}}void CLineView::OnDraw(CDC* pDC){CLineDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);int i,j,x1=450,y1=300,x2=1000,y2=300,color=RGB(0,0,255);DDLine(x1,y1,x2, y2,color,pDC);(2)代码运行图二、使用MFC AppWizard(exe)生成直线应用程序的框架画直线:法一:中点画圆法(其中红色部分是我们要添加的的代码)void MidpointCircle(CDC *pdc,int x0,int y0,int r,int color){int x,y;float d;x=0;y=r;d=1.25-r;pdc->SetPixel(x0+x,y0-y,color);while(x<=y){x++;if(d<0){d+=2*x+3;}else{y--;d+=2*(x-y)+5;}pdc->SetPixel(x0+x,y0-y,color); pdc->SetPixel(x0-x,y0-y,color);pdc->SetPixel(x0+x,y0+y,color); pdc->SetPixel(x0-x,y0+y,color);pdc->SetPixel(x0+y,y0-x,color); pdc->SetPixel(x0-y,y0-x,color);pdc->SetPixel(x0+y,y0+x,color); pdc->SetPixel(x0-y,y0+x,color);}}void CCilView::OnDraw(CDC* pDC){CCilDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);int x0,y0;x0=138,y0=138;int r=100;int color=RGB(255,0,255);CClientDC dc(this);MidpointCircle(&dc,x0,y0,r,color);// TODO: add draw code for native data here}法二、Bresenham画圆法(缺货中······)void BresenhamCircle(int R,CDC *pDC){int x0,y0,x,y,p;x0=200;y0=200;x = x0;y=y0 + R;p=3-2*R;for(;x<=y;x++){pDC->SetPixel(x,y,RGB(255,0,0));pDC->SetPixel(x,2*y0-y,RGB(255,0,0)); pDC->SetPixel(y,x,RGB(255,0,0));pDC->SetPixel(2*y0-y,x,RGB(255,0,0)); pDC->SetPixel(2*x0-x,y,RGB(255,0,0)); pDC->SetPixel(y,2*x0-x,RGB(255,0,0)); pDC->SetPixel(2*x0-x,2*y0-y,RGB(255,0,0)); pDC->SetPixel(2*y0-y,2*x0-x,RGB(255,0,0)); if(p>=0){p+=4*(x-y)+10;y--;}else{p+=4*(x-x0)+6;}}}void CCilView::OnDraw(CDC* pDC){CCilDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here BresenhamCircle(50,pDC);}。
三维图形的生成计算机图形学源代码及报告

实验报告《计算机图形学》课题:三维图形的生成指导教师:***2013年5月三维图形的生成一.目的1.加深对计算机图形学的理解。
2.熟悉Visual C++ OpenGL的编程方法。
3.学习用编程方法绘制三维图形。
二.实验原理V oid CALLBACK display(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,1.0,1.0);glLoadIdentity();glTranslatef(0.0,0.0,-5.0);glScalef(1.0,2.0,1.0);auxWireCube(1.0);glFlush();} //画图void CALLBACK stepDisplay(void){r tri+=0.01;d isplay();}void CALLBACK myReshape(GLsizei w,GLsizei h){g lMatrixMode(GL_PROJECTION);g lLoadIdentity();g lFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);g lMatrixMode(GL_MODELVIEW);g lViewport(0,0,w,h);} //旋转三.实验步骤1.复习OpenGL语言。
2.编写图形生成程序,分析绘制结果。
四.实验内容#include<gl/glaux.h>#pragma comment(lib,"glaux.lib")#pragma comment(lib,"opengl32.lib")#pragma comment(lib,"glu32.lib")GLfloat rtri=0;1void myinit(void){glShadeModel(GL_SMOOTH);}void CALLBACK display(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存glLoadIdentity(); // 重置模型观察矩阵glTranslatef(-1.5,0.0,-6.0); // 左移1.5 单位,并移入屏幕6.0 glRotatef(rtri,0.0,1.0,0.0); // 绕Y轴旋转正方体glBegin(GL_TRIANGLES); // 开始绘制金字塔的各个面glColor3f(1.0f,0.0f,0.0f); // 红色glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上顶点(前侧面)glColor3f(0.0f,1.0f,0.0f); // 绿色glVertex3f(-1.0f,-1.0f, 1.0f); // 三角形的左下顶点(前侧面)glColor3f(0.0f,0.0f,1.0f); // 蓝色glVertex3f( 1.0f,-1.0f, 1.0f); // 三角形的右下顶点(前侧面)glColor3f(1.0f,0.0f,0.0f); // 红色glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上顶点(右侧面)glColor3f(0.0f,0.0f,1.0f); // 蓝色glVertex3f( 1.0f,-1.0f, 1.0f); // 三角形的左下顶点(右侧面)glColor3f(0.0f,1.0f,0.0f); // 绿色glVertex3f( 1.0f,-1.0f, -1.0f); // 三角形的右下顶点(右侧面)glColor3f(1.0f,0.0f,0.0f); // 红色glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上顶点(后侧面)glColor3f(0.0f,1.0f,0.0f); // 绿色glVertex3f( 1.0f,-1.0f, -1.0f); // 三角形的左下顶点(后侧面)glColor3f(0.0f,0.0f,1.0f); // 蓝色glVertex3f(-1.0f,-1.0f, -1.0f); // 三角形的右下顶点(后侧面)glColor3f(1.0f,0.0f,0.0f); // 红色glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上顶点(左侧面)glColor3f(0.0f,0.0f,1.0f); // 蓝色glVertex3f(-1.0f,-1.0f,-1.0f); // 三角形的左下顶点(左侧面)glColor3f(0.0f,1.0f,0.0f); // 绿色glVertex3f(-1.0f,-1.0f, 1.0f); // 三角形的右下顶点(左侧面)glEnd();2glTranslatef(0.0f,0.0f,-7.0f); // 先右移再移入屏幕glRotatef(rtri,0.0f,1.0f,0.0f); // 在XYZ轴上旋转立方体glBegin(GL_QUADS); // 开始绘制立方体glColor3f(0.0f,1.0f,0.0f); // 颜色改为蓝色glVertex3f( 1.0f, 1.0f,-1.0f); // 四边形的右上顶点(顶面) glVertex3f(-1.0f, 1.0f,-1.0f); // 四边形的左上顶点(顶面) glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左下顶点(顶面) glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右下顶点(顶面)glColor3f(1.0f,0.5f,0.0f); // 颜色改成橙色glVertex3f( 1.0f,-1.0f, 1.0f); // 四边形的右上顶点(底面) glVertex3f(-1.0f,-1.0f, 1.0f); // 四边形的左上顶点(底面) glVertex3f(-1.0f,-1.0f,-1.0f); // 四边形的左下顶点(底面) glVertex3f( 1.0f,-1.0f,-1.0f); // 四边形的右下顶点(底面)glColor3f(1.0f,0.0f,0.0f); // 颜色改成红色glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右上顶点(前面) glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左上顶点(前面) glVertex3f(-1.0f,-1.0f, 1.0f); // 四边形的左下顶点(前面) glVertex3f( 1.0f,-1.0f, 1.0f); // 四边形的右下顶点(前面)glColor3f(1.0f,1.0f,0.0f); // 颜色改成黄色glVertex3f( 1.0f,-1.0f,-1.0f); // 四边形的右上顶点(后面) glVertex3f(-1.0f,-1.0f,-1.0f); // 四边形的左上顶点(后面) glVertex3f(-1.0f, 1.0f,-1.0f); // 四边形的左下顶点(后面) glVertex3f( 1.0f, 1.0f,-1.0f); // 四边形的右下顶点(后面)glColor3f(0.0f,0.0f,1.0f); // 颜色改成蓝色glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的右上顶点(左面) glVertex3f(-1.0f, 1.0f,-1.0f); // 四边形的左上顶点(左面) glVertex3f(-1.0f,-1.0f,-1.0f); // 四边形的左下顶点(左面) glVertex3f(-1.0f,-1.0f, 1.0f); // 四边形的右下顶点(左面)glColor3f(1.0f,0.0f,1.0f); // 颜色改成紫罗兰色glVertex3f( 1.0f, 1.0f,-1.0f); // 四边形的右上顶点(右面) glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的左上顶点(右面) glVertex3f( 1.0f,-1.0f, 1.0f); // 四边形的左下顶点(右面) glVertex3f( 1.0f,-1.0f,-1.0f); // 四边形的右下顶点(右面)glEnd(); // 立方体绘制结束3glFlush();}void CALLBACK stepDisplay(void){rtri+=0.01;display();}void CALLBACK myReshape(GLsizei w,GLsizei h) {glMatrixMode(GL_PROJECTION); glLoadIdentity();glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0); glMatrixMode(GL_MODELVIEW);glViewport(0,0,w,h);}int main(int argc,char** argv){auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); auxInitPosition(0,0,500,500);auxInitWindow("bianhuan");myinit();auxReshapeFunc(myReshape);auxIdleFunc(stepDisplay);auxMainLoop(display);}4五.实验结果:六.实验小结:通过这次实验,更深刻的学习了计算机图形学的编程语言,对于OpenGL的了解更一步。
《计算机图形学》课内实验报告(实验一)

PFNGLUNIFORM1FARBPROC glUniform1fARB;
PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
#ifndef __APPLE__
PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f;
{
GLbyte infoLog[MAX_INFO_LOG_SIZE];
glGetInfoLogARB(progObj, MAX_INFO_LOG_SIZE, NULL, infoLog);
fprintf(stderr, "Error in program linkage!\n");
fprintf(stderr, "Info log: %s\n", infoLog);
// Demonstrates high-level shaders
// Program by Benjamin Lipchak
#include "../../Common/OpenGLSB.h" // System and OpenGL Stuff
#include "../../Common/GLTools.h" // System and OpenGL Stuff
// Initially set the blink parameter to 1 (no flicker)
if (flickerLocation != -1)
glUniform1fARB(flickerLocation,1.0f);
// Program object has changed, so we should revalidate
计算机图形学实验报告代码

计算机图形学OpenGL实验指导书目录实验一:OpenGL基础知识 (1)实验二OpenGL中的建模与变换 (2)实验三OpenGL中的光照 (6)实验四OpenGL中的拾取 (9)实验五OpenGL中的纹理映射 (12)实验一:OpenGL基础知识一、实验目的1、建立Windows系统下的OpenGL实验框架。
2、学习理解OpenGL工作流程。
二、实验环境⒈硬件:每个学生需配备计算机一台。
⒉软件:Visual C++;三、实验内容1、建立非控制台的Windows程序框架。
2、建立OpenGL框架。
3、建立OpenGL框架的类文件。
4、完善Windows框架。
5、理解程序间的相互关系。
四、实验要求1、学习教材第2章的内容。
2、理解教材中相关实例的代码,按要求添加到适当的地方,调试并通过运行。
3、运行结果应该与教材中的相关实例相符。
4、编译第2章的框架代码,修改背景色、窗口标题。
五、程序设计提示(略)六、报告要求1.认真书写实验报告,字迹清晰,格式规范。
报告中应写清姓名、学号、实验日期、实验题目、实验目的、实验原理。
2.报告中应书写主要源程序,且源程序中要有注释。
3.报告中应包含运行结果及结果分析。
如调试通过并得到预期的效果,请注明…通过‟并粘贴运行效果图;如未调试通过或结果不正确,试分析原因。
4.报告最后包含实验总结和体会。
实验二OpenGL中的建模与变换一、实验目的1.学习配置OpenGL环境。
2.掌握在OpenGL中指定几何模型的方法。
3. 掌握OpenGL中的透视投影和正投影的设置方法,学会诊断投影问题导致的显示异常。
二、实验环境⒈硬件:每个学生需配备计算机一台。
⒉软件:Visual C++;三、实验内容1.建立OpenGL编程环境(注:Windows自带gl和glu,还需要安装glut库文件。
)(a)查看Windows自带的OpenGL文件。
在文件夹c:\windows\system32下查看是否存在文件opengl32.dll和glu32.dll;在Visual Studio的安装目录Vc7\PlatformSDK\Include\gl下查看是否存在gl.h和glu.h;在Vc7\PlatformSDK\Lib下是否存在opengl32.lib和glu32.lib。
计算机图形学实验C++代码

一、bresenham算法画直线#include<glut.h>#include<math.h>#include<stdio.h>void draw_pixel(int ix,int iy){glBegin(GL_POINTS);glVertex2i(ix,iy);glEnd();}void Bresenham(int x1,int y1,int xEnd,int yEnd) {int dx=abs(xEnd-x1),dy=abs(yEnd-y1);int p=2*dy-dx;int twoDy=2*dy,twoDyMinusDx=2*dy-2*dx;int x,y;if (x1>xEnd){x=xEnd;y=yEnd;xEnd=x1;}else{x=x1;y=y1;}draw_pixel(x,y);while(x<xEnd){x++;if(p<0)p+=twoDy;else{y++;p+=twoDyMinusDx;draw_pixel(x,y);}}}void display(){glClear(GL_COLOR_BUFFER_BIT);Bresenham(0,0,400,400);glFlush();}void myinit(){glClearColor(0.8,1.0,1.0,1.0);glColor3f(0.0,0.0,1.0);glPointSize(1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,500.0,0.0,500.0);}void main(int argc,char **argv ){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(200.0,200.0);glutCreateWindow("CG_test_Bresenham_Line example");glutDisplayFunc(display);myinit();glutMainLoop();}二、中点法绘制椭圆#include<glut.h>#include<math.h>#include<stdio.h>inline int round(const float a){return int (a+0.5);}void setPixel(GLint xCoord,GLint yCoord){glBegin(GL_POINTS);glVertex2i(xCoord,yCoord);glEnd();}void ellipseMidpoint(int xCenter,int yCenter,int Rx,int Ry) {int Rx2=Rx*Rx;int Ry2=Ry*Ry;int twoRx2=2*Rx2;int twoRy2=2*Ry2;int p;int x=0;int y=Ry;int px=0;int py=twoRx2*y;void ellipsePlotPoints(int,int,int,int);ellipsePlotPoints(xCenter,yCenter,x,y);p=round(Ry2-(Rx2*Ry)+(0.25*Rx2));while(px<py){x++;px+=twoRy2;if(p<0)p+=Ry2+px;else{y--;py-=twoRx2;p+=Ry2+px-py;}ellipsePlotPoints(xCenter,yCenter,x,y);}p=round(Ry2*(x+0.5)*(x+0.5)+Rx2*(y-1)*(y-1)-Rx2*Ry2);while(y>0){y--;py-=twoRx2;if(p>0)p+=Rx2-py;else{x++;px+=twoRy2;p+=Rx2-py+px;}ellipsePlotPoints(xCenter,yCenter,x,y);}}void ellipsePlotPoints(int xCenter,int yCenter,int x,int y) {setPixel(xCenter+x,yCenter+y);setPixel(xCenter-x,yCenter+y);setPixel(xCenter+x,yCenter-y);setPixel(xCenter-x,yCenter-y);}void display(){glClear(GL_COLOR_BUFFER_BIT);ellipseMidpoint(200,200,50,30);glFlush();}void myinit(){glClearColor(0.8,1.0,1.0,1.0);glColor3f(0.0,0.0,1.0);glPointSize(1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,300.0,0.0,300.0);}void main(int argc,char **argv ){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(300,300);glutInitWindowPosition(200.0,200.0);glutCreateWindow("circleMId example");glutDisplayFunc(display);myinit();glutMainLoop();}三、抛物线#include<glut.h>#include<math.h>#include<stdio.h>inline int round(const float a){return int (a+0.5);}void setPixel(GLint xCoord,GLint yCoord){glBegin(GL_POINTS);glVertex2i(xCoord,yCoord);glEnd();}void ellipseMidpoint(int xCenter,int yCenter,int a,int b){int p;int x=xCenter;int y=yCenter;int px=0,py=0;void ellipsePlotPoints(int,int,int,int);ellipsePlotPoints(xCenter,yCenter,px,py);p=yCenter+a*(x+1-xCenter)*(x+1-xCenter)+b*(x+1-xCenter)-y-0.5;do{if(p<0){x=x+1;y=y;p=yCenter+a*(x+1-xCenter)*(x+1-xCenter)+b*(x+1-xCenter)-y-0.5;}else{x=x+1;y=y-1;p=yCenter+a*(x+1-xCenter)*(x+1-xCenter)+b*(x+1-xCenter)-y-0.5;}px=x-xCenter;py=y-yCenter;ellipsePlotPoints(xCenter,yCenter,px,py);}while(px<py);for(;;){if(p<0){x=x-1;y=y+1;p=yCenter+a*(x+0.5-xCenter)*(x+0.5-xCenter)+b*(x+0.5-xCenter)-y-1;}else{x=x;y=y+1;p=yCenter+a*(x+0.5-xCenter)*(x+0.5-xCenter)+b*(x+0.5-xCenter)-y-1;}px=x-xCenter;py=y-yCenter;ellipsePlotPoints(xCenter,yCenter,px,py);};}void ellipsePlotPoints(int xCenter,int yCenter,int x,int y){setPixel(xCenter+x,yCenter+y);setPixel(xCenter-x,yCenter+y);}void display(){glClear(GL_COLOR_BUFFER_BIT);ellipseMidpoint(150,150,1,0);glFlush();}void myinit(){glClearColor(0.8,1.0,1.0,1.0);glColor3f(0.0,0.0,1.0);glPointSize(1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,300.0,0.0,300.0);}void main(int argc,char **argv ){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(200.0,200.0);glutCreateWindow("circleMId example");glutDisplayFunc(display);myinit();glutMainLoop();}四、基本图元输出#include<glut.h>#include<math.h>#include<stdio.h>void Polygon(int*p1,int*p2,int*p3,int*p4,int*p5,int*p6) {glBegin(GL_POLYGON);glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p3);glVertex2iv(p4);glVertex2iv(p5);glVertex2iv(p6);glEnd();}void Triangles(int*p1,int*p2,int*p3,int*p4,int*p5,int*p6) {glBegin(GL_TRIANGLES);glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p6);glVertex2iv(p3);glVertex2iv(p4);glVertex2iv(p5);glEnd();}void Trianglefan(int*p1,int*p2,int*p3,int*p4,int*p5,int*p6) {glBegin(GL_TRIANGLE_FAN);glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p3);glVertex2iv(p4);glVertex2iv(p5);glVertex2iv(p6);glEnd();}void Trianglestrip(int*p1,int*p2,int*p3,int*p4,int*p5,int*p6) {glBegin(GL_TRIANGLE_STRIP);glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p6);glVertex2iv(p3);glVertex2iv(p5);glVertex2iv(p4);glEnd();}void glRect_s(GLint a,GLint b,GLint c,GLint d){glRecti(a,b,c,d);}void display(){int p1[]={60,170};int p2[]={100,100};int p3[]={180,100};int p4[]={220,170};int p5[]={180,240};int p6[]={100,240};int p7[]={60,100};glClear(GL_COLOR_BUFFER_BIT);//Triangles(p1,p2,p3,p4,p5,p6);//Polygon(p1,p2,p3,p4,p5,p6);//glRect_s(160,30,10,100);Trianglestrip(p1,p2,p3,p4,p5,p6);//Trianglefan(p1,p2,p3,p4,p5,p6);glFlush();}void myinit(){glClearColor(0.8,1.0,1.0,1.0);glColor3f(0.0,0.0,1.0);glPointSize(1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,300.0,0.0,300.0);}void main(int argc,char **argv ){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(300.0,300.0);glutCreateWindow("circleMId example");glutDisplayFunc(display);myinit();glutMainLoop();}五、区域填充#include"glut.h"#include"windows.h"const int POINTNUM=7; //多边形点数.//定义结构体用于活性边表AET和新边表NETtypedef struct XET{float x;float dx,ymax;XET* next;}AET,NET;//定义点结构体pointstruct point{float x;float y;}polypoint[POINTNUM]={250,50,350,150,50,40,250,20,200,30,100,100,10,300};//多边形顶点void PolyScan(){//计算最高点的y坐标(扫描到此结束)int MaxY=0;int i;for(i=0;i<POINTNUM;i++)if(polypoint[i].y>MaxY)MaxY=polypoint[i].y;//初始化AET表AET *pAET=new AET;pAET->next=NULL;//初始化NET表NET *pNET[1024];for(i=0;i<=MaxY;i++){pNET[i]=new NET;pNET[i]->next=NULL;}glClear(GL_COLOR_BUFFER_BIT); //赋值的窗口显示.glColor3f(0.9,1.0,0.0); //设置直线的颜色红色glBegin(GL_POINTS);//扫描并建立NET表,注:构建一个图形for(i=0;i<=MaxY;i++){for(int j=0;j<POINTNUM;j++)if(polypoint[j].y==i){ //一个点跟前面的一个点形成一条线段,跟后面的点也形成线段if(polypoint[(j-1+POINTNUM)%POINTNUM].y>polypoint[j].y){NET *p=new NET;p->x=polypoint[j].x;p->ymax=polypoint[(j-1+POINTNUM)%POINTNUM].y;p->dx=(polypoint[(j-1+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j- 1+POINTNUM)%POINTNUM].y-polypoint[j].y);p->next=pNET[i]->next;pNET[i]->next=p;}if(polypoint[(j+1+POINTNUM)%POINTNUM].y>polypoint[j].y){NET *p=new NET;p->x=polypoint[j].x;p->ymax=polypoint[(j+1+POINTNUM)%POINTNUM].y;p->dx=(polypoint[(j+1+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j+1+POINTNUM)%POINTNUM].y-polypoint[j].y);p->next=pNET[i]->next;pNET[i]->next=p;}}}for(i=0;i<=MaxY;i++){//计算新的交点x,更新AETNET *p=pAET->next;while(p){p->x=p->x + p->dx;p=p->next;}AET *tq=pAET;p=pAET->next;tq->next=NULL;while(p){while(tq->next && p->x >= tq->next->x)tq=tq->next;NET *s=p->next;p->next=tq->next;tq->next=p;p=s;tq=pAET;}//(改进算法)先从AET表中删除ymax==i的结点* AET *q=pAET;p=q->next;while(p){if(p->ymax==i){q->next=p->next;delete p;p=q->next;}else{q=q->next;p=q->next;}}//将NET中的新点加入AET,并用插入法按X值递增排序p=pNET[i]->next;q=pAET;while(p){while(q->next && p->x >= q->next->x)q=q->next;NET *s=p->next;p->next=q->next;q->next=p;p=s;q=pAET;}//配对填充颜色p=pAET->next;while(p && p->next){for(float j=p->x;j<=p->next->x;j++)glVertex2i(static_cast<int>(j),i);p=p->next->next;//考虑端点情况}}glEnd();glFlush();}void init(void){glClearColor(1.0,1.0,1.0,0.0);//窗口的背景颜色设置为白色glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,600.0,0.0,450.0);}void lineSegment(void){glClear(GL_COLOR_BUFFER_BIT); //赋值的窗口显示.glColor3f(0.0,1.0,0.0); //设置直线的颜色红色glBegin(GL_LINES);glVertex2i(180,15); //Specify line-segment geometry.glVertex2i(10,145);glEnd();glFlush(); //Process all OpenGL routines as quickly as possible.}void main(int argc,char* argv){glutInit(&argc,&argv); //I初始化GLUT.glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置显示模式:单个缓存和使用RGB模型glutInitWindowPosition(50,100); //设置窗口的顶部和左边位置glutInitWindowSize(400,300); //设置窗口的高度和宽度glutCreateWindow("扫描线填充算法"); //创建显示窗口init(); //调用初始化过程glutDisplayFunc(PolyScan); //图形的定义传递glutMainLoop(); //显示所有的图形并等待}11。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学实验指导一、实验目的1、培养学生动手编程解决实际问题的能力。
2、训练学生分析问题和调试程序的能力。
3、锻炼学生撰写科技实验论文的能力。
二、实验要求1、问题分析充分地分析和理解问题本身,弄清要求做什么,用什么算法。
2、程序设计(1)根据所采用的算法,设计数据结构,画出流程图并编程。
(2)最后准备调试程序的数据及测试方案。
3、上机调试(1)对程序进行编译,纠正程序中可能出现的语法错误。
(2)调试前,先运行一遍程序看看究竟将会发生什么。
(3)如果情况很糟,根据事先设计的测试方案并结合现场情况进行错误跟踪,包括单步调试、设置观察窗输出中间变量值等手段。
4、整理实习报告三、实验报告1、实习内容:采用的算法名称2、问题描述:包括目标、任务、条件约束描述等。
3、设计:数据结构设计和核心算法设计。
主要功能模块的输入,处理(算法框架)和输出。
4、测试范例:测试结果的分析讨论,测试过程中遇到的主要问题及所采用的解决措施。
5、心得:包括程序的改进设想,经验和体会。
6、程序清单:源程序,其中包括变量说明及详细的注释。
实验一 OpenGL程序设计一、实验学时2学时二、实验类型学习型实验三、实验目的和要求初步了解OpenGL程序设计结构;了解OpenGL的基本数据类型、核心函数及辅助函数的使用。
四、实验内容1、综述这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL提供了完备的支持。
OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。
2、试验步骤1)在VC中新建项目2).OpenGL基础库设置•更改头文件(在视图类的头文件中引用gl\gl.h gl\glu.h)•连接OpenGL库(工程——设置——General/Use MFC in a Library, Link/OpenGL32.lib glu32.lib)3).添加变量和函数•添加变量并初始化•CClientDC * MyDC;•视图类的构造函数中 MyDC=NULL;•添加消息映射函数•OnCreate()•OnSize()•OnDestroy()4).在PreCreateWindow函数中将窗口的客户区设置为OpenGL能够支持的风格cs.style=WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;5).在OnCreate函数中•定义像素存储格式• PIXELFORMATDESCRIPTOR结构•创建绘图上下文RC(Rendering Context)并使之当前化•wglCreateContext()函数创建绘图上下文RC。
PIXELFORMATDESCRIPTOR pfd={ sizeof(PIXELFORMATDESCRIPTOR), // pfd的大小1, //结构的版本号PFD_DRAW_TO_WINDOW| //支持windowPFD_SUPPORT_OPENGL| //支持OpenGLPFD_DOUBLEBUFFER, //双缓存PFD_TYPE_RGBA, //RGBA颜色模式24, //24位颜色深度缓存0,0,0,0,0,0, //color bits ignored0, //no alpha buffer0, //shift bit ignored0, //不使用累积缓存0,0,0,0, //accum bits ignored32, //32位z缓冲0, //不使用模板缓存0, //no auxiliary bufferPFD_MAIN_PLANE, //选择主层面0, //保留0,0,0 //layer masks ignored};MyDC=new CClientDC(this);//设置像素格式int pixelFormat=ChoosePixelFormat(MyDC->GetSafeHdc(),&pfd); SetPixelFormat(MyDC->GetSafeDC(),pixelFormat,&pfd);m_hRC=wglCreateContext(MyDC->m_hDC);wglMakeCurrent(MyDC->GetSafeHdc(),m_hRC);6).在OnSize函数中设置视场和视口If(cy>0){glMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum(-1.0,1.0,-1.0*cy/cx,1.0*cy/cx,5.0,9.0);glViewport(0,0,cx,cy);}7).在OnDestroy函数:在OnDestroy成员中需要释放OnCreate成员中RC所占用的资源HGLRC m_hRC;m_hRC=wglGetCurrentContext();wglMakeCurrent(NULL,NULL);wglDeleteContext(m_hRC);MyDC->DeleteDC();8)在OnEraseBKgnd中将原来的返回语句换成返回TRUE;9).在OnDraw中根据当前的视点、视距、观看方向等参数,设置合适的OpenGL视景体属性,使用户能够看到预期的场景外观glClearColor(1.0f,1.0f,0.0f,1.0f);//背景为黄色glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0f,0.0f,-6.0f);glBegin(GL_LINES); //OpenGL绘制直线命令glColor3f(1.0,0.0,0.0); //设置当前颜色为红色glVertex2f(0,0);glVertex2f(1,1);glColor3f(0.0,1.0,0.0); //设置当前颜色为绿色glVertex2f(0.2f,0.0f);//glVertex2f(1.2f,1.0f);glEnd();glFinish();SwapBuffers(wglGetCurrentDC());3、程序说明每个函数的具体含义在程序注释中已作了叙述,不再多说。
OpenGL的函数在格式上很有特点,它以gl为前缀,并且函数名的最后一个字母指出所用的数据类型,如:glColor3f(),字母f指明要使用浮点数。
字母前的数字指明参数个数或指明二维还是三维,如:glVertex2f()是要设置二维的点。
OpenGL采用的是状态机的方式,用户设定一种状态,程序照此运行。
如:glBegin(GL_LINES)设定画线状态(GL_LINES是OpenGL已定义好的常量),glColor3f()设定绘图所用颜色。
main()函数中的几个aux前缀函数是OpenGL提供的辅助库,用以初始化窗口,大家不必深究,我们关注的是display()函数,它是我们真正绘图的地方。
函数glColor3f()以RGB方式设置颜色,格式为:glColor3f(red, green, blue),每种颜色值在(0.0, 1.0)之间。
为了能显示更多的颜色,最好把系统设置成16位真彩色模式。
函数glVertex2f(x, y)设置二维顶点。
函数glBegin(UINT State)、glEnd()是最基本的作图函数,下面对它作一介绍。
如上所述,OpenGL是一个状态机,glBegin(UINT State)可以设定如下状态:GL_POINTS 画点GL_LINES 画线,每两个顶点(Vertex)为一组GL_LINE_STRIP 画线,把若干个顶点顺次连成折线GL_LINE_LOOP 画线,把若干个顶点顺次连成封闭折线GL_TRIANGLES 画三角形,每三个顶点为一组GL_QUADS 画四边形,每四个顶点为一组GL_POLYGON 画多边形还有GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS_STRIP 等等。
大家可以把每一种状态都试一试。
程序可以有多组glBegin()、glEnd()并列的形式,如:... ...glBeing(GL_LINES);......glEnd();glBeing(GL_QUADS);... ...glEnd();... ...除了上述的基本图元外,函数glRectf(x1, y1, x2, y2)可以画一个矩形,但这个函数不能放在glBegin()和glEnd()之间,下面的两句程序是画一个蓝色的矩形。
glColor3f (0.0f, 0.0f, 1.0f);glRectf(10.0f, 10.0f, 50.0f,50.0f);实验二二维基本图元的生成一、实验学时2学时二、实验类型设计型实验三、实验目的和要求1、掌握二维基本图元直线段生成的DDA算法,Brehension算法;2、掌握二维基本图元圆弧生成的中点画圆算法;3、掌握对线型线宽的属性的控制。
四、实验内容1、编程实现DDA、Brehension算法生成直线2、中点扫描转换生成圆、椭圆五、实验步骤1)在VC中新建项目2)添加菜单及相应的菜单命令函数(画线、画圆)3)编码实现(参考书中相关代码);实验三二维图元的填充一、实验学时2学时二、实验类型设计型实验三、实验目的和要求1、掌握二维图元填充的递归算法;2、掌握二维图元填充的种子填充算法四、实验内容构造任意一个边界表示的多边形,假定该多边形内部是四连通的。
要求:1、用递归算法实现对多边形内部的填充,要求内部颜色和边界不一致。
2、用种子填充扫描线算法实现多边形内部的填充。
五、建立win32应用程序工程。
1、请在实验二中建立的项目基础上,添加填充的菜单项,建立相应的菜单命令寒暑,实现种子填充。
2. void BoundaryFill4(HDC,int,int,COLORREF,COLORREF);void BoundaryFill4(HDC hdc,int x,int y,COLORREF boundarycolor,COLORREF newcolor){COLORREF color;color=GetPixel(hdc,x,y);if((color != boundarycolor) && (color !=newcolor)){SetPixel(hdc,x,y,newcolor);BoundaryFill4(hdc,x,y+1,boundarycolor,newcolor);BoundaryFill4(hdc,x,y-1,boundarycolor,newcolor);BoundaryFill4(hdc,x-1,y,boundarycolor,newcolor);BoundaryFill4(hdc,x+1,y,boundarycolor,newcolor);}}实验四二维图形的几何变换一、实验学时2学时二、实验类型设计型实验三、实验目的和要求1、掌握二维图形的基本几何变换,如平移、旋转、缩放;2、掌握OpenGL中模型变换函数。