计算机图形学实验指导(含源码附报告模板)

合集下载

计算机图形学实验报告模板

计算机图形学实验报告模板

巢湖学院计算机图形学实验报告(模板>本课程实验包括:以下为实验二和实验三模板实验一:基本图元绘制一、实验目的了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。

b5E2RGbCAP二、实验内容实验操作和步骤:本次实验主要的目的是为了掌握基本画线和画圆算法,对于书上给出的代码,要求通过本次实验来具体的实现。

由于实验已经给出大体的框架,所以只需要按照书上的算法思想来设计具体实现代码,对于直线DDA算法,中点Bresenham算法及其改进算法,以及Bresenham画圆算法都有进一步的体会。

DDA算法是对每一步都要进行增量处理,然后取整,绘制,而Bresenham通过判断误差函数和求取递推公式来实现。

特别是对于整数的选择取舍,以及代码的流程和循环的控制有一个深入的了解。

同时也熟练运用OpenGL基本的绘图函数。

p1EanqFDPw三、体会通过本次实验,我进一步加深了对于基本画图算法的理解。

特别是对于DDA,Bresenham和画圆算法。

其中,DDA算法由于每一步都要处理浮点数的四舍五入,所以在绘图时要进行取整,效率较低,但是代码直观好懂,符合原理。

而对于Bresenham及其改进算法,都是在理论推导的基础上来实现的,然后经过整数化,形成了一个高效率的画图算法,所以需要适当的理解,特别是对于取整操作判断比较巧妙,实现了避免多次判断计算浮点数的目的,所以比较高效。

而绘制圆形的时候,用到的基本思想还是和Bresenham画图算法一样,只不过需要注意的是八分法画圆,这样只需要绘制其中的八分之一就可以利用对称的关系来绘制出整个图形。

而对于是否走下一步,或者是停留,判断的依据还是误差函数,和前面的思想是类似。

另外,通过实验训练了自己的编程能力,同时熟悉了OpenGL绘图的函数和流程,也进一步巩固了相关的知识。

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

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

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

二、实验任务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曲线。

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

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

《计算机图形学》实验报告《实验名称》姓名=学号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;}//代码要有详细的注释。

计算机图形学实验报告,DOC

计算机图形学实验报告,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);

《计算机图形学》实验指导书

《计算机图形学》实验指导书

计算机图形学实验指导书袁科计算机技术实验中心目录实验一实现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 曲线的绘制与显示。

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

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

《计算机图形学》实验报告目录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核心代码本次实验的核心代码如下所示。

计算机图形学实验--完整版-带结果--vc++实现

计算机图形学实验--完整版-带结果--vc++实现

计算机图形学实验报告信息学院计算机专业20081060183 周建明综括:利用计算机编程语言绘制图形,主要实现以下内容:(1)、中点算法生成任意斜率直线,并设置线型线宽。

(2)、中点算法生成圆(3)、中点算法生成椭圆(4)、扫描算法实现任意多边形填充(5)、Cohen_Sutherland裁剪(6)、自由曲线与曲面的绘制(7)、二维图形变换(8)、三视图变换实验一、直线的生成一、实验内容根据提供的程序框架,修改部分代码,完成画一条直线的功能(中点画线法或者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画法画一段圆弧或者画圆。

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

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

实验报告模板《计算机图形学》实验报告一、实验目的及要求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);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。

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

计算机图形学实验指导目录实验1 直线的绘制 (2)实验2 圆和椭圆的绘制 (4)实验3 图形填充 (7)实验4 二维图形几何变换 (10)实验5 二维图形裁剪 (13)实验6 曲线生成算法的实现 (18)附录:实验报告模板 (20)实验1 直线的绘制实验目的1、通过实验,进一步理解和掌握DDA和Bresenham算法;2、掌握以上算法生成直线段的基本过程;3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。

实验环境计算机、Turbo C或其他C语言程序设计环境实验学时2学时,必做实验。

实验内容用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。

