计算机图形学实验报告
- 格式:docx
- 大小:47.38 KB
- 文档页数:21
《计算机图形学》实验6实验报告实验题目:简单Java绘图板程序实验内容:1 阅读理解本试验提供的参考资料。
2编写并调通一个简单绘图板的java程序。
参考资料:1pb.java2 Java图形处理介绍.doc基本概念:1在编写显示图形的JAVA程序中,需要经常覆盖一些方法,其中使用的最多的就是paint()、repaint()和update()方法。
○1Paint() :每次applet被其他窗口覆盖后重新显示时,都会调用paint()方法,在paint()方法中会调用repaint()方法;○2Repaint(): repaint()方法强制Applet进行重新绘制。
调用repaint()方法之后会接着调用update()方法。
Repaint()方法有三种调用方式:●public void repaint(long tm)功能:每隔tm毫秒进行重绘;●public void repaint(int x,int y,int width,int height)功能:重绘由参数指定的矩形区域;●public void repaint(long tm,int x,int y,int width,int height)功能:每隔tm毫秒对指定矩形区域进行重绘;○3Update() :update()方法默认的行为是先使用背景色填充applet,然后再调用paint() 方法2 颜色模型绘制图形的过程就是布置布置颜色的过程,为了将二进制数字变成屏幕颜色,需要采用一些规则,Java把这个规则包装在颜色模型中。
○1Java的32位颜色模型Java将颜色表示为32位。
在缺省情况下,用于表示图形的32位数中8位用于alpha,8位用于红,8位用于绿,8位用于蓝。
这些值恰好放进一个32位的int数中。
○2ColorModel类(在java.awt.image包中)有两个子类,包装了两大颜色模型:●DirectColorModel支持将32位整型数分配成用不同位数和位的位置用以表示alpha、红、绿、蓝。
《计算机图形学》实验2实验报告实验题目:多视图绘图程序实验内容:掌握多视图绘图的概念,掌握二维统计图的绘制方法。
调用实验1中自己编写的基本包,绘制自己所设计的统计图形(饼图、直方图以及折线)。
编写程序调用验证之。
基本概念:(详细叙述自己对实验内容的理解)多视图:就是将多个绘制好的图形按照一定的规则组成一个具有特定意义的图形,在同一个视图中显示出来,如下面绘制的几种统计图形(饼图、直方图以及折线)。
饼图:可以清楚的表示出各个部分所占的比例;直方图:可以清楚地的显示各部分的数量的多少;折线:可以清楚地反应各个部分的变化趋势。
算法设计:(详细叙述自己设计的多视图统计图以及程序的功能、算法及实现)public abstract void drawLine(int x1, int y1, int x2, int y2)使用当前颜色,在点(x1, y1) 和(x2, y2) 之间画线。
public abstract void drawOval(int x, int y, int width, int height)画椭圆。
public abstract void fillOval(int x, int y, int width, int height)画实心椭圆。
public abstract void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)画x和y坐标定义的多边形。
public void drawRect(int x, int y, int width, int height)画矩形。
public void drawRect(int x, int y, int width, int height)画实心矩形。
public abstract void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) 使用当前颜色画圆角矩形。
《计算机图形学》实验报告1. 实验目的巩固对计算机图形学绘图基础知识,绘制金刚石图案2. 问题描述对题目分析,金刚石图案是由依次连接位于圆上的不同等分点的直线段构成,等分点越多,金刚石图案越复杂;要绘制一个半径300,20等分的金刚石图案;首先要设计金刚石图案的数学模型,然后定义画笔编程绘制图案;。
3. 算法的思想为把一个半径为300的圆,等分绘制金刚石图案;设计该算法为避免直线段的重复连接,需设计一个二重循环,代表起点索引号的外层整型变量i从i=0循环到i=n-2,代表终点索引号的内层整型变量j从j=i+1循环到j=n-1.以(p[i].x,p[i].y)为起点,以(p[j].x,p[j].y)为终点依次连接各线段形成金刚石图案。
4.程序核心代码void CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCRect rect;GetClientRect(&rect);pDC->SetMapMode(MM_ANISOTROPIC);pDC->SetWindowExt(rect.Width(),rect.Height());pDC->SetViewportExt(rect.Width(),-rect.Height());pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255));pOldPen=pDC->SelectObject(&NewPen);double thta;thta=2*PI/20;CPoint p[20];for(int i=0;i<20;i++){p[i].x=100*cos(i*thta);p[i].y=100*sin(i*thta);}for(i=0;i<=18;i++){for(int j=i+1;j<=19;j++){pDC->MoveTo(ROUND(p[i].x),ROUND(p[i].y));pDC->LineTo(ROUND(p[j].x),ROUND(p[j].y));}}pDC->SelectObject(pOldPen);NewPen.DeleteObject();ReleaseDC(pDC);}5.程序运行结果6.实验总结初次用C+ +绘图,看到是绘制金刚石,第一感觉是一定很复杂;其实不然,由于老师简化了实验题目要求,使我们的实验任务得以轻松了很多;但是好久没有动手编写代码了,感觉很多都忘记了,虽然这次的程序并不难,实验指导书上模型都已建好,但是实际操作还是有一些问题,有些错误改了很多次都总是没有结果,最后在同学的帮助下运行改错才得出结果;通过这次实验我了解到问题的难与易在于你是否动手实际操作了,有时看似简单永远不知道在哪个细节会出错!。
计算机图形学实验报告实验一 3D模型的加载、渲染与三维操作学院:专业班级:指导老师:学号:姓名:完成日期:目录一、实验目的 (3)二、使用的工具软件及环境 (3)三、实验内容 (3)四、实验步骤 (3)五、思考 (12)一、实验目的1、掌握在Microsoft Visual Studio环境中使用OpenGL、GLUT 和GLUI;2、了解计算机图形学固定流水线;3、了解OpenGL编程基础;4、掌握三维观察的数学表达和程序实现;5、掌握多边形网格的绘制;二、使用的工具软件及环境Microsoft Visual Studio 2010、OpenGL、Glut、Glui三、实验内容1、在VS 2010中配置OpenGL环境;2、编译简单的GLUT程序;3、编译GLUI源代码,并在调试模式下执行6个示例程序;4、在给定的工程中添加绘制简单几何体的代码;5、在给定的工程中添加读取、绘制三维模型的代码;6、在给定的工程中添加旋转、平移和缩放的控制代码;四、实验步骤1、安装Microsoft Visual Studio软件版本选择:Microsoft Visual Studio 2010以上版本2、VS2010中配置GLUT1)下载GLUT。
Windows环境下的GLUT下载地址:/resources/libraries/glut/glutdlls37be ta.zip2)将下载的压缩包解开,将得到5个文件:glut.h、glut.lib、glut32.lib、glut.dll、glut32.dll。
3)将glut.h放到"%WinDir%\ProgramFiles(x86)\Microsoft SDKs\Windows\v7.0A\Include\gl\"文件夹中。
4)将glut.lib和glut32.lib放到"%WinDir%\ProgramFiles(x86)\Microsoft Visual Studio 10.0\VC\lib\"文件夹中。
计算机图形学实验报告姓名:___ __________学号:_____ ________班级:______ _______时间:_____2016年12月_________实验一OpenGL编程与图形绘制1.实验目的了解OpenGL编程,并熟悉OpenGL的主要功能、绘制流程和基本语法。
学会配置OpenGL环境,并在该环境中编程绘图。
2.实验内容OpenGL的主要功能:模型绘制、模型观察、颜色模式、光照应用、图像效果增强、位图和图像处理、纹理映射、实时动画和交互技术。
OpenGL的绘制流程分为两个方面:一个完整的窗口系统的OpenGL图形处理系统的结构为:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件;OpenGL命令将被放在一个命令缓冲区中,这样命令缓冲区中包含了大量的命令、顶点数据和纹理数据。
当缓冲区被清空时,缓冲区中的命令和数据都将传递给流水线的下一个阶段。
OpenGL的基本语法中相关库有:OpenGL核心库:gl、OpenGL实用程序库:glu、OpenG 编程辅助库:aux、OpenGL实用程序工具包(OpenGL utility toolkit,GLUT):glut、Windows 专用库:wgl。
OpenGL的基本语法中命名规则为:OpenGL函数都遵循一个命名约定,即采用以下格式:<库前缀><根命令><可选的参数个数><可选的参数类型>。
了解了上述基础知识后,配置好OpenGL环境,然后在该环境中编程练习图形的绘制,本次实验主要是对点的绘制、直线的绘制和多边形面的绘制。
3.实验代码及结果3.1点的绘制:#include<gl/glut.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形glPointSize(10); //三个点glBegin(GL_POINTS);glColor3f(1.0f,0.0f,0.0f);glVertex2i(2,148);glVertex2i(100,75);glVertex2i(198,2);glEnd();glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //完成窗口GLUT事件处理循环return 0;}运行结果:3.2直线的绘制:#include<gl/glut.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形glBegin(GL_LINE_LOOP); //五角星glVertex2i(10,10);glVertex2i(30,35);glVertex2i(50,10);glVertex2i(5,25);glVertex2i(55,25);glEnd();glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //完成窗口GLUT事件处理循环return 0;}运行结果:3.3多边形面的绘制:#include<gl/glut.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形glBegin(GL_TRIANGLES); //等边三角形glVertex2f(0.0,0.0);glVertex2f(15,25.95);glVertex2f(30,0);glEnd();glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //完成窗口GLUT事件处理循环return 0;}运行结果:实验二直线绘制实验1.实验目的为了进一步熟悉OpenGL编程,了解基本图形生成算法中的直线绘制,学会直线绘制算法中最常用的三种算法:数值微分法、中点画线算法和Bresenham算法。
《计算机图形学》实验报告学号:0908610211姓名:宋雪英班级:计算机0961项目:1.利用其它两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。
2.利用方形、线性两种画刷来绘制圆和椭圆。
3.实现交互式二维图形的放缩,旋转和对称变换2012年12月25日基本图形的生成技术一、实验目的在一个图形系统中,基本图形(也称为图元、图素等)的生成技术是最基本的,任何复杂的图形都是由基本图形组成的,基本图形生成的质量直接影响该图形系统绘图的质量。
所以,需要设计出精确的基本图形生成算法,以确保图形系统绘图的精确性。
本次实验的目的就是利用Bresenham 算法和中心画线法两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。
利用方形、线性两种画刷来绘制圆和椭圆。
实现交互式二维图形的放缩,旋转和对称变换。
二、实验任务1.利用其它两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。
2.利用方形、线性两种画刷来绘制圆和椭圆。
3.实现交互式二维图形的放缩,旋转和对称变换。
三、画直线的实验内容任务一:利用其它两种画直线方法实现放大10陪显示方法交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。
1、设计思路第一步:建立DDAMouseLine工程文件;第二步:向视图类中添加自定义的成员变量用鼠标右键单击视图类,选择“Add Member Variable…”,添加下面三个成员变量。
proctected :CPoint m_p1; //起点CPoint m_p2; //起点CPoint m_p; //点击鼠标时点的取值第三步:向视图类中添加自定义的成员函数原型:public:V oid DDAMouseLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color);Line()函数以当前位置所在的点为直线的起点,另指定一个点为直线的终点,画出一段直线。
千里之行,始于足下。
计算机图形学实验报告B样条曲线B样条曲线是计算机图形学中常用的一种曲线表示方法。
它通过插值曲线的控制点来定义曲线的形状,并且具有较好的平滑性。
本次实验中,我们使用C++语言实现了B样条曲线的生成和显示,并进行了相应的实验和分析。
实验目的:1.了解B样条曲线的原理和算法;2.掌握B样条曲线的生成和显示方法;3.通过实验观察和分析B样条曲线的性质。
一、B样条曲线的原理B样条曲线是一种基于控制点的插值曲线,它通过一系列连续的基函数(B 样条基函数)来插值控制点,从而生成曲线。
B样条曲线的基本原理如下:1.选择一组控制点P0,P1,…,PN-1;2.定义一组节点向量U={u0,u1,…,um},其中u0<=u1<=…<=um;3.通过插值曲线的标准等式,通过计算线性组合来计算曲线上每个点的坐标。
二、B样条曲线的算法1.计算节点向量U;2.定义B样条基函数;3.计算曲线上每个点的坐标。
三、实验步骤和结果1.计算节点向量U:在实验中,我们选择均匀节点向量,即ui=i,其中i=0,1,…,m。
这样的节点向量比较简单,而且能够生成比较平滑的曲线。
第1页/共3页锲而不舍,金石可镂。
2.定义B样条基函数:B样条基函数是用来插值曲线的重要部分,它可以通过递归定义来实现。
在实验中,我们使用了三次B样条基函数,其递归定义如下:N(i,1)(u)={1,u∈[ui,ui+1];0,否则}N(i,k)(u)=[(u-ui)/(ui+k-1-ui)]*N(i,k-1)(u)+(ui+1-u)/(ui+k-ui+1)*N(i+1,k-1)(u)3.计算曲线上每个点的坐标:通过计算线性组合来计算曲线上每个点的坐标。
具体计算方法如下:P(u)=sum(B(i,k)(u)*Pi,i=0 to n-1),其中B(i,k)(u)=N(i,k)(u)/sum(N(j,k)(u))四、实验结果和分析在实验中,我们通过改变控制点的位置和数量,生成了不同的B样条曲线,并进行了显示和分析。
计算机图形学实验报告班级2011010专业地理信息系统组别组员华北水利水电学院资源与环境学院GIS教研室实验一基本图形的生成和几何变换算法实现实验目的:1、利用c#程序实现输出直线、三角形、矩形等简单图形。
2、利用二维基本图形变换的原理实现简单图形的缩放、旋转等简单变换。
实验原理:数学原理1、调用DrawLines 可以实现直线的绘制;调用DrawPolygon 可以实现多边形的绘制;调用DrawRectangle 可以实现矩形的绘制。
2、基本几何变换:假设),,(z y x P 表示三维空间上一个未被变换的点,而该点经过某种变换后得到新的点用)',','('z y x P 表示。
① 平移变换:如果点)',','('z y x P 是由点),,(z y x P 在x 轴,y 轴和z 轴分别移动x ∆、y ∆、z ∆距离得到的,则两点坐标关系为: x x x ∆+=' y y y ∆+=' z z z ∆+=' 则矢量形式为:T P P +=' 其中⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=''''z y x P , ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=z y x P , ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡∆∆∆=z y x T② 缩放变换:缩放变换改变物体的大小。
有坐标关系 x s x x =' y s y y =' z s z z ='其中,x s ,y s ,z s 分别为沿x ,y 和z 轴方向放大或缩小的比例。
得到矩阵形式为 ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡∙⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡z y x s s s z y x z y x0000''' ③ 旋转变换:设给定点P 的坐标为),sin ,cos (),,(z r r z y x ϕϕ=,则它绕z轴旋转α角后得到)',','('z y x P 有zz y x r y y x r x =+=+=-=+='c o s s i n )s i n ('s i n c o s )c o s ('αααϕαααϕ 有矩阵形式 ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡∙⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡z y x z y x 100cos sin 0sin cos '''αααα设计思路:1、对于图形的几何变换,将原始图形的坐标值写成矩阵的形式,并用数组a表示,将数组a 的元素放入point 型数组中,如:数组a = new int[,]{ { 50,10,0 } ,{ 50, 90, 0},{ 100,90,0 } };代表点(50,10),(50,90),(100,90)。
计算机图形学实验报告班级:学号:姓名:指导教师:完成日期:实验一:多边形填充一、实验目的了解多边形属性,熟悉相关函数的调用。
二、实验内容步骤和实现:首先进行初始化工作,进行显示模式(单缓冲区)和窗口等设定,主要实现根据两个函数,一个是指定场景绘制函数,glutDisplayFunc(Paint),paint函数中设置了两个三角形,一个填充,一个不填充。
用到了启用多边形点画模式glEnable(GL_POL YGON_STIPPLE)的函数,和指定多边形点画模式(填充) glPolygonStipple(fly)的函数。
另外一个就是循环执行OpenGl命令的glutMainLoop()函数。
三、实验结果四、源程序// POL Y_STIPPLE.C#include <gl/glut.h>void makeObject() // 定义一个三角形{ glBegin(GL_TRIANGLES); // 开始定义三角形// 按逆时针方向指定三角形的顶点坐标glVertex2f(-0.95, -0.95);glVertex2f(0.95, -0.95);glVertex2f(0, 0.95);glEnd(); // 三角形定义结束}void display(){ GLsizei w = glutGet(GLUT_WINDOW_WIDTH); // 程序窗口宽度GLsizei h = glutGet(GLUT_WINDOW_HEIGHT); // 程序窗口高度GLubyte fly[] = // 第二个三角形点画模式的mask值{ 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, // 0X03, 0X80, 0X01, 0XC0, 0X06, 0XC0, 0X03, 0X60, //0X04, 0X60, 0X06, 0X20, 0X04, 0X30, 0X0C, 0X20, //0X04, 0X18, 0X18, 0X20, 0X04, 0X0C, 0X30, 0X20, //0X04, 0X06, 0X60, 0X20, 0X44, 0X03, 0XC0, 0X22, //0X44, 0X01, 0X80, 0X22, 0X44, 0X01, 0X80, 0X22, //0X44, 0X01, 0X80, 0X22, 0X44, 0X01, 0X80, 0X22, //0X44, 0X01, 0X80, 0X22, 0X44, 0X01, 0X80, 0X22, //0X66, 0X01, 0X80, 0X66, 0X33, 0X01, 0X80, 0XCC, //0X19, 0X81, 0X81, 0X98, 0X0C, 0XC1, 0X83, 0X30, //0X07, 0XE1, 0X87, 0XE0, 0X03, 0X3F, 0XFC, 0XC0, //0X03, 0X31, 0X8C, 0XC0, 0X03, 0X33, 0XCC, 0XC0, //0X06, 0X64, 0X26, 0X60, 0X0C, 0XCC, 0X33, 0X30, //0X18, 0XCC, 0X33, 0X18, 0X10, 0XC4, 0X23, 0X08, //0X10, 0X63, 0XC6, 0X08, 0X10, 0X30, 0X0C, 0X08, //0X10, 0X18, 0X18, 0X08, 0X10, 0X00, 0X00, 0X08 };glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区glViewport(0, 0, w / 2, h); // 第一个视口,显示第一个三角形glColor3f(1, 1, 1); // 设置颜色,白色,默认值makeObject(); // 第一个三角形glViewport(w / 2, 0, w / 2, h); // 第二个视口,显示第二个三角形glColor3f(1, 0, 0); // 设置颜色,红色glEnable(GL_POL YGON_STIPPLE); // 启用多边形点画模式glPolygonStipple(fly); // 指定多边形点画模式(填充)makeObject(); // 第二个三角形glDisable(GL_POL YGON_STIPPLE); // 关闭多边形点画模式glFlush(); // 强制OpenGL命令序列在有限的时间内完成执行}int main(){ glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);// 设置程序窗口的显示模式(单缓冲区、RGBA颜色模型)glutInitWindowPosition(100, 100); // 程序窗口的位置glutInitWindowSize(300, 150); // 程序窗口的大小glutCreateWindow("一个填充多边形的例子!"); // 窗口的标题glutDisplayFunc(display); // 指定场景绘制函数glutMainLoop(); // 开始循环执行OpenGL命令}实验二:基本图元绘制二、实验目的了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。
计 算 机 图 形 学 课 程 实 验 报 告
姓名: 学号: 目 录实验一 直线的DDA算法
一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握DDA直线扫描转换算法。 3.深入了解直线扫描转换的编程思想。
二、【实验内容】
1.利用DDA的算法原理,编程实现对直线的扫描转换。 2.加强对DDA算法的理解和掌握。
三、【测试数据及其结果】
四、【实验源代码】 GLsizei winWidth=500; GLsizei winHeight=500; void Initial(void) { glMatrixMode(GL_PROJECTION); } void DDALine(int x0,int y0,int x1,int y1) { int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glEnd(); x+=xIncre; y+=yIncre; } } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); DDALine(100,100,200,180); glFlush(); } void winReshapeFcn(GLint newWidth, GLint newHeight) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT); winWidth=newWidth; winHeight=newHeight; } int main(int argc,char*argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(400,300); glutInitWindowPosition(100,120); glutCreateWindow("line"); Initial(); glutDisplayFunc(Display); glutReshapeFunc(winReshapeFcn); glutMainLoop(); return 0; }实验二 Bresenham绘制直线和圆 一、【实验目的】 1.掌握Bresenham算法扫描转换圆和直线的基本原理。 二、【实验内容】
1.利用Bresenham算法扫描转换圆和直线的基本原理编程实现对圆和直线的扫描转换。 三、【测试数据及其结果】
四、【实验源代码】 绘制直线: GLsizei winWidth=500; GLsizei winHeight=500; void lineBres(int x0, int y0, int xEnd, int yEnd) { int dx=fabs(xEnd-x0), dy=fabs(yEnd-y0); int p=2*dy-dx; int twoDy=2*dy, twoDyMinusDx=2*(dy-dx); int x, y; if (x0>xEnd) { x=xEnd; y=yEnd; xEnd=x0; } else{ x=x0; y=y0; } glPointSize(6); glBegin(GL_POINTS); glVertex2i(x, y); glEnd(); while (x{ x++; if (p<0) p+=twoDy; else{ y++; p+=twoDyMinusDx; } glPointSize(2); glBegin(GL_POINTS); glVertex2i(x, y); glEnd(); } } void init (void) { glShadeModel(GL_FLAT); } void display (void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); lineBres(10, 10, 400, 300); glFlush(); } void winReshapeFcn(GLint newWidth, GLint newHeight) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT); winWidth=newWidth; winHeight=newHeight; } void main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(10, 10); glutInitWindowSize(winWidth, winHeight); glutCreateWindow("lineBres"); init(); glutDisplayFunc(display); glutReshapeFunc(winReshapeFcn); glutMainLoop(); } 绘制圆:
void init() { glClearColor(0,0,0,0); } void MidBresenhamCircle(int r) { int x,y,d; x=0; y=r; d=1-r; glBegin(GL_LINE_STRIP); while(x<=y){ glVertex2f(x,y); if(d<0) d+=2*x+3; else{ d+=2*(x-y)+5; y--; } x++; } glEnd(); } void display() { glClearColor(1,1,1,1); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1,0,0); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glutSwapBuffers(); } void reshape(int w,int h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-10,10,-10,10); } int main(int argc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(400,400); glutInitWindowPosition(100,100); glutCreateWindow("扫描转换圆"); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; }实验三 反走样及五环的绘制 一、【实验目的】 1.了解走样和反走样的内容,熟练掌握用opengl实现图形的反走样。? 2.学会用反走样消除走样现象。 3.学会五环的绘制方法。
二、【实验内容】
1.通过学习反走样相关课程,用opengl实现光栅图形的反走样。 2.绘制五环。
三、【测试数据及其结果】
四、【实验源代码】 反走样: #pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") GLuint lineList; 4f2f2f2f3f3f3f3f3f3f练掌握各种裁剪算法和二维观察变换。? 2.学会在屏幕坐标系下创建多个视区、指定视区的宽度和高度,了解二维观察变换中包含窗口到视区的映射。
二、【实验内容】
1.在一个显示窗口内指定多个视区,分别显示具有相同坐标、不同颜色和不同显示模式的各种图形面。? 2.在书本给定程序基础上,对程序做一些改变并在视区中绘制各种图形。
三、【测试数据及其结果】
四、【实验源代码】 void initial(void)