- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第 3 章 基本图形元素生成算法 3.1 直线的扫描转换 3.2 圆和椭圆的扫描转换 3.3 区域填充 3.4 字符的生成 3.5 图形裁剪 3.6 属性控制 3.7 反走样 习题 3.1 直线的扫描转换 3.1.1 DDA算法 DDA算法是根据直线的微分方程来计算Δx或Δy生成直线的扫描转换算法。 在一个坐标轴上以单位间隔对线段取样, 以决定另一个坐标轴方向上最靠近理想线段的整数值。 设(x0, y0)为直线段的始点, (x1, y1)为直线段的终点, 且端点坐标均为整数, 则直线的微分方程为 void DDA-line(x0, y0, x1, y1, color) int x0, y0, x1, y1, color; {int x; float y, k, deltx, delty; deltx=x1-x0; delty=y1-y0; k=delty/deltx; y=y0; for(x=x0; x=x1; x++) { putpixel(x, int(y+0.5), color); y=y+k; } } 3.1.2 中点画线法 为了讨论的方便, 假定直线的斜率在0~1之间, 其它情况参照下述讨论进行处理。 假设直线的起点和终点分别为(x0, y0)和(x1, y1), 则直线方程为 ? F(x, y)=ax+by+c=0 其中, a=y0-y1, b=x1-x0, c=x0y1-x1y0。 对于直线上的点, F(x,y)=0; 对于直线上方的点, F(x,y)>0; 而对于直线下方的点, F(x,y)<0。 如图3.1所示, 若直线在x方向上增加一个单位, 则在y方向上的增量只能在0和1之间。 假设横坐标为xP的各像素点中最佳逼近于理想直线的像素为(xP,yP), 用实心小圆表示。 ?那么, 下一个与直线最近的像素只能是正右方的P1(xP+1,yP)或右上方的P2(xP+1, yP+1)两者之一, 用空心小圆表示。 我们用P1和P2的中点M(xP+1, yP+0.5)与理想直线的位置关系来判定。 设Q是理想直线与垂直线x=xP+1的交点。 若M在Q的下方, 则P2离理想直线近, 应取为下一个像素; 否则应取P1。 为此, 我们构造判别式 ? d=F(M)=F(xP+1,yP+0.5)=a(xP+1)+b(yP+0.5)+c ? 当d0时, M在直线下方, 应取右上方的P2作为下一个像素; 当d0时, M在直线上方, 则应取正右方的P1; 当d=0时, 约定取正右方的P1。 下面我们讨论如何计算判别式d。 由于d是xP和yP的线性函数, 因而可以采用增量方法计算, 以提高运算效率。 当d≥0时, 取正右方像素P1, 再下一个像素应在P1的正右方像素P3(xP+2, yP)和P1的右上方像素P4(xP+2, yP+1)中选取, 应计算 ?d1=F(xP+2,yP+0.5)=a(xP+2)+b(yP+0.5)+c=d+a 故在d≥0的情况下, d的增量为a 。 而若d0, 则取右上方像素P2, 再下一个像素应在P2的正右方像素P4(xP+2,yP+1)和P2的右上方像素P5(xP+2,yP+2)中选取, 应计算 ?d1=F(xP+2, yP+1.5)=a(xP+2)+b(yP+1.5)+c=d+a+b ? 故在d0的情况下, d的增量为a+b。 再讨论d的初始值。 第一个像素应取左端点(x0,y0), 相应的判别式为 ? d0=F(x0+1, y0+0.5)=a(x0+1)+b(y0+0.5)+c =ax0+by0+c+a+0.5b =F(x0, y0)+a+0.5b d的初始值为:a+0.5b 中点画线法的伪C算法描述如下: void MidPoint-Line(x0, y0, x1, y1, color) int x0, y0, x1, y1, color; { int a, b, delta1, delta2, d, x, y; a=y0-y1; b=x1-x0; d=2*a+b d
原创力文档


文档评论(0)