- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第3部分 直线段的扫描转换 第*页 李辉 副教授 * 李辉 副教授 直线段的扫描转换 Ray ray@mail.buct.edu.cn * 第3部分 直线段的扫描转换 内容 光栅图形 直线的扫描转换 数值微分法(DDA) 中点画线法 Bresenham算法 * 第3部分 直线段的扫描转换 光栅图形 光栅图形 光栅显示器上显示的图形,称之为光栅图形 光栅显示器 可以看作是一个象素矩阵,在光栅显示器上显示的任何一个图形,实际上都是一些具有一种或多种颜色和灰度象素的集合。 对一个具体的光栅显示器来说,象素个数是有限的,象素的颜色和灰度等级也是有限的,象素是有大小的,所以光栅图形只是近似的实际图形。 如何使光栅图形最完美地逼近实际图形,便是光栅图形学要研究的内容。 * 第3部分 直线段的扫描转换 图形的扫描转换 确定最佳逼近图形的象素集合,并用指定的颜色和灰度设置象素的过程称为图形的扫描转换或光栅化。 光栅化问题 对于一维图形,在不考虑线宽时,用一个象素宽的直线或曲线来显示图形。 二维图形的光栅化必须确定区域对应的象素集,将各个象素设置成指定的颜色和灰度,也称之为区域填充。 * 第3部分 直线段的扫描转换 图形光栅化后,显示在屏幕上的一个窗口里,超出窗口的部分不予显示。确定一个图形的哪些部分在窗口内,必须显示;哪些部分落在窗口之外,不予显示,这需要对图形进行裁剪。 在光栅图形中,非水平和垂直的直线用象素集合表示时,会呈锯齿状,这种现象称之为走样;用于减少或消除走样的技术称为反走样。 * 第3部分 直线段的扫描转换 直线的扫描转换 直线 数学上的直线是没有宽度、由无数个点构成的集合。 光栅显示器只能近似地显示直线。 直线的扫描转换 当我们对直线进行光栅化时,需要在显示器有限个象素中,确定最佳逼近该直线的一组象素,并且按扫描线顺序,对这些象素进行写操作,这个过程称为直线的扫描转换。 数值微分法(DDA) 中点画线法 Bresenham算法 * 第3部分 直线段的扫描转换 数值微分法(DDA) 分析 设过端点P0(x0 ,y0)、P1(x1 ,y1)的直线段为L(P0 ,P1), 斜率 L的起点P0的横坐标x0向L的终点P1的横坐标x1步进,取步长=1(个象素),用L的直线方程y=kx+b计算相应的y坐标,并取象素点(x,round(y))作为当前点的坐标。 * 第3部分 直线段的扫描转换 yi+1=kxi+1+b ???????? =kxi+b+kDx ????? =yi+kDx 当Dx =1时yi+1 = yi+k。 也就是说,当x每递增1,y递增k(即直线斜率)。 * 第3部分 直线段的扫描转换 DDA画线算法程序 void DDALine(int x0,int y0,int x1,int y1,int color) { int x; float dx, dy, y, k; dx = x1-x0; dy=y1-y0; k=dy/dx;y=y0; for (x=x0;x x1;x++) { drawpixel (x, int(y+0.5), color); y=y+k; } * 第3部分 直线段的扫描转换 举例 连接两点P0(0,0)和P1(5,2)的直线段 x int(y+0.5) y+0.5 0 0 0 1 0 0.4+0.5 2 1 0.8+0.5 3 1 1.2+0.5 4 2 1.6+0.5 * 第3部分 直线段的扫描转换 算法分析 上述分析的算法仅适用于|k| ≤1的情形。 在这种情况下,x每增加1,y最多增加1。 当 |k| 1时,必须把x,y地位互换,y每增加1,x相应增加1/k。 在这个算法中,y与k必须用浮点数表示,而且每一步都要对y进行四舍五入后取整,这使得它不利于硬件实现。 * 第3部分 直线段的扫描转换 中点画线法 分析 假定直线斜率k在0~1之间,当前象素点为(xp,yp),则下一个象素点有两种可选择点 P1(xp+1,yp)或P2(xp+1,yp+1)。 设P1与P2的中点(xp+1,yp+0.5)称为M,Q为直线与x=xp+1垂线的交点。 当M在Q的下方时, 则取P2应为下一个象素点; 当M在Q的上方时, 则取P1为下一个象素点。 * 第3部分 直线段的扫描转换 过点(x0,y0)、(x1, y1)的直线段L的方程式为 F(x, y)=ax+by+c=0 其中,a=y0-y1, b=x1-x0, c=x0y1-x1y0, 欲判断中点M在Q点的上方还是下方,只要把M代入F(x,y),并判断它的符号即可。 为此,我们构造判别式: d=F(M)=F(xp+1, yp+0.5)=a(xp+1)+b(yp+0.5)+c 当d0时
文档评论(0)