南昌大学- -计算机图形学实验报告

合集下载

计算机图形学--全部实验的实验报告

计算机图形学--全部实验的实验报告

一、实验目的根据曲线和曲面的基础知识和常用曲线的数学基础,对其算法进行程序设计,验证算法的正确性,并通过程序结果加深对常用曲线数学模型的理解。

二、实验任务1.抛物线程序设计;2.Hermite 曲线程序设计;3.Bezier曲线的算法实现;4.B样条曲线的程序设计三、实验内容和实验步骤任务一:抛物线程序设计实现抛物线算法的C语言程序段如下:(工程名:parabola)Par(int xs,int ys,int xm,int ym,int xe,int ye) //已知起点、中点和终点三个控制点的坐标{double t,dt,ax,ay,bx,by,cx,cy;int n,i;ax=xe-2*xm+xs;ay=ye-2*ym+ys;bx=2.0*(xm-xs);by=2.0*(ym-ys);cx=xs; cy=ys;n=sqrt(ax*ax+ay*ay);n=sqrt(n*100.0);moveto(xs,ys);dt=1.0/n; t=0;for (i=0;i<=n; i++){lineto((int)(ax*t*t+bx*t+cx),(int)( ay*t*t+by*t+cy));t=t+dt;}lineto(xe,ye);}读者可以根据上述抛物线程序设计,写出抛物线参数样条曲线的程序。

任务二:Hermite 曲线程序设计P(t)=FB=TMB=[ t3 t2 t 1 ]程序设计时只考虑二维图形的显示,其代数形式为:x(t)=TMBx , Bx =[ P0x P1x R0x R1x]Ty(t)= TMBy , By =[ P0y P1y R0y R1y]T所以,只要给出Hermite曲线的起点坐标(P0x,P0y),终点坐标(P1x,P1y),以及起点处的切矢量(R0x,R0y)和终点处的切矢量(R1x,R1y),参数变量t在[0,1]的范围内分别取0.01,0.02,…,1,步长为0.01,取100个点,分别求出P(t)=[ x(t),y(t)],在计算机屏幕上显示出每个坐标点,即可绘出Hermite曲线。

计算机图形学实验报告4

计算机图形学实验报告4

计算机图形学实验报告4一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学中的一些关键概念和技术,通过实际操作和编程实现,提高对图形生成、变换、渲染等方面的理解和应用能力。

二、实验环境本次实验使用的软件环境为_____,编程语言为_____,硬件环境为_____。

三、实验内容1、二维图形的绘制使用基本的绘图函数,如直线、矩形、圆形等,绘制简单的二维图形。

通过设置线条颜色、填充颜色等属性,增强图形的表现力。

2、图形的几何变换实现图形的平移、旋转和缩放操作。

观察不同变换参数对图形的影响。

3、三维图形的生成构建简单的三维模型,如立方体、球体等。

应用光照和材质效果,使三维图形更加逼真。

四、实验步骤1、二维图形的绘制首先,在编程环境中导入所需的图形库和相关模块。

然后,定义绘图窗口的大小和坐标范围。

接下来,使用绘图函数按照指定的坐标和参数绘制直线、矩形和圆形。

最后,设置图形的颜色和填充属性,使图形更加美观。

2、图形的几何变换对于平移操作,通过修改图形顶点的坐标值来实现水平和垂直方向的移动。

对于旋转操作,根据旋转角度计算新的顶点坐标,实现图形的绕中心点旋转。

对于缩放操作,将图形的顶点坐标乘以缩放因子,达到放大或缩小图形的效果。

3、三维图形的生成首先,定义三维模型的顶点坐标和三角形面的连接关系。

然后,设置光照的位置、颜色和强度等参数。

接着,为模型添加材质属性,如颜色、反射率等。

最后,使用渲染函数将三维模型显示在屏幕上。

五、实验结果与分析1、二维图形的绘制成功绘制出了各种简单的二维图形,并且通过颜色和填充的设置,使图形具有了更好的视觉效果。

例如,绘制的矩形和圆形边缘清晰,颜色鲜艳,填充均匀。

2、图形的几何变换平移、旋转和缩放操作都能够准确地实现,并且变换效果符合预期。

在旋转操作中,发现旋转角度的正负会影响旋转的方向,而缩放因子的大小直接决定了图形的缩放程度。