实验步骤1、算法、原理清晰,有详细的设计步骤;2、依据算法、步骤或程序流程图,用C语言编写源程序;3、编辑源程序并进行调试;4、进行运行测试,并结合情况进行调整;5、对运行结果进行保存与分析;6、把源程序以文件的形式提交;7、按格式书写实验报告。

实验代码:DDA:# include <graphics.h># include <math.h>void DDALine(int x0,int y0,int x1,int y1,int color){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);elseepsl=abs(dy);xIncre=(float)dx/(float)epsl;yIncre=(float)dy/(float)epsl;for(k=0;k<=epsl;k++){putpixel((int)(x+0.5),(int)(y+0.5),4);x+=xIncre;y+=yIncre;}}main(){int gdriver ,gmode ;gdriver = DETECT;initgraph(&gdriver , &gmode ,"C:\\TC20\\BGI");DDALine(0,0,35,26,4);getch ( );closegraph ( );}Bresenham:#include<graphics.h>#include<math.h>void BresenhamLine(int x0,int y0,int x1,int y1,int color) {int x,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while(x<=x1){putpixel(x,y,color);x++;e=e+2*dy;if(e>0){y++;e=e-2*dx;}}}main(){int gdriver ,gmode ;gdriver = DETECT;initgraph(&gdriver , &gmode ,"c:\\TC20\\BGI");BresenhamLine(0, 0 , 120, 200,5 );getch ( );closegraph ( );}实验2 圆和椭圆的绘制实验目的1、通过实验,进一步理解和掌握中点算法;2、掌握以上算法生成椭圆或圆的基本过程;3、通过编程,会在TC环境下完成用中点算法实现椭圆或圆的绘制。

实验环境计算机、Turbo C或其他C语言程序设计环境实验学时2学时,必做实验。

实验内容用中点(Besenham)算法实现椭圆或圆的绘制。

实验步骤1.算法、原理清晰,有详细的设计步骤;2.依据算法、步骤或程序流程图,用C语言编写源程序;3.编辑源程序并进行调试;4.进行运行测试,并结合情况进行调整;5.对运行结果进行保存与分析;6.打印源程序或把源程序以文件的形式提交;7.按格式书写实验报告。

分析与思考1.为何在程序运行时,有的椭圆或圆仅在屏幕左上角显示了一部分?2.用中点算法生成的椭圆,为何在半径较大时,图形的失真严重?实验代码:圆:#include<graphics.h>#include<math.h>void CirclePoint(int x,int y,int color){putpixel(x+100,y+100,color);putpixel(-x+100,y+100,color);putpixel(x+100,-y+100,color);putpixel(-x+100,-y+100,color);putpixel(y+100,x+100,color);putpixel(y+100,-x+100,color);putpixel(-y+100,x+100,color);putpixel(-y+100,-x+100,color);}void MidBresenhamCircle(int r,int color){int x,y,d;x=0;y=r;d=1-r;while(x<=y){CirclePoint(x,y,color);if(d<0) d+=2*x+3;else{d+=2*(x-y)+5;y--;}x++;}}main( ){int gdriver ,gmode ;gdriver = DETECT;initgraph(&gdriver , &gmode ,"c:\\tc20\\bgi" );MidBresenhamCircle(50,6);getch ( );closegraph ( );}实验截图:椭圆:#include "graphics.h"void MidBresenhamEllipse(int a,int b,int color){int x,y;float d1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.5);putpixel(x+100,y+100,color); putpixel(-x+100,-y+100,color);putpixel(-x+100,y+100,color);putpixel(x+100,-y+100,color);while(b*b*(x+1)<a*a*(y-0.5)){if(d1<=0){d1+=b*b*(2*x+3);x++;}else{d1+=b*b*(2*x+3)+a*a*(-2*y+2);x++;y--;}putpixel(x+100,y+100,color); putpixel(-x+100,-y+100,color);putpixel(-x+100,y+100,color);putpixel(x+100,-y+100,color);}d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;while(y>0){if(d2<=0){d2+=b*b*(2*x+2)+a*a*(-2*y+3);x++; y--;}else{d2+=a*a*(-2*y+3);y--;}putpixel(x+100,y+100,color); putpixel(-x+100,-y+100,color);putpixel(-x+100,y+100,color);putpixel(x+100,-y+100,color);}}main( ){int gdriver ,gmode ;gdriver = DETECT;initgraph(&gdriver , &gmode ,"c:\\tc20\\bgi" );MidBresenhamEllipse(8,6,2);getch ( );closegraph ( );}实验截图:实验3 图形填充实验目的4、通过实验,进一步理解和掌握图形填充常用算法;5、掌握以上算法进行填充图形的基本过程;6、通过编程,会在TC环境下完成图形填充。

