计算机图形学(圆弧的扫描转换II)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

b2(xi+1) ≥ a2(yi-0.5)
2014-2015-1:CG:SCUEC
9
圆弧之Bresenham算法实现
• x0=0, y0=R
d1 =3–2*R • 当di ≤ 0时 xi= xi-1+1 di+1=di+ 4xi-1+6 • 当di>0时 xi= xi-1+1,yi= yi-1-1 di+1=di+4(xi-1-yi-1)+10
2014-2015-1:CG:SCUEC
4
判别式的改进
设与当前圆周最近的像素点是P,圆下面可能穿越的区 域只能有五种情况: ① H点在圆外,L点在圆内 – R=7,xp=1, 取H点; – R=13,xp=7, 取L点; ② H点与L点都在圆内 – R=9,xp=3, 取H点 ③ H点与L点都在圆外 – R=7,xp=4, 取L点 ④ H点在圆上,L点在圆内 – R=13,xp=4,取H点 ⑤ H点在圆外,L点在圆上 – R=5,xp=2,取L点
10
2014-2015-1:CG:SCUEC
Bresenham算法画圆举例
例子:画圆心(0,0),半径R=5的圆
x0=0,y0=5 点亮点(x0,y0)=(0,5)
d1=3-2R=-7≤0
点亮点(x1,y1)=(1,5) d2=d1+4x0+6=-1≤0 点亮点(x2,y2)=(2,5) d3=d2+4x1+6=9>0
void bresenham_arc(int R, int color) { int x,y,d; x=0; y=R; d=3-2*R; while(x<y){ DrawPixel(x,y,color); if (d<=0) d+=6; else{ d=d-4*y+10; y-=1; } d+=4*x; x+=1; } if(x==y) DrawPixel(x,y,color); }
不能精确求出圆的内接多边形顶点,取得 越小,误差越小
2014-2015-1:CG:SCUEC
14
多边形迫近法的改进
设圆心在坐标原点O(0,0),内接正 多边形的三个相邻点为Pi-1, Pi, Pi+1, 如图所示。 Pi-1A平行OPi+1, Pi+1A 平行OPi-1 有:OA 2cos OP i OPi 1 OPi 1 或: OPi 1 2cos OPi OPi 1
xi 1 R cos( i ) xi cos yi sin yi 1 R sin( i ) xi sin yi cos
Pi+1
或表示为矩阵形式
x i 1 cos y sin i 1 sin x i y cos i
个像素是取Hi+1还是Li+1,应 计算如下的判别式: di+1 = D(Hi+1)+D(Li+1) = [(xi-1+1+1)2+yi-12-R2]+[(xi-1+1+1)2+(yi-1-1)2-R2] = [D(Hi)+2xi-1+3]+[D(Li)+2xi-1+3] = di+4xi-1+6
2014-2015-1:CG:SCUEC
Pi+1 Pi

A
O
Pi-1
xi 1 xi xi 1 2 cos 设Pi点的坐标为(xi, yi),则 yi 1 yi yi 1
只需两次乘法,但须知道圆上两个相邻内接多边形的顶点
2014-2015-1:CG:SCUEC
只需要讨论第一象限椭圆弧的生成, 在生成这段椭圆弧时, 要分两部分完成 ■ 上半部分,斜率的绝对值<1,单位步长应为X方向 ■ 下半部分,斜率的绝对值>1,单位步长应为Y方向
2014-2015-1:CG:SCUEC
17
椭圆上半部分的生成
设与当前椭圆弧最近的像素点是P(xi,yi)
下一个候选像素点只能是正右方的点 Pu(xi+1,yi)或者是右下方的Pd(xi+1,yi-1)
7
判别式di的增量计算
di = D(Hi)+D(Li) = [(xi-1+1)2+yi-12-R2]+[(xi-1+1)2+(yi-1-1)2-R2] 若di > 0,表示Li点更接近圆 周,点亮Li(xi-1+1,yi-1-1),下
一个像素是取Hi+1还是Li+1,
应计算如下的判别式: di+1 = D(Hi+1)+D(Li+1)
2014-2015-1:CG:SCUEC
C

