图形学实验报告总结 计算机图形学实验报告

2024-02-12 09:41:00 来源 : haohaofanwen.com 投稿人 : admin

下面是好好范文网小编收集整理的图形学实验报告总结 计算机图形学实验报告,仅供参考,欢迎大家阅读!

图形学实验报告总结

教育科学与技术学院

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 曲线算法,以及数学模型,编写几何程序,鼠标交互式移动图形等知识。

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


相关文章

专题分类