计算机图形学4圆及椭圆的扫描转换
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MidpointCircle(int r, int color) { int x,y; int d; x=0; y=r; d=1-r; deltx =3; delty =-2*r+2; while(x<y) { drawpixel(x,y,color); if(d<0) { d+ = deltx; x++; deltx +=2 } else {d+ = deltx + delty; x++;y--; deltx +=2; delty+=2; } } }
算法优化
为了进一步提高算法的效率,可以将上面 的算法中的浮点数改写成整数,将乘法运 算改成加法运算,即仅用整数实现中点画 圆法。 使用e=d-0.25代替d e0=1-r 当e为整数时(e<0)(e<-0.25)
算法步骤:
1.输入圆的半径R。 2.计算初始值d=1-R、x=0、y=R。 3.绘制点(x,y)及其在八分圆中的另外七个对称点。 4.判断d的符号。若d<0,则先将d更新为d+2x+3, 再 将 (x,y) 更 新 为 (x+1,y) ; 否 则 先 将 d 更 新 为 d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。
M P2
M
即d 的增量为 2xp +3.
若d>=0, 则P2 为下一个象素,那么再下一个象 素的判别式为: d1 = F(xp + 2, yp - 1.5) 2 2 2 = (xp + 2) + (yp - 1.5) - r = d + (2xp + 3)+(-2 yp + 2)
P1 M
即d 的增量为 2 (xp - yp) +5.
第四讲 圆和椭圆的扫描转换
1 基础知识 2 中点画圆法 3 Bresenham画圆法
1 基础知识
1)直接利用圆的方程生成圆 下面先以圆心在原点、半径r为整数的圆 为例,讨论圆的生成算法。
假设圆的方程为: 2 2 2 x + y = r
x + y = r y = sqrt(r2 - x2) 在一定范围内,每给定一 x值,可得一y值。
当取D(xi+1,yi-1)时
i+1=(xi+1+1)2+(yi-1-1)2-R2= i+2(xi+1)-2(yi-1)+2
Bresenham_Circle(int r,int color) {int x,y,delta,delta1, delta2,direction; x=0;y=r;delta=2*(1-r);
将 (x,y) 更 新 为 (x+1,y) ; 否 则 先 将 d 更 新 为 d+2(x-
y)+5,再将(x,y)更新为(x+1,y-1)。
5.当x<=y时,重复步骤3和4。否则结束。
中点画圆法程序代码
MidpointCircle(int r, int color) { int x,y; float d; x=0; y=r; d=1.25-r; drawpixel(x,y,color); while(x<=y){ if(d<0){ d=d+2*x+3; x++ } else{d= d+2*(x-y) + 5; x++;y-;} } }
①
Pi(xi,yi)
⑤ ④ ②
H(xi+1,yi) D (xi+1,yi-1)
③
选择像素的原则
V
(xi,yi-1)
使其与实际圆弧的距离平方达到最小
Bresenham画圆算法
圆弧与点(xi,yi)附近光栅网格的相交关系有5种 右下角像素D (xi,yi)与实际圆弧的近似程度
i=(xi+1)2+(yi-1)2-R2
x i 1 round ( R cos i 1 ) y i 1 round ( R sin i 1 ) )
但仍要采用浮点运算、乘法运算、取整运算。
2)八分法画圆
利用圆的对称性:
y y=-x
(-y,x)
(y,x)
y=x
(-x,y)
(-x,-y)
(x,y)
(x,-y)
(-y,-x)
若d’<0,则选D 若d’>0,则选V
情形⑤也 适用
若d’=0,则选D
Bresenham画圆算法
当i=0时,D在圆上, ③ 取D点作为下一个象素
Bresenham画圆算法
当i<0时,
若d≤0,选H
若d>0,选D
当i>0时,
若d’ ≤0,选D 若d’>0,选V
当i<0时,D在圆内,①② 当i=0时,D在圆上,③
①
Pi(xi,yi)
⑤ ④ ②
H(xi+1,yi)
当i>0时,D在圆外,④⑤
V
D (xi+1,yi-1)
③
(xi,yi-1)
Bresenham画圆算法
当i<0时,D在圆内,①② 情形②,选mH ,mD 中最小者 d=mH - mD =|(xi+1)2+yi2-R2| - |(xi+1)2+(yi-1)2-R2| =(xi+1)2+yi2-R2 + (xi+1)2+(yi-1)2-R2 =2 (i+yi)-1
2 中点画圆法
利用圆的对称性,只须讨论1/8圆。第二个8分圆。
P(xp ,yp )
P1
M P2
P为当前点亮象素,那么,下一个点亮的象素可能 是P1(xp+1,yp)或P2(xp +1,yp -1)。
构造函数:F(X,Y)=X + Y - r ;则 F(X,Y)= 0 (X,Y)在圆上; F(X,Y)< 0 (X,Y)在圆内; F(X,Y)> 0 (X,Y)在圆外。 设M为P1、P2间的中点,M=(Xp+1,Yp-0.5)
对于圆心在(x0,y0)、半径为r的圆,先对圆心在原 点,半径为r的8分圆进行扫描转换,每确定一个象素,可 输出原始圆的8个点。 void Circle8Points(int x0,int y0, int x,int y,COLORREF c) { pDC->SetPixel(x0+x,y0+y,c); pDC->SetPixel(x0-x,y0+y,c); pDC->SetPixel(x0+x,y0-y,c); pDC->SetPixel(x0-x,y0-y,c); pDC->SetPixel(x0+y,y0+x,c); pDC->SetPixel(x0-y,y0+x,c); pDC->SetPixel(x0+y,y0-x,c); pDC->SetPixel(x0-y,y0-x,c); }
5.当x<=y时,重复步骤3和4。否则结束。
中点画圆法程序代码
MidpointCircle(int r, int color) { int x,y; float d; x=0; y=r; d=1-r; drawpixel(x,y,color); while(x<=y){ if(d<0){ d+ = 2*x+3; x++ } else{d+ = 2*(x-y) + 5; x++;y--; } } }
x i 1 x i 1 x 0, R
2 2
2
2
2
y
2
y i 1 round ( R x i 1 )
缺点:浮点运算,开方, 取整,不均匀。
x
也可应用圆的参数方程画出分布比较均匀的点. x = Rcos y = Rsin
i 1 i ( 为一固定角度步长
(y,-x)
结论:只需对一个八分圆进行扫描转换。
y y=x R
x
图 5-10
1/8圆 弧
3)画任意圆的方法
百度文库
当圆心坐标(xc ,yc ) ,半径为整数r时:
(x-xc)2+(y-yc)2=r2 可以先对圆心坐标(0 ,0 ) ,半径为r的八 分圆进行扫描转换,根据圆的对称性,得到 八个对称点,再将这八个点进行平移,即可 得到原始圆上的对应点。
3 Bresenham画圆法
Bresenham画圆法与中点画圆法有很 多共同之处,不同之处主要是判别式的设 计。
Bresenham画圆算法
顺时针画第一四分圆,下一步选择哪个点? 基本思想:
通过比较像素与圆的距离平方来避免开方运算
下一像素有3种可能的选择
mH=|(xi+1)2+yi2-R2| mD=|(xi+1)2+(yi-1)2-R2| mV=|xi2 +(yi-1)2-R2 |
P2 M
最后一个问题:判别式d的初始值
d 0 F (1, r 0 . 5 ) 1 ( r 0 .5 ) r
2 2
1 . 25 r
算法步骤:
1.输入圆的半径R。
2.计算初始值d=1.25-R、x=0、y=R。
3.绘制点(x,y)及其在八分圆中的另外七个对称点。
4.判断d的符号。若d<0,则先将d更新为d+2x+3,再
P1
2
2
2
M P2
有如下结论: F(M)< 0 ->M在圆内-> 取P1 F(M)>= 0 ->M在圆外-> 取P2 为此,可采用如下判别式:
P1 M P2
d = F(M) = F(xp + 1, yp - 0.5) 2 2 2 =(xp + 1) + (yp - 0.5) - r 若d<0, 则P1 为下一个象素,那么再下一个象素 的判别式为: d1 = F(xp + 2, yp - 0.5) 2 2 2 = (xp + 2) + (yp - 0.5) - r P1 = d + 2xp +3
本讲小结
1 基础知识
• 了解直接用圆的方程计算确定圆上 的像素的方法及其不足。 • 掌握通过一个八分圆的扫描转换, 画出任意圆周的方法。
2 中点画圆法
• 理解中点画圆法的基本思想,掌握 中点画圆算法及其特点。 • 能够应用中点画圆法,编程实现画 圆的功能。 •掌握Bresenham画圆算法及其特点。
3 Bresenham画圆法
实验三
实验目的:理解和掌握圆的扫描转换 的中点画圆算法。 实验名称:圆的中点画圆算法 实验步骤:(写出实际实现的程序和 结果) 实验总结。
若d<0,则选H 若d>0,则选D
情形①也 适用
若d=0,则选H
Bresenham画圆算法
当i>0时,D在圆外, ④⑤ 情形④,选mv ,mD 中最小者 d’=mD - mV =|(xi+1)2+(yi-1)2-R2 | - |xi2+(yi-1)2-R2| =(xi+1)2+(yi-1)2-R2 + xi2+(yi-1)2-R2 =2 (i-xi)-1
上述算法能否再改进呢? 注意到d的增量是x,y的线性函数, 每当x递增1,则d的增量递增Δ x=2 每当y递减1,则d的增量递增Δ y=2 Δ x初始值=3;Δ y初始值=-2r+2
x=0;y=r;d=1-r;deltax=3;delty=-2*r+2 x=0; y=r; d=1-r; ...……… ...……… if(d<0) if(d<0) { d+ = deltax; x++; deltax+=2 ;} { d+ = 2*x+3; x++ ;} else else {d+ = deltx+delty; x++;y--; {d+ = 2*(x-y) + 5; x++;y--; } deltx+=2; delty+=2 }
while(y>=0) {drawpixel(x,y,color); if(delta<0) {delta1=2*(delta+y)-1; if(delta1<=0) direction=1; else direction=2; }
else if (delta>0) {delta2=2*(delta-x)-1; if (delta<=0) direction=2; else direction=3;} else direction=2; switch(direction) {case 1: x++; delta+=2*x+1; break; case 2: x++;y--; delta+=2*(x-y+1); break; case 3: y--; delta+=(-2*y+1); break;} } }
当i=0时,
选D
Bresenham画圆算法
判别式的递推关系 当取H(xi+1,yi)时
i+1=(xi+1+1)2+(yi-1)2-R2= i+2(xi+1)+1
当取V(xi,yi-1)时
i+1=(xi+1)2+(yi-1-1)2-R2= i-2(yi-1)+1