i
Pi
用正多边形迫近圆弧法
13
多边形迫近法的优化
已知点Pi,计算点Pi+1需要作四次乘法,再采 用画直线方法画PiPi+1 为降低计算量,采用cos 1, sin
或cos 1- 2/2, sin ,取 = 2-k,则乘 法可用移位和加减法实现
计算机图形学
第3章 基本光栅图形算法
圆弧的扫描转换
DDA法 正负法 中点法 Bresenham算法 多边形迫近法—圆与椭圆
2014-2015-1:CG:SCUEC
2
生成圆弧之Bresenham算法
基本原理
■ 设与当前圆周最近的像素 点是Pi-1(xi-1,yi-1)
■ 下一个与圆周最近的像素 点只能是正右方的点 Hi(xi-1+1,yi-1)或者是右下方 的点Li(xi-1+1,yi-1-1) ■ 记D(Hi) = (xi-1+1)2+yi-12-R2, D(Li) = (xi-1+1)2+(yi-1-1)2-R2 令判别式Di = |D(Hi)| - |D(Li)| ,然后根据Di的正负来 判断下一个像素点是取Hi 点还是Li 点 ■ 若Di<0,表示Hi点更接近圆周,点亮Hi(xi-1+1,yi-1) ■ 若Di≥0,表示Li点更接近圆周,点亮Li(xi-1+1,yi-1-1)
2014-2015-1:CG:SCUEC
5
判别式的改进
考察圆穿越不同区域时di的符号与Di的符号是否一致
■ 圆穿越①区域时,D(Hi) > 0,D(Li) < 0,有 Di = | D(Hi) |-| D(Li) | = D(Hi) + D(Li) = di ■ 圆穿越②区域时,D(Hi) <0,D(Li) < 0,有 Di = | D(Hi) |-| D(Li) | < 0,di= D(Hi) + D(Li) < 0 ■ 圆穿越③区域时,D(Hi) > 0,D(Li) > 0,有 Di = | D(Hi) |-| D(Li) | > 0,di= D(Hi) + D(Li) > 0 ■ 圆穿越④区域时,D(Hi) = 0,D(Li) < 0,有 Di = | D(Hi) |-| D(Li) | = D(Li) = di ■ 圆穿越⑤区域时,D(Hi) > 0,D(Li) = 0,有 Di = | D(Hi) |-| D(Li) | = D(Hi) = di
椭圆弧 的生成
xi 1 a cos( i ) , yi 1 b sin( i )
Hale Waihona Puke Baidu由此可得
xi 1 xi y M y i 1 i
cos 其中 M b sin a
a sin b cos
= [(xi-1+1+1)2+(yi-1-1)2-R2]+[(xi-1+1+1)2+(yi-1-1-1)2-R2]
= [D(Hi)+2(xi-1-yi-1)+4]+[D(Li)+2(xi-1-yi-1)+6] = di+4(xi-1-yi-1)+10
2014-2015-1:CG:SCUEC
8
判别式di的增量计算
15
椭圆的多边形迫近法
设椭圆的中心在原点,长短轴分别为a 和 b,且平行于坐标柚,则该椭圆的参数方 程为 x a cos ,y b sin 设顶点序列的第i个顶点为 Pi ( xi , yi ) (a cos i , b sin i ) ,则 下一个顶点 Pi 1 ( xi 1 , yi 1 )的坐标应满足
设M(xi+1, yi-0.5)为Pu与Pd的中点 ■ 构造判别式: d1i=F(xM, yM)=b2(xi+1)2+a2(yi-0.5)2-a2b2
P(xi,yi) P (x +1,y ) u i i M(xi+1,yi-0.5) Pd(xi+1,yi-1)
■ 如果d1i >0,中点在椭圆外,应取右下方像素Pd(xi+1,yi-1)
2014-2015-1:CG:SCUEC
18
椭圆上半部分的终止条件
椭圆上任意一点P(x,y)的切线斜率为: dy/dx=-2b2x/(2a2y)
上半部分每一点的切线斜率都大于-1, 故上半部分终止的条件为:下一个中点 (xi+1, yi-0.5)的切线斜率小于等于-1,即
-2b2(xi+1)2/2a2(yi-0.5) ≤-1
结论: di的符号与Di的符号是一致的
2014-2015-1:CG:SCUEC
6
判别式di的增量计算
di = D(Hi)+D(Li) = [(xi-1+1)2+yi-12-R2]+[(xi-1+1)2+(yi-1-1)2-R2] 若di ≤ 0,表示Hi点更接近圆
周,点亮Hi(xi-1+1,yi-1),下一
判别式di的初始值=?
d1 D(H1 ) D(L1 )
2 [( x0 1) 2 y0 R 2 ] [( x0 1) 2 ( y0 1) 2 R 2 ]
[1 R 2 R 2 ] [1 (R 1) 2 R 2 ] 3 2R
点亮点(x3,y3)=(3,4)
按45◦线对称翻转
按X轴对称翻转
2014-2015-1:CG:SCUEC
按Y轴对称翻转
11
正负法与Bresenham算法比较
正负法主要用于笔式绘图仪中,以迎合绘图 仪只有水平和垂直方向的运动。每次选出的
下一个像素并不一定是离圆弧最近的像素点
Bresenham算法在候选的两个像素中,总是 选定离圆弧最近的像素为圆弧的一个近似点,
16
2014-2015-1:CG:SCUEC
生成椭圆之中点法
已知椭圆中心在(0,0), 长短半轴分别 2 2 x y 为a,b, 则椭圆方程为: 1 2 2 a b
△ 0 b2 x2 a2 y 2 a2b2 F( x, y)
<0 说明(x,y)在椭圆内 F(x,y) =0 说明(x,y)在椭圆上 >0 说明(x,y)在椭圆外
判别式更新为:d1(i+1)=F(xi+2,yi-1.5)=d1i+b2(2xi+3)+2a2(-yi+1)
■ 如果d1i ≤0,中点在椭圆内,应取正右方像素Pu(xi+1,yi)
判别式更新为:d1(i+1)=F(xi+2,yi-0.5)=d1i+b2(2xi+3)
■ 判别式初值为:d10=F(1,b-0.5)=b2+a2(-b+0.25)
因此,Bresenham算法比正负法决定的像素
更合理
2014-2015-1:CG:SCUEC
12
圆的多边形迫近法
基本思想
按一定方式计算给定圆弧轨迹上的一系列顶点, 然后用连接相邻点的一系列直线段来逼近圆弧。
设圆弧所在圆的半径为R,圆弧的起始角和终止角分别为 0 和 1 , 把圆弧分割成 n 份,则相邻两个顶点之间的夹角为 a (1 0 ) / n 。 设顶点序列的第 i 个点为 Pi ( xi , yi ) (R cos i , R sin i ) , i 为该点的 幅角。则下一个顶点 Pi 1 的坐标为
2014-2015-1:CG:SCUEC
3
判别式的改进
问题:判别式Di = |D(Hi)| - |D(Li)|的计算要用到绝对值 运算,能否将绝对值运算去掉呢? 如右图所示,可看出D(Hi)>0, D(Li)<0,因此可以考虑把判 别式改为di=D(Hi)+D(Li),在 这种情况下di的符号与Di的符 号是一致的。 问题:是不是任何情况下di的 符号与Di的符号都是是一致的 呢?如果是,如何证明?
相关文档
最新文档