- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
计算机图形学划线实验报告
《计算机图形学》实验报告
实验一 直线、圆(弧)生成算法
一、实验目的及要求
1. 了解光栅图形显示器的工作原理和特点;
2. 学习C/VC环境下的基本绘图方法;
3. 实践与巩固直线的基本生成算法。?
4. 掌握直线扫描转换算法的原理及实现;
5. 学习圆(弧)的基本生成算法;
6. 实践圆(弧)的基本生成算法;
7. 掌握圆弧扫描转换算法的原理及实现;
二、理论基础
1、有关直线生成算法有
DDA(数值微分)、中点画线线算法、Bresenham生成算法
数值微分法先算出直线的斜率,然后从起点开始,确定最佳逼近于直线的y坐标。假设起点的坐标为整数。让x递增1,y相应递增k。
中点划线算法中若直线在x方向增加一个单位,y的增量只能在0、1之间。假设当前像素点已经确定,下一像素点就只可能有两种情况,将这两点的中点带入直线方程中,通过中点在直线的上、下方来判断下一点的坐标。
Bresenham算法是通过各行、各列像素中心构造一组虚拟网络格线,按直线从起点到中点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。
2、有关画圆的算法
圆的扫描转换(中点画圆法)、Bresenham画圆算法
圆的扫描转换算法同中点画线类似,将圆分为8份,先讨论圆的第一象限上半部分,从(0,R)点顺时针确定最佳逼近于该圆弧的像素序列。之后通过对称画出全部圆。
Bresenham画圆算法考虑圆在第一象限上的点,每确定一像素,则下一像素有三种可能,通过判断右下方的像素与圆的位置关系再分为三种情况,之后通过这三个点与圆的距离远近确定最佳逼近像素。
三、算法设计与分析
1、数值微分法
int x0=0,y0=0,x1=800,y1=400; //数值微分法,|k|=1
float dx,dy,k,x,y;
dx=x1-x0;
dy=y1-y0;
k=dy/dx;
y=y0;
for(x=x0;x=x1;x++)
{
pDC-SetPixel(x,int(y+0.5),color);
y=y+k;
}
该程序中每一步的x、y值是用前一步的值加上一个增量来获得的。在程序中y与k必须用浮点数表示,每一步都必须对y进行取整。此程序只能用于计算|k|=1的情形,当直线的斜率的绝对值超过1是,必须把x、y的地位进行交换,y每增加一,x相应增加1/k.
2中点画线法
COLORREF color=RGB(100,25,108);
int x0=0,y0=0,x1=800,y1=400; //中点画线法,0k1
int a,b,d1,d2,d,x,y;
a=y0-y1;
b=x1-x0;
d=2*a+b;
d1=2*a;
d2=2*(a+b);
x=x0;
y=y0;
pDC-SetPixel(x, y, color);
while (xx1)
{
if (d0)
{
x++;
y++;
d+=d2;
}
else
{
x++;
d+=d1;
}
pDC-SetPixel (x, y, color);
}
该程序只能用于计算斜率在0、1之间的直线,从中点划线法思想计算得出的初值d0=a+0.5b为浮点型数据,由于我们只需要d的符号,而且d的增量都是整数,只是其初始值包含小数,因此,在程序中我们可以用2d代替d,来摆脱小数,
在画别的的情况斜率的直线时,将此程序中的a,b,x,y做相应的改变,具体在源程序中呈现。
当画任意起始点的直线时,只需将x0、x1、y0、y1的次序做相应的调整使之满足程序所给条件。
3、Bresenham生成算法
int x0=0,y0=0,x1=800,y1=200; //0k1
int x,y,dx,dy,i;
float k,e;
dx=x1-x0;
dy=y1-y0;
k=(float)dy/(float)dx;
e=-0.5;x=x0;y=y0;
for(i=0;idx;i++)
{
pDC-SetPixel(x,y,255);
x=x+1;
e=e+k;
if(e=0)
{
y=y+1;
e=e-1;
}
}
该程序原本要通过直线与网格交点与0.5之间的关系来判断下一像素点是取右方还是右上方(以斜率大与一为例),改进后的程序用e=d-0..5的正负判断下一像素点的取值。当e大于0即
文档评论(0)