3、三维图形的生成生成的三维模型具有一定的立体感和真实感。

计算机图形学课程综合实习实习报告

计算机图形学课程综合实习实习报告

计算机图形学课程综合实习实习报告1.实习目的(1)熟练掌握计算机图形学的基本原理和方法。

(2)熟练掌握计算机图形学的算法的程序实现,增强理论联系实际的能力(3)学习和掌握图形系统的设计和开发方法。

(4)学习使用VC++编写计算机图形学基础程序。

2.实习内容2.1程序结构说明2.1.1新建类的说明根据实习要求,对于二维算法的实现主要涉及到的图形有直线、圆形和多边形,因此新建三个类Cline,CCircle和CPolygon,其成员变量分别记录生成图形的参数,包括图形的几何参数(比如直线的端点坐标,圆的圆心坐标和半径)和图形显示效果的一些参数,比如线宽,使用何种方法绘制有一定线宽的直线,线的颜色等,类的成员函数主要作用是用于生成图形(主要是构建函数)、绘制图形(使用图形生成算法而不使用VC++自带的一些图形生成函数)和执行图形编辑操作。

同时由于添加一个对话框资源用于设置线宽和绘制时处理方法的一个对话框,生成对应的对话框处理类CSetWidthDialog,它从CDialog继承来,并添加相应的处理函数用于获得控件中相应的数据。

另外在裁剪时为了使程序的操作性更强,需要有一个临时的裁剪框,而使用MFC的函数或者是我已经写好的程序都没有办法达到理想的效果,因此我又添加一个新的类,叫做CCutRect专门用于处理图形裁剪时的操作。

2.1.2图形信息存储在文档类中添加三个动态文档类数组分别用于存储直线对象,圆对象和多边形对象,同时添加相应的函数,用于向数组中添加新的对象、获得数组长度和获得指定位置的对象,数组声明如下在绘制图形时,每绘制一个图形,就像相应的数组中添加相应的对象,在程序视图刷新时,输出所有图形。

2.1.3图形显示的优化如果在绘制图形及进行图形填充等操作时,直接在屏幕上输出结果,会因为整个I/O 操作拖慢程序的运行效率,具体反映就是图形填充操作时能够明显看出从上到下、逐行输出地过程,而在刷新视图时也可以看到类似的过程,在极端条件下(比如待填充区域很大或是非常复杂)会由于I/O操作不断刷新视图,导致程序永远进行填充,进入死循环。

计算机图形学实习报告

计算机图形学实习报告

实习报告实习名称:计算机图形学实习班级:学号:姓名:实习地点:实习指导教师:实习时间:年月日至月日一、实习目的与意义本次计算机图形学的实习分两部分,一部分是利用AutoCAD进行二维和三维模型的制作,另一部分是利用VC6.0进行编程实现对图形的简单操作。

通过对AutoCAD的实习,熟悉该软件的基本功能及操作特点,掌握二维及三维图形的基本制作过程。

通过对VC6.0的编程实习,理解图形的生成、图形的变换、图形的显示以及二维裁剪的基本思想,熟练掌握计算机图形学的基本原理和方法;熟练掌握计算机图形学算法的实现算法;学习和掌握图形系统的设计;学习用VC++编写计算机图形学程序;建立面向对象编程的基本概念。

二、实习主要内容1、AutoCAD软件操作(1)简单图形绘制(2)图形的基本编辑命令操作(3)标注文字及填充(4)三维图形绘制2.基于VC6.0下的计算机图形学程序编写(1)图形的生成:画直线、画圆、画曲线、画字符(2)图形的变换:平移、旋转、缩放、对称变换(3)图形的显示:扫描线填充、边缘填充、种子填充(4)图形的二维裁剪:CS裁剪、多边形裁剪、梁友栋裁剪、圆裁剪、中点分割法三、实习的主要过程第一部分 AutoCAD软件操作AutoCAD软件可以处理很多问题,在机械制图,土木建筑等方面有着广泛的应用,我们在机房打开AutoCAD软件对其进行系统配置,然后进行具体操作。

通过配置可以实现工具栏之类的快捷运用。

(1)简单图形绘制实习开始的第一天,在老师的讲解以及演示下,我们了解了AutoCAD软件的基本使用方法,与此同时,我们跟着老师的操作也逐渐熟悉了该软件的一些基本操作方法。

