当前位置:文档之家› 计算机图形学实验报告

计算机图形学实验报告

教育科学与技术学院 2016/2017学年第一学期 实 验 报 告

实验课程名称 计算机图形学

专 业 教育技术学 学 生 学 号 B******** 学 生 姓 名 朱志耀 指 导 教 师 熊健、闫静杰 指 导 单 位 通信与信息工程学院

日 期: 2016年 11月 24日 1、每项实验报告的内容 ==============================================================================

实验一:直线的生成算法实现 一、 实验目的: 理解直线生成的原理;

二、 实验内容: 1、了解直线的生成原理 2、掌握几种基本的直线生成算法:DDA画线法、中点画线法、Bresenham画线法。 3、仿照教材关于直线生成的Bresenham算法,编译程序。 4、调试、编译、运行程序。

三、 实验方法及编程: a) 实现方法介绍 本次实验是在Turbo C 2.0的平台上编译实现的;Bresenham算法的基本原理是:过各行各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。 b) 实现代码及分析 #include "stdio.h" #include "graphics.h" Bresenham_line(x0,y0,x1,y1,color) int x0,y0,x1,y1,color; { int x,y,dx,dy,i,e; float k; dx=x1-x0; dy=y1-y0; k=(dy*1.0)/dx; /*求斜率*/ e=2*dy-dx; x=x0; y=y0; for (x=x0; x<=x1; x++) { putpixel(x,y,RED);/*画红色的像素点*/ e=e+2*dy; if(e>=0) { y++; e=e-2*dx; } } } int main() { int x0,y0,x1,y1,c; int graphdriver=DETECT,graphmode=0; /*自动搜索显示器类型和显示模式*/ initgraph(&graphdriver,&graphmode,"c:\\TC20\\BGI"); /*初始化图形系统*/ setbkcolor(WHITE); /*设置背景为白色*/ setcolor(BLUE); /*设置直线为蓝色*/ Bresenham_line(100,100,500,500,3); /*画以(100,100)为起点,(500,500)为终点,3为像素点的直线*/ getch(); /*从控制台读取一个字符,但不显示在屏幕上*/ closegraph(); /*关闭图形系统*/ }

四、 实验结果及分析:

这幅图片是以Bresenham直线扫描算法绘制的以(100,100)为起点,(500,500)为终点的一条直线,背景被设置为了白色,以蓝色画出了这条直线。 实验二:自由曲线的生成算法实现 一、 实验目的: 理解曲线生成的原理

二、 实验内容: 1、了解自由曲线的生成原理。 2、掌握三次样条曲线和Bezier曲线的生成算法。 3、仿照教材关于自由曲线生成的Bezier算法,编译程序。 4、调试、编译、运行程序。

三、 实验方法及编程: a) 实现方法介绍 本次实验是在Turbo C 2.0的平台上编译实现的;用光滑参数曲线段逼近折线多边形,只需要根据给出的数据点就可以构造出曲线,曲线次数严格依赖于确定该段曲线的数据点个数,曲线形状依赖于多边形的形状,多边形的第一个顶点和最后一个顶点在曲线上。 b) 实现代码及分析 #include #include #include #include #include #define N 1000 int n;//控制点的个数 struct point //控制点的坐标 { double x; double y; }point[N]; void init() //输入控制点的坐标 { int i; printf("please input the number of the points: "); scanf("%d",&n); printf("please input the location of the points\n"); for(i=0;iscanf("%lf %lf",&point[i].x,&point[i].y); } void sol1() //绘制控制多边形的轮廓 { int i; setcolor(RED); for(i=0;iline((int)point[i].x,(int)point[i].y,(int)point[i+1].x,(int)point[i+1].y); } double sol2(int nn,int k) //计算多项式的系数C(nn,k) { int i; double sum=1; for(i=1;i<=nn;i++) sum*=i; for(i=1;i<=k;i++) sum/=i; for(i=1;i<=nn-k;i++) sum/=i; return sum; } void sol3(double t) //计算Bezier曲线上点的坐标 { double x=0,y=0,Ber; int k; for(k=0;k{ Ber=sol2(n-1,k)*pow(t,k)*pow(1-t,n-1-k); x+=point[k].x*Ber; y+=point[k].y*Ber; } putpixel((int)x,(int)y,GREEN); } void sol4() //根据控制点,求曲线上的m个点 { int m=500,i; for(i=0;i<=m;i++) sol3((double)i/(double)m); } int main() { int graphdriver=DETECT,graphmode=0; /*自动搜索显示器类型和显示模式*/ initgraph(&graphdriver,&graphmode,"c:\\TC20\\BGI"); /*初始化图形系统*/ init(); sol1(); sol4(); getch(); closegraph(); return 0; } 四、 实验结果及分析: 本次测试结果使用3个点,随机取了点(100,100)、(200,200)、(300,100),绘制相应的Bezier曲线,结果如下。 实验三:二维图形的几何变换 一、 实验目的: 理解二维图形的几何变换的基本原理

二、 实验内容: 根据二维图形几何变换的基本原理及其变换矩阵:(二选一) (1) 编写实现二维图形平移、旋转变换的C语言程序; (2) 编写实现二维图形错切、比例变换的C语言程序; 要求设置变换的参数变量,以便观察不同取值情况下的变换效果。

三、 实验方法及编程: a) 实现方法介绍 本次实验是在turbo c上实现的编程,平移变换时将平移距离tx和ty加到原始坐标(x,y)上获得一个新的坐标位置,可以实现一个二维位置的平移,旋转变换时,通过在xy平面上沿圆路径将对象重新定位来实现。 b) 实现代码及分析 #include"stdio.h" #include"string.h" #include"graphics.h" #include"math.h" #include"conio.h" #define PI 3.1415926

void sanjiaoxing()//画一个基础的三角形,用于进行平移和变换 { int graphdriver=DETECT,graphmode=0; initgraph(&graphdriver,&graphmode,"c:\\TC20\\BGI"); line(15,20,10,30); line(10,30,20,30); line(20,30,15,20); }

void pingyi()//平移函数的实现 { int a,b;//x轴和y轴的平移量a,b int graphdriver=DETECT,graphmode=0; initgraph(&graphdriver,&graphmode,"c:\\TC20\\BGI"); printf("please input a and b!"); scanf("%d %d",&a,&b);//进行a,b的输入 sanjiaoxing();//画三角形用于进行比较 line(15+a,20+b,10+a,30+b);//画平移后的三角形 line(10+a,30+b,20+a,30+b); line(20+a,30+b,15+a,20+b); }

相关主题