计算机图形学实验报告

更新时间:2024-03-02 16:54:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

教育科学与技术学院

2016/2017学年第一学期

实 验 报 告

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

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

日 期: 2016年 11月 24日

1、每项实验报告的内容

==============================================================================

实验一:直线的生成算法实现 一、 实验目的:

理解直线生成的原理; 二、 实验内容:

1、了解直线的生成原理

2、掌握几种基本的直线生成算法:DDA画线法、中点画线法、Bresenham画线法。 3、仿照教材关于直线生成的Bresenham算法,编译程序。 4、调试、编译、运行程序。 三、 实验方法及编程:

a) 实现方法介绍 本次实验是在Turbo C 2.0的平台上编译实现的;Bresenham算法

的基本原理是:过各行各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。 b) 实现代码及分析

#include \ #include \

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,\

/*初始化图形系统*/

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(\ scanf(\

printf(\ for(i=0;i

scanf(\}

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<=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,\/*初始化图形系统*/ init(); sol1(); sol4(); 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,\cleardevice(); setcolor(15); do{

for(t=0;t<10;t++) {

y=0.5*G*t*t; circle(x,y,20); delay(10); cleardevice(); }

for(t=0;t<10;t++) {

y=405-(90*t-0.5*G*t*t); circle(x,y,20); delay(50000); cleardevice(); } }

while(!kbhit());

closegraph(); }

四、 实验结果及分析:

圆圈的落体效果,可以设置参数,落得快慢可以调节。

==============================================================================

2、计算机图形学实验课程小结和思考(包括感想、体会与启示)

经过一学期刻苦而又努力的冲刺,我在计算机图形学这门课程上相对于其他科目而言,获益良多。特别是老师的认真教学态度感动了我们,让我不由自主地把态度放认真了许多。

在大三这学期中的计算机图形学中,我们学习了画点 ,画直线和折线,弧线,曲线,封闭曲线。实现DDA画线程序,放大,加入鼠标功能,实现交互式画直线,中点画圆,编码裁切,鼠标实现交互式裁剪效果,bezier曲线算法,以及数学模型,编写几何程序,鼠标交互式移动图形等知识。

本课程对我来说,付出还是一般的,我大部分心思放在了作业和实验报告上面,听取各同学意见,也参考了不少。听课程度还是比较欠缺认真,可是课后投入应该算是不少。课后花费的精力比其余课程较为大,但是计算机图形学还是博大精深的,值得我们去探讨,去专研。

本文来源:https://www.bwwdw.com/article/5tfa.html

Top