从设置基本绘图环境开始,按照指导书上的指示,采用边完成简单图形边学习各种命令的方式,逐渐熟练掌握了AutoCAD的使用,熟练掌握了其基本绘图功能,如掌握了绘图命令POINT、LINE、CIRCLE、ARC、DONUT、RECTANGLE、POLYLINE的功能及操作;掌握了实体绘图命令键盘输入的方法;掌握了缩放命令(ZOOM)的使用方法等。

南昌大学计算机图形学实验报告- B样条.doc

南昌大学计算机图形学实验报告- B样条.doc

实验五 B样条实验类型:□验证□综合□设计□创新实验日期: 2012/12/15 一实验目的实现B样条的生成二实验环境VC6.0环境下的MFC及C++语言三算法思想一个片断上的B样条的表达式可以写作:其中Si是第i个B样条片断而P是一个控制点集,i和k是局部控制点索引。

控制点的集合会是的集合,其中是比重,当它增加时曲线会被拉向控制点,在减小时则把曲线远离该点。

片段的整个集合m-2条曲线由m+1个控制点定义,作为t上的一个B样条可以定义为其中i是控制点数,t是取节点值的全局参数。

这个表达式把B样条表示为B样条基函数的线性组合,这也是这个名称的原因。

有两类B样条-均匀和非均匀。

非均匀B样条相邻控制点间的距离不一定要相等。

一个一般的形式是区间随着插入控制点逐步变小到0。

四实验步骤1 在vc中创建MFC项目2 根据算法分析,在View类中添加函数及成员变量如下在构造函数中初始化各个控制点CBbbbView::CBbbbView(){// TODO: add construction code herem_fX0=50;m_fY0=150;m_fX1=150;m_fY1=250;m_fX2=300;m_fY2=230;m_fX3=350;m_fY3=150;}在GetLines函数中回去各个点的坐标CPoint CBbbbView::GetLine1(float fT){CPoint pt;CRect ClientRect;GetClientRect(&ClientRect);pt.x = 1.0/6.0*m_fX0*(3*fT*fT-fT*fT*fT-3*fT+1)+1.0/6.0*m_fX1*(3*fT*fT*fT-6*fT*fT+4)+1.0/6.0*m_fX 2*(3*fT*fT-3*fT*fT*fT+3*fT+1)+1.0/6.0*m_fX3*fT*fT*fT;pt.y = 1.0/6.0*m_fY0*(3*fT*fT-fT*fT*fT-3*fT+1)+1.0/6.0*m_fY1*(3*fT*fT*fT-6*fT*fT+4)+1.0/6.0*m_fY 2*(3*fT*fT-3*fT*fT*fT+3*fT+1)+1.0/6.0*m_fY3*fT*fT*fT ;return pt;}在OnDraw函数中,绘制B样条曲线void CBbbbView::OnDraw(CDC* pDC){CBbbbDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here pDC->MoveTo(GetLine1(0));int n=1;for(float i = 0; i < n; ){pDC->LineTo(GetLine1(i));pDC->MoveTo(GetLine1(i));i+=0.00001;}pDC->MoveTo(m_fX0,m_fY0);pDC->LineTo(m_fX1,m_fY1);pDC->MoveTo(m_fX1,m_fY1);pDC->LineTo(m_fX2,m_fY2);pDC->MoveTo(m_fX2,m_fY2);pDC->LineTo(m_fX3,m_fY3);}。

《计算机图形学》实验报告

《计算机图形学》实验报告

《计算机图形学》实验报告目录1实验2:直线的生成 (1)1.1实验要求和目的 (1)1.2实验课时 (1)1.3实验环境 (1)1.4实验内容 (1)1.5核心代码 (3)1.6实验结果 (7)1.6.1DDA算法 (10)1.6.2Mid-Bresenham算法 (11)1.7心得与体会 (12)2实验4:BSpline曲线绘制 (13)2.1实验要求和目的 (13)2.2实验课时 (13)2.3实验环境 (13)2.4实验内容 (13)2.5核心代码 (16)2.6实验结果 (18)2.6.1B-样条算法 (19)2.6.2Bezeir算法 (22)2.7心得与体会 (24)附录 (25)BSpline曲线控制点的测试数据 (25)数据1 (25)数据2 (27)数据3 (29)数据4 (30)数据5 (31)数据6 (33)数据7 (36)数据8 (38)1实验2:直线的生成1.1实验要求和目的理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力;编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。

1.2实验课时3学时1.3实验环境本试验提供自带实验平台·开发环境:Visual C++ 6.0·实验平台:Free_Curve(自制平台)1.4实验内容本实验提供名为 Experiment_Frame_One的平台,该平台提供基本绘制、设置、输入功能,学生在此基础上实现·平台界面:如图1.4.1所示·设置:通过view->setting菜单进入,如图1.4.2所示·输入:通过view->input…菜单进入,如图1.4.3所示·实现算法:▪DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1)▪Mid_Bresenham算法:voidCExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)图 1.4.1 总界面图 1.4.2 设置界面图 1.4.3 输入界面1.5核心代码本次实验的核心代码如下所示。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告
在计算机图形学课程中,实验是不可或缺的一部分。

