- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章-二维线画图元的生成
* 3.3.2 圆弧的多边形逼近法 1、正内接多边形迫近法 圆:x2 + y2 = R2 内接多边形顶点集: 令 pi 的幅角为 ,边的圆心角为 则有 是常数, , 只在开始时计算一次所以,一个顶点只需4次乘法,共4n次乘法,外加直线段的中点算法的计算量 * 3.3.2 圆弧的多边形逼近法 问题:多少条边合适? 给定最大逼近误差(最大 距离) d ,如何确定多边形的边数n或a? R – Rcos(a/2) = d cos(a/2) = (R – d)/R a = 2 arc cos (R – d)/R amax = 2 arc cos (R – d)/R n = 360 /a 即 n = 2π/ a * 3.3.2 圆弧的多边形逼近法 例 d = 20 d = 10 d = 5 d = 2 * 3.3.2 圆弧的多边形逼近法 2、等面积正多边形迫近法 面积 正多边形的面积等于圆的面积 内接正多边形的面积小于圆的面积 步骤 求多边形边长,从而求所有顶点坐标值 由逼近误差值,确定边所对应的圆心角α * 3.3.2 圆弧的多边形逼近法 求多边形径长|OP0|= |OPi| ,从而求所有顶点坐标值 (假定圆心角为?) }d * 3.3.2 圆弧的多边形逼近法 由逼近误差值d,确定边所对应的圆心角α }d * 3.3.3 椭圆的中点算法* 基本思想 与圆弧中点算法类似:确定一个像素后,接着用两个候选像素的中点计算一个判别式的值,由判别式的符号确定下一个像素点 椭圆弧对称性与划分 四部分 每部分组成 上部分 下部分 y x P点处切线斜率为-1 * 3.3.3 椭圆的中点算法* 正负划分性 椭圆的方程: 隐函数方式: P点的坐标 椭圆弧上的法向量 椭圆弧上的切向量 切线斜率为-1的点满足 坐标 * 正负划分性 3.3.3 椭圆的中点算法* b x a ab F(x,y)0 F(x,y)0 F(x,y)=0 * 先讨论椭圆弧的上部分 (xp, yp)下一个点所取两点连线的 中点坐标为(xp +1, yp-0.5) d1=F(xp +1, yp-0.5) = b2(xp +1)2+a2(yp-0.5)2-a2b2 根据d1的符号来决定下一像素是取正右方的那个,还是右下方的那个。 若d1<0,中点在椭圆内,取正右方象素,判别式更新为: d1=F(xp +2, yp-0.5)= d1 +b2(2 xp +3) d1的增量为b2(2 xp +3) 当d1≥0,中点在椭圆外,取右下方象素,更新判别式: d1=F(xp +2, yp-1.5)= d1 +b2(2 xp +3)+a2(-2yp+2) d1的增量为b2(2 xp +3)+a2(-2 yp +2) 3.3.3 椭圆的中点算法* * d1的初始条件 椭圆弧起点为(0,b),第一个中点为(1,b-0.5) 初始判别式:d10=F(1,b-0.5)=b*b+a*a(-b+0.25) 椭圆弧的下部分 下部分,下一象素可能是一正下方或右下方(x发生变化) d2 = F(xp+0.5, yp-1) = b2(xp+0.5)2+a2(yp-1)2-a2b2 若d2 0,则d2’ = F(xp+1.5, yp-2) = d2 + b2(2xp+2) + a2(-2yp+3) 若d2 =0,则d2’ = F(xp+0.5, yp-2) = d2 + a2(-2yp+3) d2 0 = F(X+0.5,Y-1) = b2(X+0.5)2+a2(Y-1)2-a2b2 下半部分弧的终止条件为 y = 0 3.3.3 椭圆的中点算法* (X,Y)为上部的终点 * 程序 3.3.3 椭圆的中点算法* MidpointEllipe(int a, int b, int color) { int x,y; float d1,d2; x = 0; y = b; d1 = b*b +a*a*(-b+0.25); SetPixel(x,y,color); while( b*b*(x+1) a*a*(y-0.5)) { { if (d10) d1 +=b*b*(2*x+3); x++; } else { d1 +=(b*b*(2*x+3)+a*a*(-2*y+2)) x++; y--; } SetPixel(x,y,color); }//上部分 d2 = sqr(b*(x+0.5)) +
文档评论(0)