第7讲 椭圆的扫描转换

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

若d2≤0,取 (xi+1,yi-1) 若d2>0,取(xi,yi-1) 用上半部分计算的最后点(x,y)来计算下半部分中d的初值: d=b2(x+0.5)2+a2(y-1)2-a2b2
递推式
yi
P
d>0,取正下方元素(xi,yi-1)
yi-1 yi-2
xi xi+1 xi+2
(b) d>0的情况
误差项的递推 d1≤0: 取Pu(xi+1,yi)
yi
P
yi-1 yi-2 xi xi+1 xi+2
(a) d<=0的情况
d1 F(xi 2,yi 0.5 ) b 2(xi 2 )2 a 2(yi 0.5 )2 a 2b 2
b 2(xi 1 )2 a 2(yi 0.5 )2 a 2b 2 b 2( 2 xi 3 ) d1 b 2( 2 xi 3 )
void CBrhellipseView::OnBrhellipse() { CDC* pDC=GetDC(); int a=200,b=100,xc=300,yc=200,c=0xff00ff; int x,y;double d1,d2; x=0;y=b; d1=b*b+a*a*(-b+0.25); pDC->SetPixel(x+300,y+200,c);pDC->SetPixel(-x+300,y+200,c); pDC->SetPixel(x+300,-y+200,c);pDC->SetPixel(-x+300,-y+200,c); while(b*b*(x+1)<a*a*(y-0.5)) { if(d1<0) { d1+=b*b*(2*x+3); x++; } else { d1+=b*b*(2*x+3)+a*a*(-2*y+2); x++;y--; } pDC->SetPixel(x+xc,y+yc,c);pDC->SetPixel(-x+xc,y+yc,c); pDC->SetPixel(x+xc,-y+yc,c);pDC->SetPixel(-x+xc,-y+yc,c); Sleep(50); }
在下半部分椭圆绘制算法的原理2判别式的初始值弧起点为再来推导椭圆弧下半部分的绘制公式原理请思考判别式和初始值1用上半部分计算的最后点xy来计算下半部分中d的初值
第7讲 椭圆的扫描转换
5.3 椭圆的扫描转换
5.3.1 椭圆的特征
y (-x,y) (x,y) b a (-x,-y) (x,-y) x
图5-14

F ( x, y ) F ( x, y ) , x y
(2b 2 x,2a 2 y)
从而弧上斜率为-1的点满足: 2b2x = 2a2y 可求得斜率为-1的点坐标:
( a2 a b
2 2
,
b2 a b
2 2
)
5.3.2 椭圆的中点Bresenham算法
算法原理:从(0,b)到(a,0)顺时针地确定最佳逼近于第 一象限椭圆弧的像素序列。 在上半部分, -1 ≤ k ≤0 , 最大位移方向为x; 在下半部分, k ≤-1 , 最大位移方向为y;
b 2 ( xi 1) 2 a 2 ( yi 0.5) 2 a 2b 2
• 若d1≤0,取Pu(xi+1,yi) • 若d1>0,取Pd(xi+1,yi-1)
p(x i,yi) pu(xi+1,yi)
M(x i+1,y i-0.5)
pd(xi+1,yi-1)
5-17
上半部分椭圆弧的绘制原理
引理5-1:若在当前中点,法向量的y分量比x分量大, 即
b ( xi 1) a ( yi 0.5)
2 2
而在下一个中点,不等号改变方向,则说明椭圆弧 从上部分转入下部分。
y P Pu Pd P Pl Pr x
图5-16
Bresenham椭圆绘制算法的原理
F(x,y)= b2x2+a2y2-a2b2=0 弧上一点(x,y) 处的法向量
y P Pu Pd P Pl Pr x
图5-16
Bresenham椭圆绘制算法的原理
先推导上半部分的椭圆绘制公式
p(x i,yi)
pu(xi+1,yi)
M(x i+1,y i-0.5)
pd(xi+1,yi-1)
5-17
上半部分椭圆弧的绘制原理
判别式
d1 F ( xi 1, yi 0.5)
递推式
yi
P
d<=0,取右下方元素(xi+1,yi-1)
yi-1 yi-2 xi xi+1 xi+2
(a) d<=0的情况
算法描述
(1)输入椭圆的长半轴a和短半轴b。 (2)计算初始值:d=b2+a2(-b+0.25),x=0,y=b. (3)绘制点(x,y)及其在四分象限上的另外3个对称点. (4)判断d的符号。若d<=0,则先将d更新为d+b2(2xi+3),再将(xi,yi )更新 为(xi+1,yi);否则先将d更新为d+b2(2xi+3)+a2(-2yi+2),再将(xi,yi )更新为 (xi+1,yi-1) (5)当b2(x+1)<a2(y-0.5)时,重复步骤(3)和(4),否则转(6) (6)用上半部分计算的最后点(x,y)来计算下半部分中d的初值: d=b2(x+0.5)2+a2(y-1)2-a2b2 (7)绘制点(x,y)及其在四分象限的另外3个对称点b (8)判断d的符号.若d<=0,则先将d更新为d+b2(2xi+2)+a2(-2yi+3),再将(x,y)) 更新为(x+1,y-1); 否则先将d更新为d+a2(-2yi+3),再将(x,y)更新为(x,y-1). (9)当y>=0时,重复步骤(7)和(8),否则结束。
y 二分量相等的法向量 上半部分 下半部分 x
图5-15
第一象限的椭圆弧
椭圆上点(x,y)处的法向量为:
F F 2 2 N ( x, y ) i j 2b xi 2a yj x y
在上半部分,法向量y的分量更大,椭圆弧上 各点的切线斜率k满足-1 ≤ k ≤0 在下半部分,法向量x的分量更大,椭圆弧上 各点的切线斜率k满足 k ≤-1
增量为:b2(2xi+3)
yi
P
d1>0:取Pd(xi+1,yi-1)
yi-1 yi-2 xi xi+1 xi+2
(b) d>0的情况
d1 F ( xi 2, yi 1.5) b 2 ( xi 2) 2 a 2 ( yi 1.5) 2 a 2b 2
b 2 ( xi 1) 2 a 2 ( yi 0.5) 2 a 2b 2 b 2 (2 xi 3) a 2 (2 yi 2)
d2= b*b*(x+0.5)*(x+0.5)+a*a*(y-1)-a*a*b*b; while(y>0) { if(d2<0) { d2+=b*b*(2*x+2)+a*a*(-2*y+3); x++;y--; } else { d2+=a*a*(-2*y+3); y--; } pDC->SetPixel(x+xc,y+yc,c); pDC->SetPixel(-x+xc,y+yc,c); pDC->SetPixel(x+xc,-y+yc,c); pDC->SetPixel(-x+xc,-y+yc,c); Sleep(50); } ReleaseDC(pDC); }
2 2
再来推导椭圆弧下半部分的绘制公式 原理
p(x i,yi)
M(x i+1,y i-0.5)
pl(xi,yi-1)
pr(xi+1,yi-1)
请思考

5-19
下半部分椭圆弧的绘制原理
判别式和初始值
d 2i b 2 ( xi 0.5) 2 a 2 ( yi 1) 2 a 2b 2
d1 b 2 (2 xi 3) a 2 (2 yi 2)
增量为:b2(2xi+3)+a2(-2yi+2)
判别式的初始值 弧起点为 (0, b),故第一个中点为(1,b-0.5)
d10 F (1, b 0.5) b 2 a 2 (b 0.5) 2 a 2b 2 b a (b 0.25)
长半轴为a,短半轴为b的标准椭圆
F ( x, y ) b x a y a b 0
2 2 2 2 2 2
• 对于椭圆上的点,有F(x,y)=0;
• 对于椭圆外的点,F(x,y)>0;
• 对于椭圆内的点,F(x,y)<0。
解决问题:
Hale Waihona Puke yx以弧上斜率为-1的点作为分界将第一象限椭圆弧分 为上下两部分。
小 结与作业
掌握 Bresenham画椭圆的公式推导 作业P145 5.9
相关文档
最新文档