通过实验,我们可以更好地理解课程中所学的知识,并且在实践中掌握这些
知识。

在本次实验中,我学习了如何使用OpenGL绘制三维图形,并了解了一些基本的图形变换和视图变换。

首先,我们需要通过OpenGL的基本命令来绘制基本图形,例
如线段、矩形、圆等。

这些基本的绘制命令需要首先设置OpenGL 的状态,例如绘制颜色、线段宽度等,才能正确地绘制出所需的
图形。

然后,在实验中我们学习了图形的变换。

变换是指通过一定的
规则将图形的形状、位置、大小等进行改变。

我们可以通过平移、旋转、缩放等变换来改变图形。

变换需要按照一定的顺序进行,
例如先进行旋转再进行平移等。

在OpenGL中,我们可以通过设
置变换矩阵来完成图形的变换。

变换矩阵包含了平移、旋转、缩
放等信息,通过矩阵乘法可以完成图形的复合变换。

最后,视图变换是指将三维场景中的图形投影到二维平面上,
成为我们所见到的图形。

在实验中,我们学习了透视投影和正交
投影两种方式。

透视投影是指将场景中的图形按照视点不同而产
生不同的远近缩放,使得图形呈现出三维感。

而正交投影则是简单地将场景中的图形按照平行投影的方式呈现在屏幕上。

在OpenGL中,我们可以通过设置视图矩阵和投影矩阵来完成视图变换。

通过本次实验,我对于计算机图形学有了更深入的了解,并掌握了一些基本的图形绘制和变换知识。

在今后的学习中,我将继续学习更高级的图形绘制技术,并应用于实际的项目中。

计算机图形学第五次实验报告

计算机图形学第五次实验报告

《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形, 并实践图形的造型与变换等。

二、理论基础运用几何造型, 几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。

1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。

三. 算法设计与分析真实感图形绘制过程中, 由于投影变换失去了深度信息, 往往导致图形的二义性。

要消除这类二义性, 就必须在绘制时消除被遮挡的不可见的线或面, 习惯上称之为消除隐藏线和隐藏面, 或简称为消隐, 经过消隐得到的投影图称为物体的真实图形。

消隐处理是计算机绘图中一个引人注目的问题, 目前已提出多种算法, 基本上可以分为两大类:即物体空间方法和图象空间方法。

物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。

用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。

1).消隐算法的实现1.物体空间的消隐算法物体空间法是在三维坐标系中, 通过分析物体模型间的几何关系, 如物体的几何位置、与观察点的相对位置等, 来进行隐藏面判断的消隐算法。

世界坐标系是描述物体的原始坐标系, 物体的世界坐标描述了物体的基本形状。

为了更好地观察和描述物体, 经常需要对其世界坐标进行平移和旋转, 而得到物体的观察坐标。

物体的观察坐标能得到描述物体的更好视角, 所以物体空间法通常都是在观察坐标系中进行的。

观察坐标系的原点一般即是观察点。

物体空间法消隐包括两个基本步骤, 即三维坐标变换和选取适当的隐藏面判断算法。

选择合适的观察坐标系不但可以更好地描述物体, 而且可以大大简化和降低消隐算法的运算。

因此, 利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。

这需要对物体进行三维旋转和平移变换。

