- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
p03直线.圆.椭圆生成
第三章 直线、圆、椭圆生成算法;;本章内容;3.1直线段的扫描转换算法;3.1.1数值微分法(DDA);3.1.1数值微分(DDA)法;计算yi+1= kxi+1+b
= kxi+b+k?x
= yi+k?x
当?x =1; yi+1 = yi+k
即:当x每递增1,y递增k(即直线斜率);
注意上述分析的算法仅适用于?k? ≤1的情形。在这种情况下,x每增加1,y最多增加1。
当 ?k? ?1时,必须把x,y地位互换;增量算法:在一个迭代算法中,如果每一步的x、y值是用前一步的值加上一个增量来获得,则称为增量算法。
DDA算法就是一个增量算法。;数值微分(DDA)法;数值微分(DDA)法;实现DDA画线程序;第三步:编写自定义的成员函数ddaline()程序;第四步:编写OnDraw()函数;数值微分(DDA)法;中点画线法;中点画线法;3.1.2中点画线法;;;若d0-M在直线下方-取P2;
此时再下一个象素的判别式为
d2= F(xp+2, yp+1.5)
=a(xp+2)+b(yp+1.5)+c
= a(xp +1)+b(yp +0.5)+c +a +b =d+a+b ; 增量为a+b
;画线从(x0, y0)开始,d的初值
d0=F(x0+1, y0+0.5)= a(x0 +1)+b(y0 +0.5)+c
= F(x0, y0)+a+0.5b = a+0.5b
由于只用d 的符号作判断,为了只包含整数运算,
可以用2d代替d来摆脱小数,提高效率。
;void Midpoint Line (int x0,int y0,int x1, int y1,int color)
{ 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;
drawpixel(x, y, color);
while (xx1)
{ if (d0) {x++; y++; d+=d2; }
else {x++; d+=d1;}
drawpixel (x, y, color);
} /* while */
} /* mid PointLine */
;例:用中点画线法P0(0,0) P1(5,2)
a=y0-y1=-2 b=x1-x0=5
d0=2a+b=1 d1=2a=-4 d2=2(a+b)=6
i xi yi d
1 0 0 1
2 1 0 -3
3 2 1 3
4 3 1 -1
5 4 2 5
;中点画线算法;;;;;Bresenham画线算法;Bresenham画线算法;Bresenham画线算法;Bresenham画线算法;//斜率判断,斜率绝对值大于,则m为false,否则为true
BOOL m = (fabs(y2-y1)=fabs(x2-x1));
//如果x1大于x2,交换坐标值
if (x1 x2)
{
p=x1;x1=x2;x2=p;
p=y1;y1=y2;y2=p;
}
x = x1;
y = y1;
dx = x2 - x1;
dy = y2 - y1;
;//斜率绝对值小于等于
if (m)
{
//第一种情况,y递增
if (y1 = y2)
{
p = (dy1) - dx;
while (x = x2)
{
pDC-SetPixel(x,y,color);
if (p 0)
{x++;p=p+(dy1);}
else
{x++;y++;p=p+((dy-dx)1);}
}
}
//第三种情况,y递减
else
{
p = dx - (dy1);
while (x = x2)
{
pDC-SetPixel(x,y,color);
if (p 0)
{x++;p=p-(dy1);}
else
{x++;y--;p=p-((dy+dx)1);}
}
}
;;3.2.1直接利用圆的方程生成圆
下面先以圆心在原点、半径r为整数的圆为例,讨论圆的生成算法。
假设圆的方程为:
x2 + y2 = r2
;x2 + y2 =
文档评论(0)