图形学实验报告总结 计算机图形学实验报告
下面是好好范文网小编收集整理的图形学实验报告总结 计算机图形学实验报告,仅供参考,欢迎大家阅读!
教育科学与技术学院
2016/2017学年第一学期
实 验 报 告
实验课程名称 计算机图形学
专 业 教育技术学
学 生 学 号 B14150226
学 生 姓 名 朱志耀
指 导 教 师 熊健、闫静杰
指 导 单 位 通信与信息工程学院
日 期: 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
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 pointsn");
for(i=0;i
scanf("%lf %lf",&point[i].x,&point[i].y);
void sol1() //绘制控制多边形的轮廓
int i;
setcolor(RED);
for(i=0;i
line((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
sum*=i;
for(i=1;i
sum/=i;
for(i=1;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
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);
void xuanzhuan()//旋转函数的实现
int c;
int x1,y1,x2,y2,x3,y3;//三角形3个点旋转后的坐标 int graphdriver=DETECT,graphmode=0;
initgraph(&graphdriver,&graphmode,"c:\TC20\BGI"); printf("please input c!");
scanf("%f",&c); //旋转角度的输入
x1=15*cos(c)-20*sin(c);
y1=15*sin(c)+20*cos(c);
x2=10*cos(c)-30*sin(c);
y2=10*sin(c)+30*cos(c);
x3=20*cos(c)-30*sin(c);
y3=20*sin(c)+30*cos(c);
sanjiaoxing();
line(x1,y1,x2,y2);//画旋转后的三角形
line(x2,y2,x3,y3);
line(x3,y3,x1,y1);
int main()
int d;
int graphdriver=DETECT,graphmode=0;
initgraph(&graphdriver,&graphmode,"c:\TC20\BGI"); printf("please input d use 1 or 2 !");
scanf("%d",&d);
switch(d)//进行先平移还是先旋转的选择
case 0:break;
case 1:pingyi();
break;
case 2:xuanzhuan();
break;
getch();
closegraph();
return 0;
四、 实验结果及分析:
以下几幅图是运行后得到的图形:
实验四:计算机动画制作
一、 实验目的:
根据学到的计算机图形学的基础知识,可以加之运用到计算机动画的制作上去
二、 实验内容:
理解计算机动画的不同生成方法;采用某种动画生成方法设计制作一个动画小片断; 要求利用Turbo C 环境下的图形库函数,如cleardevice(),getimage()与putimage(),setactivepage()与setvisualpage()等来设计实现动画;所设计动画应有一定可观性。
三、 实验方法及编程:
a) 实现方法介绍
基于TurboC 的图形编程,学习使用cleardevice() cleanviewdevice()getimage()与putimage()的配合使用。学习利用数学函数或数学方程式,跟据自变量和因变量的关系,让自变量在一个允许范围内以一步长逐渐增值或减值,进行连续循环,获得连续变化的动画。
b) 实现代码及分析
#include
#include
#define G 10
main()
int x=320,y,t;
int graphdriver=DETECT,graphmode=0;
initgraph(&graphdriver,&graphmode,"c:\TC20\BGI");
cleardevice();
setcolor(15);
do{
for(t=0;t
y=0.5*G*t*t;
circle(x,y,20);
delay(10);
cleardevice();
for(t=0;t
y=405-(90*t-0.5*G*t*t);
circle(x,y,20);
delay(50000);
cleardevice();
while(!kbhit());
closegraph();
四、 实验结果及分析:
圆圈的落体效果,可以设置参数,落得快慢可以调节。
==============================================================================
2、计算机图形学实验课程小结和思考(包括感想、体会与启示)
经过一学期刻苦而又努力的冲刺,我在计算机图形学这门课程上相对于其他科目而言,获益良多。特别是老师的认真教学态度感动了我们,让我不由自主地把态度放认真了许多。
在大三这学期中的计算机图形学中,我们学习了画点 ,画直线和折线,弧线,曲线,封闭曲线。实现DDA 画线程序,放大,加入鼠标功能,实现交互式画直线,中点画圆,编码裁切,鼠标实现交互式裁剪效果,bezier 曲线算法,以及数学模型,编写几何程序,鼠标交互式移动图形等知识。
本课程对我来说,付出还是一般的,我大部分心思放在了作业和实验报告上面,听取各同学意见,也参考了不少。听课程度还是比较欠缺认真,可是课后投入应该算是不少。课后花费的精力比其余课程较为大,但是计算机图形学还是博大精深的,值得我们去探讨,去专研。