常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序法、光线投射法和区域子分法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南昌大学实验报告计算机图形学实验学生姓名:学号: 6100专业班级:计科112班教学老师:徐老师目录一、实验一直线和圆 (1)二、实验二填充算法 (5)三、实验三裁剪算法 (7)四、实验四曲线的绘制(Bezier) (11)五、实验五曲线的绘制(B样条) (14)南昌大学实验报告一学生姓名:学号:6100 专业班级:计科112 班实验类型:□验证■综合□设计□创新实验日期:实验成绩:一.实验名称直线和圆二.实验目的1、掌握中点画圆算法2、熟悉曲线的整数加减来计算沿圆周的像素位置三.实验内容1、使用中点画圆算法,熟悉算法的内容和原理。

2、通过改变参数值设定背景色和圆的大小四.实验结果如图2-1.画直线算法如图2-2.中点画圆算法五.程序源码://Line.cpp#include<GL/glut.h>void init(void){glClearColor(1.0,1.0,1.0,0.0) ;glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,200.0,0.0,150.0);}void lineSegment(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glBegin(GL_LINES);glVertex2i(180,15);glVertex2i(10,145);glEnd();glFlush();}void main(int argc,char**argv) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_SING LE|GLUT_RGB);glutInitWindowPosition(50,100 );glutInitWindowSize(400,300);glutCreateWindow("Line");init();glutDisplayFunc(lineSegment);glutMainLoop();}`#include<GL/glut.h> void init(void) {glClearColor(1.0,1.0,1.0,0.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,200.0,0.0,150.0);}class screenPt{private:GLint x,y;public:screenPt(){x=y=0;}void setCoords(GLint xCoordValue,GLint yCoordValue){x=xCoordValue;y=yCoordValue;}GLint getx()const{return x;}GLint gety()const{return y;}void incrementx(){x++;}void decrementy(){y--;}};void setPixel(GLint xCoord,GLint yCoord){glBegin(GL_POINTS);glVertex2i(xCoord,yCoord);glEnd();}void circleMidpoint(GLint xc,GLint yc,GLint radius){screenPt circPt;GLint p=1-radius;circPt.setCoords(0,radius);voidcirclePlotPoints(GLint,GLint,scr eenPt);circlePlotPoints(xc,yc,circPt );while(circPt.getx()<circPt.ge ty()){circPt.incrementx();if(p<0)p+=2*circPt.getx()+1;else{circPt.decrementy();p+=2*(circPt.getx()-circPt.ge ty())+1;}circlePlotPoints(xc,yc,circPt );}}void circlePlotPoints(GLint xc,GLint yc,screenPt circPt){setPixel(xc+circPt.getx(),yc+ circPt.gety());setPixel(xc-circPt.getx(),yc+ circPt.gety());setPixel(xc+circPt.getx(),yc-circPt.gety());setPixel(xc-circPt.getx(),yc-circPt.gety());setPixel(xc+circPt.gety(),yc+ circPt.getx());setPixel(xc-circPt.gety(),yc+ circPt.getx());setPixel(xc+circPt.gety(),yc-circPt.getx());setPixel(xc-circPt.gety(),yc-circPt.getx());}void display(void){screenPt a;glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);//glViewport(0,0,500,500);circleMidpoint(90,90,50);circlePlotPoints(8,8,a);glFlush();}void main(int argc,char**argv) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_SING LE|GLUT_RGB);glutInitWindowPosition(50,100 ); glutInitWindowSize(400,300);glutCreateWindow("Circle"); init();glutDisplayFunc(display);glutMainLoop();}南昌大学实验报告二学生姓名:学号:6100 专业班级:计科112 班实验类型:□验证■综合□设计□创新实验日期:实验成绩:一.实验名称:区域填充二.实验目的1、掌握种子填充算法。

三.实验内容1、熟悉和掌握种子填充算法。

