计算机图形学实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
教育科学与技术学院
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;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