- 1、本文档共25页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验《计算机图形学》课内实验报告(实验二).doc
及学号:
及学号:
学院: 班级: 踝程名称: 实验题目:
11 *1
MM
冻”电力犬斥
《计算机图形学》课内实验报告
学生姓名:
理学院
计算机图形学 基本图形的生成算法 讲师 讲师
2014年4月1日
TOC \o 1-5 \h \z 一、 实验题目 1
HYPERLINK \l bookmark4 \o Current Document \h 二、 实验目的 1
HYPERLINK \l bookmark6 \o Current Document \h 三、 实验内容 1
HYPERLINK \l bookmark8 \o Current Document \h 四、 实验结果 2
HYPERLINK \l bookmark10 \o Current Document \h 五、 实验体会或遇到问题 23
基本图形的生成算法
二 实验目的
通过实验,进一步理解直线段扫描转换的DDA算法、中点bresenham算 法及bresenham算法的基本原理;
掌握以上算法生成直线段的基本过程;
通过编程,会在C/C++环境下完成用DDA算法、中点bresenham算法及 bresenham算法对任意直线段的扫描转换。
三 实验内容
点的显示与属性
对VC中画点的函数PutPixel与获取点函数GetPixel分别用于在指定位 置画指定大小颜色的点或获取指定位置的点的颜色,而在OpenGL屮可以用 属性选择来控制画点还是画线或多边形等。
在VC中PutPixel的前两个参数为点的坐标位置,后面的参数为颜色属 性来实现画点,在OpenGL中位于gibegin和glend之间的是数据点,通过选 取gibegin的属性为GL_POINTS则数据点显示为点。
常用画线算法与实现
1) DDA算法,按四舍五入法取点的简单算法,编程容易,但计算量大。
2) 中点算法,是通过递推确定取点的方法,由于计算加与减,没有乘 法运算所以计算量少,是常用的算法,此算法是判断实际点位于相邻两个像 素点的中点的上方,如果是则取上边的像点,否则取下边的像素点(当斜率 绝对值大于1时按左右取)。
3) 实现,可VC中实现以上算法,OpenGL中已有相应函数画线。
面的生成与填充
1) 用VC实现区域填充屮的扫描转换,用图像填充区域以及字符输出 等,可用扫描线算法等实现,用OpenGL则可用填充函数及材质设置函数实 现优质显示。
2) 由面生成空间图形可以用VC的图形变换实现不同角度效果,并用 裁剪算法及隐藏面消除算法实现真实感效果,但OpenGL实现则要简单些。
四、实验结果
1.DDA算法画线
图1 DDA算法画线 源程序:
#include graphics.h
# includeconio.h
#include math.h
#define ROUND(a) ((int)(a+0.5))
#define OX 320
#define OY 240
void lineDDA (int xa, int ya, int xb, int yb, int color); void setpixel (int x, int y, int color);
main(){
int gdrive二DETECT, gmode=0;
initgraph(gdrive, gmode, Hd:\\tcn); setbkcolor(BLACK);
line (0, OY, 2*OX, OY);
line (OX, 0, OX, 2*OY);
lineDDA (300, 300, 0, 0, WHITE); getch ();
closegraph();
return 0;
}
void lineDDA (int xa, int ya, int xb, int yb, int color) { int dx = xb - xa; int dy = yb - ya;
int steps, i;
float xlncrement, ylncrement;
float x=xa;
float y=ya; if(abs(dx) abs(dy)) steps = abs(dx);
else
steps = abs(dy);
xlncrement = dx/(float)steps; ylncrement = dy/(float)steps;
putpixel (ROUND(x), ROUND(y), color); for (i=0; isteps; i++) {
x += xlncrement;
y + 二 ylncrement;
setpixel (ROUND(x), ROUND(y), color);
}
return;
}
void setpixel (int x, in
文档评论(0)