四.实验结果如图3-1.区域填充五.程序源码:#include<GL/glut.h>#include<stdlib.h>#include<math.h>#include<windows.h>void init(void){glClearColor(1.0,1.0,1.0,0.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,300.0,0.0,300.0);/ /初始化投影窗口,保持与显示的窗口一致}void setPixel(int x,int y,long fillColor)//定义setPixel函数{glColor3f(fillColor<<16,fillColor <<8,fillColor);glBegin(GL_POINTS);glVertex2i(x,y);glEnd();}void boundaryFill4(int x,int y,long fillColor,long borderColor)//递归的边界填充算法{unsigned char params[3];long interiorColor;glReadPixels(x,y,1,1,GL_RGB,GL_UN SIGNED_BYTE,params);interiorColor=RGB(params[0],param s[1],params[2]);//内部颜色获取if(interiorColor!=borderColor&&in teriorColor!=fillColor)//递归{setPixel(x,y,fillColor);boundaryFill4(x+1,y,fillColor,bor derColor);//boundaryFill4(x-1,y,fillColor,bor derColor);//左boundaryFill4(x,y+1,fillColor,bor derColor);//上boundaryFill4(x,y-1,fillColor,bor derColor);//下}}void lineSegment(void){long borderColor=RGB(255,0,0);//定义边界颜色long fillColor=RGB(0,0,255);//定义填充颜色glClear(GL_COLOR_BUFFER_BIT);glColor3f(255,0,0);glBegin(GL_LINE_LOOP);//画填充的六边形glVertex2i(0,40);glVertex2i(20,0);glVertex2i(60,0);glVertex2i(80,40);glVertex2i(60,80);glVertex2i(20,80);glEnd();boundaryFill4(60,60,fillColor,bor derColor);//调用递归函数glFlush();}void main(int argc,char** argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|G LUT_RGB);glutInitWindowPosition(150,100);glutInitWindowSize(300,300);glutCreateWindow("种子填充");init();glutDisplayFunc(lineSegment);glutMainLoop();}南昌大学实验报告三学生姓名:学号:610 专业班级:计科112 班实验类型:□验证■综合□设计□创新实验日期:实验成绩:一.实验名称:裁剪算法二.实验目的1、掌握梁友栋算法。

2、提高程序编写能力。

三.实验内容1、掌握梁友栋算法2、学会编写程序四.实验结果如图1.梁友栋-Barsky线段裁剪五.程序源码#include <stdio.h>#include <gl\glut.h>#include <stdlib.h>#include <math.h>class wcPt2D{public:GLfloat x,y;void setCoords(GLfloat xCoord,GLfloatyCoord){x=xCoord;y=yCoord;}GLfloat getx() const{return x;}GLfloat gety() const{return y;} };inline GLint round(const GLfloat a){return GLint(a+0.5);}void setPixel(int x,int y){glBegin(GL_POINTS);glVertex2i(x,y);glEnd();}void init(){glClearColor(1.0,1.0,1.0,0.0);glMatrixMode (GL_PROJECTION);gluOrtho2D(-200.0,200.0,-200.0,20 0.0);}void lineBres(GLfloat x0,GLfloat y0,GLfloat xEnd,GLfloat 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;}setPixel(x,y);while(x<xEnd){x++;if(p<0)p+=twoDy;else{y++;p+=twoDyMinusDx;}setPixel(x,y);}}GLint clipTest(GLfloat p,GLfloat q,GLfloat *u1,GLfloat *u2){GLfloat r;GLint Value = true;if(p<0.0){r = q/p;if(r>*u2)Value = false;elseif(r>*u1)*u1 = r;}elseif(p>0.0){r = q/p;if(r<*u1)Value = false;else if(r<*u2)*u2 = r;}elseif(q<0.0)Value = false;return(Value);}void lineClipLiangBarsk(wcPt2D winMin,wcPt2D winMax,wcPt2D p1,wcPt2D p2){GLfloat u1 = 0.0,u2 = 1.0,dx = p2.getx()-p1.getx(),dy;GLfloat x1 = p1.getx(),y1 = p1.gety();GLfloat x2 = p2.getx(),y2 = p2.gety();if(clipTest(-dx,p1.getx()-winMin. getx(),&u1,&u2))if(clipTest(dx,winMax.getx()-p1.g etx(),&u1,&u2)){dy = p2.gety()-p1.gety();if(clipTest(-dy,p1.gety()-winMin. gety(),&u1,&u2)){if(clipTest(dy,winMax.gety()-p1.g ety(),&u1,&u2)){if(u2<1.0){p2.setCoords(p1.getx()+u2*dx,p1.g ety()+u2*dy);}if(u1>0.0){p1.setCoords(p1.getx()+u1*dx,p1.g ety()+u1*dy);}glColor3f(0.0,1.0,0.0);//裁剪了的线的颜色。

相关文档
最新文档