03基本图元算法2直线算法.docVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第3章 基本图元算法 int x,y; } VPOINT; 已知条件:起点,终点 2 直线算法 2.1 DDA直线算法 一、DDA算法 每个点的计算方法: ①在最大位移方向上,取步长=1; ②计算另一坐标分量; x=x±1, y=y±yincre; 或 y=y±1, x=x±xincre; ③取整作为点坐标。 分析:8种斜线情形、水平线、垂直线 二、算法 void DDALine(VPOINT p1, VPOINT p2, int color) { int delta, i; //delta为x、y方向最大位移的绝对值 float xinc, yinc; float x,y; // 留心①:必须float类型 if(abs(p2.x-p1.x)abs(p2.y-p1.y)) { delta=abs(p2.x-p1.x); if(p2.x-p1.x0) xinc=1; else xinc=-1; // 留心yinc=(float)(p2.y-p1.y)/abs(p2.x-p1.x); // 留心③ } else { delta=abs(p2.y-p1.y); if(p2.y-p1.y0) yinc=1; else yinc=-1; xinc=(float)(p2.x-p1.x)/abs(p2.y-p1.y); } x=p1.x; y=p1.y; for(i=1; i=delta; i++) { putpixel(x+0.5, y+0.5, color); //留心④:四舍五入 x=x+xincre; y=y+yincre; } } 水平线、垂直线的处理? 缺点:存在实数的除法运算。 测试例程: main() { VPOINT p1={200,200}, p2; int radius=100, angle; for(angle=0; angle360; angle++) { p2.x=p1.x+ radius*cos(angle); p2.y=p1.y+ radius*sin(angle); DDALine(p1, p2, 1); } } 三、增量法 由于图形中的点的相邻性,借助相邻点的坐标计算下一点的坐标,将乘/除法运算转换为加/减法运算。 2.2 Bresenham直线算法(中点画线法) 一、构造判别式 构造判别式,将两个候选像素的中点代入,根据值的正负,确定选择哪个像素点。 取判别式为直线方程: 若,则在直线中; 若,则在直线上方; 若,则在直线下方。 二、计算判别式(考虑情形:且p1.xp2.x) 若,取;若,取。 增量法的体现: 如何取下一个像素点? 如何计算下一步的值? 能否用当前的值推导下一步的值? 的初值: 推导下一步的值: 若,取; 若,取。 三、算法 void MidpointLine1(VPOINT p1, VPOINT p2,int color) { int a,b,d1,d2,d,x,y; a=p1.y-p2.y; b=p2.x-p1.x; d=2*a+b; d1=2*a; d2=2*(a+b); // 技巧:只判断正负 putpixel(p1.x,p1.y,color); for(x=p1.x+1,y=p1.y; x=p2.x; x++) { if(d=0) d=d+d1; else { y++; d=d+d2; } putpixel(x,y,color); } } 优点:全部整型数加减运算。 思考:所有情形的算法 void allMidpointLine(VPOINT p1, VPOINT p2,int color) { int delta_x, delta_y; delta_x=p2.x-p1.x; delta_y=p2.y-p1.y; if(abs(delta_y)=abs(delta_x)) { if(delta_x0 delta_y0) MidpointLine1(p1,p2,color); if(delta_x0 delta_y0) MidpointLine1(p2,p1,color); if(delta_x0 delta_y0) MidpointLine2(p1,p2,color); if(delta_x0 delta_y0) MidpointLine2(p2,p1,color); } else { if(delta_x0 delta_y0) MidpointLine3(p1,p2,colo

您可能关注的文档

文档评论(0)

lyxbb + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档