实验环境计算机、Turbo C或其他C语言程序设计环境实验学时2学时,必做实验。

实验内容任意画一个多边形,并用边填充算法进行填充。

(多边形的顶点坐标存放在数组中,坐标值由键盘输入)实验步骤1、算法、原理清晰,有详细的设计步骤;2、依据算法、步骤或程序流程图,用C语言编写源程序;3、编辑源程序并进行调试;4、进行运行测试,并结合情况进行调整;5、对运行结果进行保存与分析;6、打印源程序或把源程序以文件的形式提交;7、按格式书写实验报告。

实验代码:#include<graphics.h>#include<stdio.h>#include<math.h>#include<conio.h>#define MP 100#include<stdlib.h>#define false 0void edge_mark(int arr[][2],int value,int polydeflen){int by,x,y,ax,ay;int i,j;float k;by=arr[polydeflen-1][1];for (i=0;i<polydeflen;i++){if (i == polydeflen-1){ax=arr[0][0];ay=arr[0][1];}else{ax=arr[i+1][0];ay=arr[i+1][1];}x=arr[i][0];y=arr[i][1];if((y-ay)!=0)k=(ax-x)/(float)(y-ay);if((y-by)*(ay-y)>=0)putpixel(x,y,value);getch();if(ay<y)for(j=y-1;j>ay;j--)putpixel(x+(int)((y-j)*k),j,value);else for(j=y+1;j<ay;j++)putpixel(x-(int)((j-y)*k),j,value);by=y;}}void edge_mark_fill(int ar[][2],int value,int polydeflen) {int i,x,y,inside;int min,max;inside=false;min=ar[0][1];max=ar[0][1];edge_mark(ar,value,polydeflen);for (i=1;i<polydeflen;i++){if (ar[i][1]>max)max=ar[i][1];if (ar[i][1]<min)min=ar[i][1];}for (y=min;y<=max;y++){for(x=0;x<=640;x++){if (getpixel(x,y) == value)inside=!(inside);if (inside!=false)putpixel(x,y,value);else putpixel(x,y,0);}if(getch()==17)exit(1);}}void main(){char t[100];int polydef[MP][2];int i,j,gdriver,gmode,polydeflen,value;gdriver=DETECT;initgraph(&gdriver,&gmode,"c:\\tc20\\bgi" );printf("please input the number of edges:\n");scanf("%d",&polydeflen);printf("please input the color:\n");scanf("%d",&value);printf("please input the (x,y):\n");for (i=0;i<polydeflen;i++)for (j=0;j<2;j++)scanf("%d",&polydef[i][j]);printf("please press the space key!");edge_mark_fill(polydef,value,polydeflen);for(i=0;i<polydeflen;i++){sprintf(t,"(%d,%d)",polydef[i][0],polydef[i][1]);outtextxy(polydef[i][0],polydef[i][1],t);}getch();closegraph();}实验截图:实验4 二维图形几何变换实验目的1、通过实验,进一步理解和掌握二维图形几何变换算法;2、掌握以上算法进行二维图形几何变换基本过程;3、通过编程,会在TC环境下完成二维图形几何变换过程。

相关文档
最新文档