计算机图形学实验报告 课程设计 大作业
计算机图形学课程设计综合实验报告
西南交通大学信息科学与技术学院计算机图形学实验(2014~2015学年第II学期)实验报告学号:20122712 姓名:魏仁斌专业:软件工程班级: 4课程名称计算机图形学班级软件4班学号___20122712 姓名___魏仁斌 _试验日期2015.3.16实验成绩____ _ 实验名称实验 1 集成开发环境的认识和简单窗口程序移植与创建1. 实验目的熟悉windows编程和VC++编程环境2. 实验设备与环境硬件设备:软件设计工具: Microsoft Visual C++ 6.03. 实验设计说明基本工作原理: windows提供了一系列的API函数实验内容:用VC++创建工程,并且创建一个简单的窗口实验设计步骤、设计过程或执行顺序①可单击Windows桌面上的“开始”按钮,弹出开始菜单,点击→所有程序→MicrosoftVisual Studio 6.0→Microsoft Visual C++ 6.0,单击后进入开发环境。
②用鼠标单击 File 菜单中的 New 菜单项,在系统弹出的对话框中,有四大工作类型供操作选择:Files、Projects、Workspaces、Other Documents,每种类型又包含许多具体的文件类型。
③选择 Projects 标签,在 Project name 下的编辑框中输入应用工程的名称为实验1。
在 Location 标签下的编辑框中,输入保存文件的位置,也可以用鼠标点击旁边的“…”按钮来选择保存文件的目录。
④选择 Projects 标签下的 Win32 Application,点击OK按钮后,自动创建新的工作空间。
⑤本例选择创建空白应用工程(An empty project),单击 Finsh按钮。
⑥点击“OK”按钮,建立空白的Win32应用工程。
⑦用鼠标单击File菜单中New菜单项,在系统弹出的对话框中,在Files标签下,选择C++Source File,在右方的File编辑框中输入源程序文件的名称后单击“OK”。
计算机图形学实验报告4
计算机图形学实验报告4一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学中的一些关键概念和技术,通过实际操作和编程实现,提高对图形生成、变换、渲染等方面的理解和应用能力。
二、实验环境本次实验使用的软件环境为_____,编程语言为_____,硬件环境为_____。
三、实验内容1、二维图形的绘制使用基本的绘图函数,如直线、矩形、圆形等,绘制简单的二维图形。
通过设置线条颜色、填充颜色等属性,增强图形的表现力。
2、图形的几何变换实现图形的平移、旋转和缩放操作。
观察不同变换参数对图形的影响。
3、三维图形的生成构建简单的三维模型,如立方体、球体等。
应用光照和材质效果,使三维图形更加逼真。
四、实验步骤1、二维图形的绘制首先,在编程环境中导入所需的图形库和相关模块。
然后,定义绘图窗口的大小和坐标范围。
接下来,使用绘图函数按照指定的坐标和参数绘制直线、矩形和圆形。
最后,设置图形的颜色和填充属性,使图形更加美观。
2、图形的几何变换对于平移操作,通过修改图形顶点的坐标值来实现水平和垂直方向的移动。
对于旋转操作,根据旋转角度计算新的顶点坐标,实现图形的绕中心点旋转。
对于缩放操作,将图形的顶点坐标乘以缩放因子,达到放大或缩小图形的效果。
3、三维图形的生成首先,定义三维模型的顶点坐标和三角形面的连接关系。
然后,设置光照的位置、颜色和强度等参数。
接着,为模型添加材质属性,如颜色、反射率等。
最后,使用渲染函数将三维模型显示在屏幕上。
五、实验结果与分析1、二维图形的绘制成功绘制出了各种简单的二维图形,并且通过颜色和填充的设置,使图形具有了更好的视觉效果。
例如,绘制的矩形和圆形边缘清晰,颜色鲜艳,填充均匀。
2、图形的几何变换平移、旋转和缩放操作都能够准确地实现,并且变换效果符合预期。
在旋转操作中,发现旋转角度的正负会影响旋转的方向,而缩放因子的大小直接决定了图形的缩放程度。
3、三维图形的生成生成的三维模型具有一定的立体感和真实感。
《计算机图形学》实验报告
《计算机图形学》实验报告目录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基本图元绘制实验课程名称计算机图形学||专业班级:计算机11K1学生姓名:王粲学号:111909010118成绩:指导教师:姜丽梅实验日期:2014.4.20实验一、OpenGL基本图元绘制实验一、实验目的及要求1.掌握计算机图形学及交互式计算机图形学的定义,了解OpenGL的功能及工作流程,掌握基于OpenGL Glut库的程序框架。
2.掌握基本的二维线画图元的绘制算法及属性,掌握OpenGL基本图元的绘制。
3.理解二维、三维图形的绘制流程,掌握二维图形和三维图形的图形变换。
4.了解形体的真实感表示的内容,包括消隐技术、简单光照明模型、多边形的明暗绘制技术以及纹理映射技术。
5.要求使用OpenGL及GLUT库在Visual C++环境下编写图形绘制程序实现基本图元绘制。
6.要求对绘制的简单场景综合利用几何变换或gluLookAt函数实现交互式三维观察程序。
二、实验内容在两个具有不同属性的窗口中分别显示一个旋转的三角形来演示单缓存和双缓存,在旋转过程中不断改变图形的颜色,利用鼠标或菜单可终止/启动图形旋转。
明确程序包括哪些函数,各个函数的功能以及整个流程,从而为进一步做综合性的图形绘制实验奠定基础。
三、所用仪器、设备Windows XP系统,Visual C++,OpenGL及GLUT库四、实验方法与步骤先配置环境,把相关文件放到相应的文件夹C:\Program Files\Microsoft Visual Studio\VC98\Include\GLC:\WINDOWS\system32C:\Program Files\Microsoft Visual Studio\VC98\Lib再通过VC++进行编译五、程序代码#include <gl/glut.h>#include <stdlib.h>#include < stdio.h >#include <math.h>#define DEG_TO_RAD 0.017453static GLfloat theta = 0.0;GLfloat r = 1.0; //设置正方形的初始颜色GLfloat g = 0.0;GLfloat b = 0.0;int singleb,doubleb;void display(void){ glClear(GL_COLOR_BUFFER_BIT); //正方形颜色渐变glColor3f(r, g,b);r = r - 0.002;g = g + 0.002;b = b + 0.001;if(r < 0.001){ r = 1.0;g = 0.0;b = 0.0; }glBegin(GL_POLYGON);glVertex2f(cos(DEG_TO_RAD*theta), sin(DEG_TO_RAD*theta));glVertex2f(cos(DEG_TO_RAD*(theta+90)),sin(DEG_TO_RAD*(theta+90)));glVertex2f(cos(DEG_TO_RAD*(theta+180)),sin(DEG_TO_RAD*(theta+180)));glVertex2f(cos(DEG_TO_RAD*(theta+270)), sin(DEG_TO_RAD*(theta+270)));glEnd();glutSwapBuffers();}void spinDisplay (void) //正方形转动弧度设置{theta = theta +0.1;if (theta > 360.0)theta = theta - 360.0;glutSetWindow(singleb);glutPostWindowRedisplay(singleb);glutSetWindow(doubleb);glutPostWindowRedisplay(doubleb);}void spinDisplay1(void){glutPostRedisplay();}void myReshape(int w, int h){glViewport(0, 0, w, h); //指定平面上一个矩形裁剪区域,glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)gluOrtho2D(-1.,1.,-1.*(GLfloat)h/(GLfloat)w,1.*(GLfloat)h/(GLfloat)w);elsegluOrtho2D(-1.*(GLfloat)w/(GLfloat)h, 1.*(GLfloat)w/(GLfloat)h, -1., 1.);}void mouse(int button,int state,int x,int y) //鼠标定义{ switch(button){case GLUT_LEFT_BUTTON:if(state == GLUT_DOWN ){ glutIdleFunc(spinDisplay1);}break;case GLUT_RIGHT_BUTTON:if(state == GLUT_DOWN)glutIdleFunc(spinDisplay);break;default:break;}}void main(int argc, char** argv) //主函数{glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowPosition(100, 100);glutInitWindowSize(500, 500);singleb=glutCreateWindow("spinning square"); glClearColor(1.0, 1.0, 0.0, 0.1);glutDisplayFunc(display);glutReshapeFunc(myReshape);glutIdleFunc(spinDisplay);glutMouseFunc(mouse);glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowPosition(600, 100);glutInitWindowSize(500, 500);doubleb=glutCreateWindow("spinning square"); glClearColor(1.0, 1.0, 0.0, 0.1);glutDisplayFunc(display);glutReshapeFunc(myReshape);glutIdleFunc(spinDisplay);glutMouseFunc(mouse);glutMainLoop();}六、实验结果实验二、OpenGL三维观察综合实验一、目的与要求7.掌握计算机图形学及交互式计算机图形学的定义,了解OpenGL的功能及工作流程,掌握基于OpenGL Glut库的程序框架。
计算机图形学实验报告
计算机图形学实验报告
实验目的:通过本次实验,深入了解并掌握计算机图形学的基本原理和相关技术,培养对图形处理的理解和能力。
实验内容:
1. 图像的基本属性
- 图像的本质及表示方法
- 像素和分辨率的概念
- 灰度图像和彩色图像的区别
2. 图像的处理技术
- 图像的采集和处理
- 图像的变换和增强
- 图像的压缩和存储
3. 计算机图形学的应用
- 图像处理在生活中的应用
- 计算机辅助设计中的图形学应用
- 三维建模和渲染技术
实验步骤和结果:
1. 在计算机图形学实验平台上加载一张测试图像,分析其像素构成
和基本属性。
2. 运用图像处理技术,对测试图像进行模糊、锐化、色彩调整等操作,观察处理后的效果并记录。
3. 学习并掌握计算机图形学中常用的处理算法,如卷积、滤波等,
尝试应用到测试图像上并进行实验验证。
4. 探讨计算机图形学在数字媒体制作、虚拟现实、计算机辅助设计
等领域的应用案例,并总结其在实践中的重要性和价值。
结论:
通过本次实验,我对计算机图形学有了更深入的了解,掌握了图像
处理技术的基本原理和应用方法。
计算机图形学作为一门重要的学科,对多个领域有着广泛的应用前景,有助于提高数字媒体技术、虚拟现
实技术等领域的发展水平。
希望在未来的学习和工作中能进一步深化
对计算机图形学理论和实践的研究,不断提升自己在这一领域的专业
能力和创新意识。
《计算机图形学》实验报告
实验报告模板《计算机图形学》实验报告一、实验目的及要求1.实习三维图形的坐标系之间的变换;2.三维图形几何变换;3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;4.实现二维图形的基本变换(平移、旋转、缩放、错切、对称、复合等);5.实现三维图形的基本变换(平移、旋转、缩放、复合等);二、理论基础在齐次坐标理论下,二维图形几何变换矩阵可用下式表示:⎪⎪⎪⎭⎫⎝⎛===ifchebgdaTnkxx kk2,1,0,)(ϕ平移变换:[x* y* 1] =[x y 1] *0000001ts⎛⎫⎪⎪⎪⎝⎭=[t*x s*y 1]比例变换:[x* y* 1]=[x y 1] *1000101m n⎛⎫⎪⎪⎪⎝⎭=[m+x n+y 1]旋转变换:在平面上的二维图形饶原点逆时针旋转Ө角,变换矩阵为[x* y* 1]=[x y 1] *cos sin0sin cos0001θθθθ⎛⎫⎪- ⎪⎪⎝⎭= [x*cosө-y*sinө]复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时候,我们就要用到复合变换矩阵。
三维变换类似于二维,在画图时,把三维坐标转换为二维即可。
三、算法设计与分析二维变换:#define dx 50#define dy 100void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+dx;a[1]=m[i][1]+dy;b[0]=m[i+1][0]+dx;b[1]=m[i+1][1]+dy;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define h 0.1745#include<math.h>void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*cos(h)-m[i][1]*sin(h);a[1]=m[i][1]*cos(h)+m[i][0]*sin(h);b[0]=m[i+1][0]*cos(h)-m[i+1][1]*sin(h);b[1]=m[i+1][1]*cos(h)+m[i+1][0]*sin(h);DDALine(a,b, RGB(0, 200, 255), pDC);}}#define k 2;#define f 2.5void CCGWithVCView::OnTransMove() //缩放{// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Scale Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*k;a[1]=m[i][1]*f;b[0]=m[i+1][0]*k;b[1]=m[i+1][1]*f;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define n 2#define d 0void CCGWithVCView::OnTransOther(){// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Other Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+n*m[i][1];a[1]=m[i][1]+d*m[i][0];b[0]=m[i+1][0]+n*m[i+1][1];b[1]=m[i+1][1]+d*m[i+1][0];DDALine(a,b, RGB(0, 200, 255), pDC);}}三维变换:#include<math.h>#define dx 100#define dy 100#define dz 0void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]+dy-p3d[i][0]+dx/sqrt(2);p2d[i][1]=p3d[i][2]+dz+p3d[i][0]+dx/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}#define k 0.1745void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]*cos(k)-p3d[i][2]*sin(k)-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]*cos(k)+p3d[i][1]*sin(k)+p3d[i][0]/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。
《计算机图形学》实验4实验报告
实验4实验报告格式实验报告格式《计算机图形学》实验4实验报告实验报告实验题目:参数曲线绘制实验内容:1 圆的参数曲线绘制。
2显式数学曲线描绘程序。
显式数学曲线描绘程序。
3贝赛尔曲线绘制。
贝赛尔曲线绘制。
编写程序调用验证之。
编写程序调用验证之。
参考资料:1 circleParam.java2 explicitCurve.java3 BezierLine.java4 数学曲线绘制.ppt 和实验3的参考ppt基本概念:(详细叙述自己对实验内容的理解)(详细叙述自己对实验内容的理解)(1)圆的参数曲线绘制: 圆的参数曲线绘制就是按照圆的定义,利用步长,圆的参数曲线绘制就是按照圆的定义,利用步长,得在显示得在显示域上每一点的位置,然后绘制,圆是图形中经常使用的元素,圆是图形中经常使用的元素,圆被定义为所有离一中心位置圆被定义为所有离一中心位置),(yc xc 距离为给定值距离为给定值R 的点集,其函数方程为:222)()(R yc y xc x =-+-参数方程为:{)20(cos sin p £<+=+=t tR Xc X t R Yc Y根据已知的Xc 和Yc ,以及t 可以确定一个圆。
可以确定一个圆。
(2)显示数学曲线描绘程序:显示曲线的绘制就是在已知的坐标系上,按照方程要求在固定的点画点,然后连接成一条线,例如如果曲线的方程式:c bx ax y ++=2,利用这个公式的递推演算,我们依次从-x 到+x 来绘制。
来绘制。
(3)贝塞尔曲线的绘制:贝赛尔曲线的每一个顶点都有两个控制点,用于控制在顶点两侧的曲线的弧度。
它是应用于二维图形应用程序的数学曲线。
它是应用于二维图形应用程序的数学曲线。
曲线的定义有四个点:曲线的定义有四个点:曲线的定义有四个点:起始起始点、终止点(也称锚点)以及两个相互分离的中间点。
滑动两个中间点,贝塞尔曲线的形状会发生变化。
例如下面的公式:)10)(()(0,££=å=t t B p t p ni n i i算法设计:(详细叙述自己设计的的算法)(详细叙述自己设计的的算法)(1)圆的算法设计:本例体现的主要是圆的快速算法,这里的主要算法是:本例体现的主要是圆的快速算法,这里的主要算法是:{)20(cos sin p £<+=+=t t R Xc X t R Yc Y t 是圆的某一点与X 轴之间的夹角。
计算机图形学实习报告
计算机图形学实习报告计算机图形学课程设计实验报告姓名:学号:专业:地理信息系统⼀、课程设计⽬的在掌握图形学的基本原理、算法和实现技术基础上,通过编程实践学会基本的图形软件开发技术。
⼆、课程设计内容仿照Windows的附件程序“画图”, ⽤C++语⾔编制⼀个具有交互式绘制和编辑多种图元功能的程序“Mini-Painter”,实现以下功能对应的设计内容:(1) 能够以交互⽅式在图形绘制区绘制点、直线(折线)、圆(椭圆)、圆弧、多边形、Beizer曲线、封闭区域填充、⽂字等基本图元;(2) 设置线条的颜⾊、线型和线条宽度,对绘制的图元进⾏线条和填充属性的修改;(3) ⽀持图元的点选和基于橡⽪筋技术的圈选;(4) 对选中的图元进⾏平移、缩放、旋转和对称等变换;三、实验步骤1.新建MFC应⽤程序1.1新建⼯程。
运⾏VC++6.0,新建⼀个MFC AppWizard[exe]⼯程,并命名为“0710070118”,选择保存路径,确定。
1.2选择应⽤程序的类型,选择“单⽂档”,则可以通过菜单打开对话框2.建⽴单⽂档应⽤程序,在其中调⽤对话框2.1 查看⼯程资源在单击完成之后,即建⽴了⼀个⼯程,在⼯程的左侧资源视图可以看到MFC向导为该程序提供的⼀些资源。
分别如下所⽰:2.2插⼊对话框资源想在⽂档应⽤程序中,通过单击菜单来打开⼀个对话框,⾸先要建⽴该对话框的资源。
右击“resources ”中的“dialog ”项,在弹出的菜单中选择“插⼊”,打开插⼊菜单对话框,如图所⽰:对话框资源插⼊后,可修改⼀些属性,⽐如标题、字体等等。
在对话框空⽩处右击,选择属性就可打开资源的属性对话框,按照要求设置对话框的属性。
2.3布置对话框界⾯对话框资源插⼊后,即可在该对话框上布置各种需要的控件,并可通过编排菜单的各种命令或“对话”⼯具条调整各控件的⼤⼩,位置,对齐⽅式等,还可以单击对话⼯具条上第⼀个按钮“测试”按钮,看到对话框运⾏时的界⾯。
计算机图形学大作业报告
云南大学软件学院期末课程报告Final Course ReportSchool of Software, Yunnan University个人成绩序号学号姓名成绩1学期: 2009年秋季学期课程名称: 计算机图形学任课教师:实践题目: 创建旋转体小组长:联系电话:电子邮件:2009-2010学年上学期计算机图形学成绩考核表年级:专业:软件工程学号:姓名:本人所做工作:创建旋转体总结报告(GB8567——88)1引言 ............................................................................................................... 错误!未定义书签。
1.1编写目的............................................................................................. 错误!未定义书签。
1.2背景..................................................................................................... 错误!未定义书签。
1.3定义..................................................................................................... 错误!未定义书签。
1.4参考资料............................................................................................. 错误!未定义书签。
2实际开发结果................................................................................................ 错误!未定义书签。
《计算机图形学》实验报告
《计算机图形学》实验报告一、实验目的计算机图形学是一门研究如何利用计算机生成、处理和显示图形的学科。
通过本次实验,旨在深入理解计算机图形学的基本原理和算法,掌握图形的生成、变换、渲染等技术,并能够运用所学知识解决实际问题,提高对图形学的应用能力和编程实践能力。
二、实验环境本次实验使用的编程语言为 Python,使用的图形库为 Pygame。
开发环境为 PyCharm。
三、实验内容1、直线的生成算法DDA 算法(Digital Differential Analyzer)Bresenham 算法DDA 算法是通过计算直线的斜率来确定每个像素点的位置。
它的基本思想是根据直线的斜率和起始点的坐标,逐步计算出直线上的每个像素点的坐标。
Bresenham 算法则是一种基于误差的直线生成算法。
它通过比较误差值来决定下一个像素点的位置,从而减少了计算量,提高了效率。
在实验中,我们分别实现了这两种算法,并比较了它们的性能和效果。
2、圆的生成算法中点画圆算法中点画圆算法的核心思想是通过判断中点的位置来确定圆上的像素点。
通过不断迭代计算中点的位置,逐步生成整个圆。
在实现过程中,需要注意边界条件的处理和误差的计算。
3、图形的变换平移变换旋转变换缩放变换平移变换是将图形在平面上沿着指定的方向移动一定的距离。
旋转变换是围绕一个中心点将图形旋转一定的角度。
缩放变换则是改变图形的大小。
通过矩阵运算来实现这些变换,可以方便地对图形进行各种操作。
4、图形的填充种子填充算法扫描线填充算法种子填充算法是从指定的种子点开始,将相邻的具有相同颜色或属性的像素点填充为指定的颜色。
扫描线填充算法则是通过扫描图形的每一行,确定需要填充的区间,然后进行填充。
在实验中,我们对不同形状的图形进行了填充,并比较了两种算法的适用情况。
四、实验步骤1、直线生成算法的实现定义直线的起点和终点坐标。
根据所选的算法(DDA 或Bresenham)计算直线上的像素点坐标。
《计算机图形学》课内实验报告(实验一)
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
计算机图形学实验报告
计算机图形学实验报告引言计算机图形学是计算机科学中一个重要的研究领域,它涉及了计算机图像的生成、处理和显示等方面的技术。
本次实验旨在通过实际操作学习计算机图形学的相关知识,并利用图形学算法实现一些有趣的效果。
实验目的1. 了解计算机图形学的基本概念和发展历程;2. 掌握图形学中的基本几何变换,如平移、旋转和缩放等;3. 实现一些常见的图形学算法,如光照模型、三角形剪裁和绘制等。
实验准备在开始实验之前,我们需要准备一些实验所需的工具和环境。
首先,确保计算机上安装了图形学相关的软件,如OpenGL或DirectX等。
其次,为了编写和运行图形学程序,我们需要掌握基本的编程技巧,如C++或Python语言,并了解相关的图形库和API。
实验过程1. 实现平移、旋转和缩放首先,我们需要掌握图形学中的基本几何变换,如平移、旋转和缩放。
通过矩阵运算,我们可以很方便地实现这些变换。
例如,对于一个二维点P(x, y),我们可以通过以下公式实现平移:P' = T * P其中,P'是平移后的点,T是平移矩阵。
类似地,我们可以用旋转矩阵和缩放矩阵来实现旋转和缩放效果。
2. 实现光照模型光照模型是指在计算机图形学中模拟现实光照效果的一种方法。
它可以提供更真实的视觉效果,让计算机生成的图像更加逼真。
其中,常用的光照模型有环境光照、漫反射光照和镜面光照等。
通过计算每个像素的光照强度,我们可以实现阴影效果和光源反射等功能。
3. 实现三角形剪裁三角形剪裁是计算机图形学中一种常用的几何算法,用于确定哪些像素需要绘制,哪些像素需要剔除。
通过对三角形的边界和视口进行比较,我们可以快速计算出剪裁后的三角形顶点,以提高图形渲染的效率。
4. 实现图形绘制图形绘制是计算机图形学中的核心内容,它包括了点、线和面的绘制等。
通过设定顶点坐标和属性(如颜色、纹理等),我们可以使用算法绘制出各种形状的图像。
其中,常用的绘制算法有Bresenham算法和扫描线算法等。
计算机图形学作业实验报告
计算机图形学实验报告班级:学号:姓名:指导教师:完成日期:实验一:多边形填充一、实验目的了解多边形属性,熟悉相关函数的调用。
二、实验内容步骤和实现:首先进行初始化工作,进行显示模式(单缓冲区)和窗口等设定,主要实现根据两个函数,一个是指定场景绘制函数,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图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。
计算机图形学实验报告
计算机图形学实验报告计算机图形学实验报告引言计算机图形学是研究计算机生成和处理图像的学科,它在现代科技和娱乐产业中扮演着重要的角色。
本实验报告旨在总结和分享我在计算机图形学实验中的经验和收获。
一、实验背景计算机图形学实验是计算机科学与技术专业的一门重要课程,通过实践操作和编程,学生可以深入了解图形学的基本原理和算法。
本次实验主要涉及三维图形的建模、渲染和动画。
二、实验内容1. 三维图形建模在实验中,我们学习了三维图形的表示和建模方法。
通过使用OpenGL或其他图形库,我们可以创建基本的几何体,如立方体、球体和圆柱体,并进行变换操作,如平移、旋转和缩放。
这些基本操作为后续的图形处理和渲染打下了基础。
2. 光照和着色光照和着色是图形学中重要的概念。
我们学习了不同的光照模型,如环境光、漫反射和镜面反射,并了解了如何在三维场景中模拟光照效果。
通过设置材质属性和光源参数,我们可以实现逼真的光照效果,使物体看起来更加真实。
3. 纹理映射纹理映射是一种将二维图像映射到三维物体表面的技术。
通过将纹理图像与物体的顶点坐标相对应,我们可以实现更加细致的渲染效果。
在实验中,我们学习了纹理坐标的计算和纹理映射的应用,使物体表面呈现出具有纹理和细节的效果。
4. 动画和交互动画和交互是计算机图形学的重要应用领域。
在实验中,我们学习了基本的动画原理和算法,如关键帧动画和插值技术。
通过设置动画参数和交互控制,我们可以实现物体的平滑移动和变形效果,提升用户体验。
三、实验过程在实验过程中,我们首先熟悉了图形库的使用和基本的编程技巧。
然后,我们按照实验指导书的要求,逐步完成了三维图形建模、光照和着色、纹理映射以及动画和交互等任务。
在实验过程中,我们遇到了许多挑战和问题,但通过不断的尝试和调试,最终成功实现了预期的效果。
四、实验结果通过实验,我们成功实现了三维图形的建模、渲染和动画效果。
我们可以通过键盘和鼠标控制物体的移动和变形,同时观察到真实的光照效果和纹理映射效果。
深圳大学计算机图形学大作业实验报告
int Qipan[8][8];
int nR;
int m_y;
int m_x;
int i_y[64];
int i_x[64];
2.部分算法源代码和截图:
(1)直线:
DDA算法:
ddaline (int x0,int y0,int x1,int y1,int color){
double dx, dy, x, y, m;
int xBuf, yBuf;
xBuf = x0; x0 = x1; x1 = xBuf;
yBuf = y0; y0 = y1; y1 = yBuf;
dx = -dx; dy = -dy;
}
if (dx >= (dy>0?dy:-dy)){
m = dy / dx;
y = y0;
for (x = x0; x <= x1; x++){
光照效应:三维图形的面着色;
分形几何:Koch雪花,L系统植物及其他有特色的图形学相关效果等。
二、开发环境:
MicroSoft VC++6.0
三、程序设计说明及源代码::
1.主要数据及函数
OnMxq()//消隐
On3py()//三维平移
On3sf()//三维缩放
On3xz()//三维旋转
CohenSutherlandLineClip(float x0, float y0,float x1,float y1,CRect *rect)// C—S线段剪裁
Horse_Move(int a, int b)//马移动一步
CircleBresenham(CPoint center, int r)//Bresenham画圆
计算机图形学课程设计实习报告
实验零? Visual C++ 2005绘图系统地点:土木楼B401机房时间:星期三下午节次:第三大节一、实验目的:1. 了解Visual C++ 2005绘图的基本概念2. 了解Visual C++ 2005绘图环境3. 掌握用Visual C++ 2005设计绘图项目的基本步骤4. 掌握用Visual C++ 2005绘图的基本命令二、实验内容:实验内容1:创建绘图应用程序主框架实验内容2:应用程序编译运行实验内容3:设置菜单项并生成消息响应函数实验内容4:SetPixel绘图三、实验步骤:实验内容1:创建绘图应用程序主框架步骤:1.创建一个工作目录D:\MyProject2.启动Visual Studio 20053.单击“文件”->“新建”->“项目”,项目类型对话框中选择“其他语言”->“VC++”->“MFC”,模版选择“MFC应用程序”。
在工作目录D:\MyProject 下创建一个新应用项目: Sample,如下图所示。
4.单击“确定”按钮。
5.单击“下一步”按钮。
6.在“应用程序类型中”,选择“单文档”类型。
7.单击“完成”,创建了一项空的工程-绘图应用程序主框架。
实验内容2:应用程序编译运行运行版本有两类:Debug、Release, 生成Debug解决方案步骤如下:1.生成解决方案点击“生成-〉生成解决方案”, 生成了Debug版的可运行程序。
2.调试运行程序点击菜单“调试——〉开始执行(不调试)”, 执行Debug版的可运行程序。
结果如下:生成Release解决方案步骤如下:1.生成解决方案点击“生成-〉批生成”。
2.勾选“Release”,单击“生成”,生成可以独立于Visual C++ 2005外运行的.exe程序。
3.查看目录,sample.exe是Release版,单击即可以运行。
运行结果:实验内容3:设置菜单项并生成消息响应函数1.弹出菜单设计器双击“资源视图”中的“Menu”展开文件夹,双击“IDR_MAINFRAME”,弹出菜单设计器。
计算机图形学实验报告三
《计算机图形学》实验报告glClear(GL_COLOR_BUFFER_BIT);//glEnable(GL_SCISSOR_TEST);//glScissor(0.0f,0.0f,500,300);glutWireTeapot(0.4);glFlush();}//窗口调整子程序void myReshape(int w, int h){glViewport(500, -300, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-1, 1, -(float)h / w, (float)h / w, -1, 1);elseglOrtho(-(float)w / h, (float)w / h, -1, 1, -1, 0.5);}2,使用opengl函数写一个图形程序,要求分别使用三个光源从一个茶壶的前右上方(偏红色),正左侧(偏绿色)和前左下方(偏蓝色)对于其进行照射,完成程序并观察效果。
}//绘图子程序void display(void){glColor3f(1.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);//glMatrixMode(GL_MODELVIEW);//glLoadIdentity();//设置光源的属性1GLfloat LightAmbient1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; //环境光参数 ( 新增 )GLfloat LightDiffuse1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 漫射光参数 ( 新增 )GLfloat Lightspecular1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 镜面反射GLfloat LightPosition1[] = { 500.0f, 500.0f, 500.0f, 1.0f }; // 光源位置 ( 新增 ) glLightfv(GL_LIGHT0, GL_POSITION, LightPosition1);glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();3,使用opengl函数完成一个图形动画程序,显示一个球沿正弦曲线运动的过程,同时显示一个立方体沿抛物线运动过程。
计算机图形学实验报告
计算机图形学实验报告一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学的基本原理、算法和技术,通过实际操作和编程实现,提高对图形生成、处理和显示的能力,培养解决实际图形问题的思维和实践能力。
二、实验环境本次实验使用的编程语言为 Python,借助了相关的图形库如Pygame 或 matplotlib 等。
开发环境为 PyCharm 或 Jupyter Notebook。
三、实验内容(一)二维图形的绘制1、直线的绘制使用 DDA(Digital Differential Analyzer)算法或 Bresenham 算法实现直线的绘制。
通过给定直线的起点和终点坐标,在屏幕或图像上绘制出直线。
比较两种算法的效率和准确性,分析其优缺点。
2、圆的绘制采用中点画圆算法或 Bresenham 画圆算法绘制圆。
给定圆心坐标和半径,生成圆的图形。
研究不同半径大小对绘制效果和计算复杂度的影响。
(二)图形的填充1、多边形填充实现扫描线填充算法,对任意多边形进行填充。
处理多边形的顶点排序、交点计算和填充颜色的设置。
测试不同形状和复杂度的多边形填充效果。
2、图案填充设计自定义的填充图案,如纹理、条纹等,并将其应用于图形填充。
探索如何通过改变填充图案的参数来实现不同的视觉效果。
(三)图形的变换1、平移、旋转和缩放对已绘制的图形(如矩形、三角形等)进行平移、旋转和缩放操作。
通过矩阵运算实现这些变换。
观察变换前后图形的位置、形状和方向的变化。
2、组合变换将多个变换组合应用于图形,如先旋转再平移,或先缩放再旋转等。
分析组合变换的顺序对最终图形效果的影响。
(四)三维图形的表示与绘制1、三维坐标变换学习三维空间中的平移、旋转和缩放变换矩阵,并将其应用于三维点的坐标变换。
理解如何将三维坐标映射到二维屏幕上显示。
2、简单三维图形绘制尝试绘制简单的三维图形,如立方体、球体等,使用线框模型或表面模型。
探讨不同的绘制方法和视角对三维图形显示的影响。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
安徽建筑工业学院计算机图形学实验报告院(系)名称:专业:班级:姓名:学号:指导老师:实验一实现任意直线的中点画线算法【实验目的】掌握直线的中点画线算法;【实验环境】VC++6.0【实验内容】利用任意的一个实验环境,编制源程序,实现直线的中点画线法。
【实验原理】假定直线斜率k在0~1之间,当前象素点为(x p,y p),则下一个象素点有两种可选择点P1(x p+1,y p)或P2(x p+1,y p+1)。
若P1与P2的中点(x p+1,y p+0.5)称为M,Q为理想直线与x=x p+1垂线的交点。
当M在Q的下方时,则取P2应为下一个象素点;当M在Q的上方时,则取P1为下一个象素点。
这就是中点画线法的基本原理。
图2.1.2 中点画线法每步迭代涉及的象素和中点示意图下面讨论中点画线法的实现。
过点(x0,y0)、(x1, y1)的直线段L的方程式为F(x,y)=ax+by+c=0,其中,a=y0-y1, b=x1-x0, c=x0y1-x1y0,欲判断中点M在Q点的上方还是下方,只要把M代入F(x,y),并判断它的符号即可。
为此,我们构造判别式:d=F(M)=F(x p+1, y p+0.5)=a(x p+1)+b(y p+0.5)+c当d<0时,M在L(Q点)下方,取P2为下一个象素;当d>0时,M在L(Q点)上方,取P1为下一个象素;当d=0时,选P1或P2均可,约定取P1为下一个象素;注意到d是x p, y p的线性函数,可采用增量计算,提高运算效率。
若当前象素处于d 0情况,则取正右方象素P1(x p+1, y p),要判下一个象素位置,应计算d1=F(x p+2, y p+0.5)=a(x p+2)+b(y p+0.5)=d+a,增量为a。
若d<0时,则取右上方象素P2(x p+1, y p+1)。
要判断再下一象素,则要计算d2= F(x p+2, y p+1.5)=a(x p+2)+b(y p+1.5)+c=d+a+b ,增量为a+b。
画线从(x0, y0)开始,d的初值d0=F(x0+1, y0+0.5)=F(x0, y0)+a+0.5b,因F(x0, y0)=0,所以d0=a+0.5b。
由于我们使用的只是d的符号,而且d的增量都是整数,只是初始值包含小数。
因此,我们可以用2d代替d来摆脱小数,写出仅包含整数运算的算法程序。
【实验程序】void Midpoint Line (int x0,int y0,int x1, int y1,int color){ int a, b, d1, d2, d, x, y;a=y0-y1; b=x1-x0;d=2*a+b;d1=2*a;d2=2* (a+b);x=x0;y=y0;drawpixel(x, y, color);while (x<x1){ if (d<0) {x++;y++; d+=d2; }else {x++; d+=d1;}drawpixel (x, y, color);} /* while */} /* mid PointLine */举例:用中点画线方法扫描转换连接两点P0(0,0)和P1(5,2)的直线段。
a=y0-y1=-2; b=x1-x0=5; d0=2*a+b=1;d1=2*a=-4;d2=2*(a+b)=6 ,x y d0 0 11 0 -32 1 33 1 -142 552 15 2.1.3 中点画线法实验二实现任意一种线段的裁剪算法以及多边形裁剪算法【实验目的】1、掌握直线段裁剪的基本原理;2、掌握多边形裁剪的基本原理;【实验环境】VC++6.0【实验内容】编制程序,完成直线段和多边形的裁减过程。
【实验原理】1.算法基本思想对每条直线段p1(x1,y1)p2(x2,y2)分三种情况处理:(1) 直线段完全可见,“简取”之。
(2) 直线段完全不可见,“简弃”之。
(3) 直线段既不满足“简取”的条件,也不满足“简弃”的条件,需要对直线段按交点进行分段,分段后重复上述处理。
2.算法步骤(1) 编码对于任一端点(x,y),赋予一个4 位的二进制码D3D2D1D0。
编码规则如下:若x<wxl,则D0=1,否则D0=0;若x>wxr,则D1=1,否则D1=0;若y<wyb,则D2=1,否则D2=0;若y>wyt,则D3=1,否则D3=0。
(2) 裁剪先求出端点p1 和p2 的编码code1 和code2,然后:若code1|code2=0,对直线段应简取之。
若code1&code2≠0,对直线段可简弃之。
若上述两条件均不成立。
则需求出直线段与窗口边界的交点。
在交点处把线段一分为二,其中必有一段完全在窗口外,可以弃之。
再对另一段重复进行上述处理,直到该线段完全被舍弃或者找到位于窗口内的一段线段为止。
(3) 求交假定直线的端点坐标为(x1,y1)和(x2,y2)左、右边界交点的计算上、下边界交点的计算。
3.算法实现(1) 输入直线段的两端点坐标:p1(x1,y1)、p2(x2,y2),以及窗口的四条边界坐标:wyt、wyb、wxl 和wxr。
(2) 对p1、p2 进行编码:点p1 的编码为code1,点p2 的编码为code2。
(3) 若code1|code2=0,对直线段应简取之,转(6);否则,若code1&code2≠0,对直线段可简弃之,转(7);当上述两条均不满足时,进行步骤(4)。
(4) 确保p1 在窗口外部:若p1 在窗口内,则交换p1 和p2 的坐标值和编码。
(5) 按左、右、上、下的顺序求出直线段与窗口边界的交点,并用该交点的坐标值替换p1 的坐标值。
也即在交点s 处把线段一分为二,并去掉p1s 这一段。
考虑到p1 是窗口外的一点,因此可以去掉p1s。
转(2)。
(6) 用直线扫描转换算法画出当前的直线段p1p2。
(7) 算法结束。
【实验程序】一:Cohen-Sutherland线段裁剪算法#include <gl/glut.h>//#include <gl/wingdi.h> /* SetPixel() */#include <math.h>#include <stdio.h>/////////////////////////////////////////////////////////////////// ////////const winLeftBitCode=0x1;const winRightBitCode=0x2;const winBottomBitCode=0x4;const winTopBitCode=0x8;/////////////////////////////////////////////////////////////////// ////////class wcPt2D{ public:GLfloat x,y; };/////////////////////////////////////////////////////////////////// ////////inline int inside(int code){return int (!code);}/////////////////////////////////////////////////////////////////// ///////inline int reject(int code1,int code2){return int (code1&code2);}/////////////////////////////////////////////////////////////////// //////inline int accept(int code1,int code2){return int (!(code1|code2));}//////////////////////////////////////////////////////////////////// /////GLubyte encode(wcPt2D pt,wcPt2D winMin,wcPt2D winMax){GLubyte code=0x00;if(pt.x<winMin.x)code=code|winLeftBitCode;if (pt.x>winMax.x)code=code+winRightBitCode;if(pt.y<winMin.y)code=code|winBottomBitCode;if(pt.y>winMax.y)code=code|winTopBitCode;return (code);}//////////////////////////////////////////////////////////////////// ////////void swapPts(wcPt2D *p1,wcPt2D *p2){wcPt2D tmp;tmp=*p1;*p1=*p2;*p2=tmp;}/////////////////////////////////////////////////////////////////// ///////void swapCodes(GLubyte *c1,GLubyte *c2){GLubyte tmp;tmp=*c1; *c1=*c2;*c2=tmp;}/////////////////////////////////////////////////////////////////// /////void draw_pixel(int ix,int iy/*,int value*/){glBegin(GL_POINTS);glVertex2i(ix,iy);glEnd();}/////////////////////////////////////////////////////////////////// /////int inline round(const float a){return int (a+0.5);}/////////////////////////////////////////////////////////////////// //////void lineDDA(int x0,int y0,int x_end,int y_end,double a,double b,double c){glColor3f(a,b,c);int dx=x_end-x0;int dy=y_end-y0;int steps,k;float xIncrement,yIncrement,x=x0,y=y0;if(abs(dx)>abs(dy))steps=abs(dx);elsesteps=abs(dy);xIncrement=float (dx)/float (steps);yIncrement=float (dy)/float (steps);draw_pixel(round(x),round(y));for (k=0;k<steps;k++){x+=xIncrement;y+=yIncrement;draw_pixel(round(x),round(y));}}//////////////////////////////////////////////////////////////////// ////////////////void lineClipCohSuth(wcPt2D winMin,wcPt2D winMax,wcPt2D p1,wcPt2D p2) {GLubyte code1,code2;GLint done=false,plotLine=false;GLfloat m;while(!done){code1=encode(p1,winMin,winMax);code2=encode(p2,winMin,winMax);if(accept(code1,code2)){done=true;plotLine=true;}elseif(reject(code1,code2))done=true;else{if(inside(code1)){swapPts(&p1,&p2);swapCodes(&code1,&code2);}if(p2.x!=p1.x)m=(p2.y-p1.y)/(p2.x-p1.x);if(code1&winLeftBitCode){p1.y+=(winMin.x-p1.x)*m;p1.x=winMin.x;}elseif(code1&winRightBitCode){p1.y+=(winMax.x-p1.x)*m;p1.x=winMax.x;}elseif(code1&winBottomBitCode){if(p2.x!=p1.x)p1.x+=(winMin.y-p1.y)/m;p1.y=winMin.y;}elseif(code1&winTopBitCode){ if(p2.x!=p1.x)p1.x+=(winMax.y-p1.y)/m;p1.y=winMax.y;}}}if(plotLine)lineDDA(round(p1.x),round(p1.y),round(p2.x),r ound(p2.y),0.0,0.0,1.0);}//////////////////////////////////////////////////////////////////// ///////////////////void display(){glClear(GL_COLOR_BUFFER_BIT);wcPt2DwinMin,winMax,p1,p2,q1,q2,t1,t2,m1,m2;//裁剪窗口winMin.x=80;winMin.y=100;winMax.x=290;winMax.y=500;/*lineDDA(80,100,80,450,1.0,0.0,0.0);lineDDA(80,100,290,100,1.0,0.0,0.0);lineDDA(290,100,290,450,1.0,0.0,0.0);lineDDA(80,450,290,450,1.0,0.0,0.0);*//* //全图winMin.x=0;winMin.y=000;winMax.x=500;winMax.y=500;*////////////////////////p1.x=0;p1.y=0;p2.x=400;p2.y=400;//////////////////////q1.x=0;q1.y=0;q2.x=100;q2.y=400;//////////////////////t1.x=100;t1.y=400;t2.x=400;t2.y=400;//////////////////////m1.x=300;m1.y=200;m2.x=100;m2.y=400;//只显示裁剪框内的线段lineClipCohSuth(winMin,winMax,p1,p2);lineClipCohSuth(winMin,winMax,q1,q2);lineClipCohSuth(winMin,winMax,t1,t2);lineClipCohSuth(winMin,winMax,m1,m2) ;//显示裁剪框和待剪线段/*lineDDA(300,200,100,400,0.0,0.0,1.0);lineDDA(0,0,100,400,0.0,0.0,1.0);lineDDA(100,400,400,400,0.0,0.0,1.0);lineDDA(0,0,400,400,0.0,0.0,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,500.0,0.0,500.0);glViewport(0,0,200,500);}void main(int argc,char **argv ){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GL UT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(200.0,200.0);glutCreateWindow("CG_test_CG_test_Co hen-Sutherland 线段裁剪算法示例");// glutFullScreen();glutDisplayFunc(display);myinit();glutMainLoop();}稍微修改源程序即可得到以下裁剪框以及被裁剪线段:二:Sutherland_Hodgman多边形裁剪算法#define TRUE 1#define FALSE 0typedef struct {float x, y;} vertex;void intersect(p1, p2, clipboundary, intersectp)vertex p1, p2, *clipboundary, *intersectpt;/* p1和p2为多边形的边的起点和终点,clipboundary为窗口边界,intersectpt中返回边与窗口边界的交点*/{if ( clipboundary[0].y== clipboundary[1].y ) /* 水平边界*/{intersectpt->y = clipboundary[0].y;intersectpt->x = p1.x + (clipboundary[0].y-p1.y)*(p2.x-p1.x)/(p2.y-p1.y);}else /* 垂直边界*/{intersectpt->x = clipboundary[0].x;intersectpt->y = p1.y + (clipboundary[0].x-p1.x)*(p2.y-p1.y)/(p2.x-p1.x);}}int inside(testvertex, clipboundary)vertex testvertex, *clipboundary;/* 如果顶点testvertex在窗口边界clipboundary 的内部,那么返回TRUE;否则返回FALSE */{if ( clipboundary[1].x < clipboundary[0].x ) /* 上边界*/if ( testvertex.y <= clipboundary[0].y )return TRUE;if ( clipboundary[1].x > clipboundary[0].x ) /* 下边界*/if ( testvertex.y >= clipboundary[0].y )return TRUE;if ( clipboundary[1].y > clipboundary[0].y ) /* 右边界*/if ( testvertex.x <= clipboundary[0].x )return TRUE;if ( clipboundary[1].y < clipboundary[0].y ) /* 左边界*/if ( testvertex.y <= clipboundary[0].x )return TRUE;return FALSE;}outputvertex(outvertex, outlength, outvertexlist)vertex outvertex;int *outlength;vertex *outvertexlist/* 向输出顶点序列中输出顶点outvertex */{outvertexlist[*outlength] = outvertex;(*outlength)++;}voidSutherland_Hodgman_Polygon_Clipping(invertexlist, outvertexlist, inlength, outlength, clipboundary) vertex *invertexlist, *outvertexlist;int inlength, *outlength;vertex *clipboundary;/* invertexlist为输入顶点序列,inlength为输入序列长度;outvertexlist为输出顶点序列,outlenght 中返回输出序列长度;clipboundary为窗口边界*/ {vertex s, p, i;int j;*outlength = 0;s = invertexlist[inlength-1]; /* 输入顶点序列的最后一个顶点*/for ( j=0; j<inlength; j++ ){p = invertexlist[j];if ( inside(p,clipboundary) ) /* 情况1和4 */{if ( inside(s,clipboundary) ) /* 情况1 */outputvertex(p,outlength,outvertexlist);else /* 情况4 */{intersect(s,p,clipboundary,&i);outputvertex(i,outlength,outvertexlist);outputvertex(p,outlength,outvertexlist);}}else /* 情况2和3 */{ if ( inside(s,clipboundary) ) /* 情况2 */{intersect(s,p,clipboundary,&i);outputvertex(i,outlength,outvertexlist);}} /* 情况3无输出*/s = p; /* 准备处理下一条边*/}}实验三实现任意一种区域填充算法【实验目的】1、掌握多边形填充的基本原理;2、掌握边界标志算法来实现多边形填充的思想。