ch3二维图形生成技术(二次曲线)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
若d<0, 则P1 为下一个象素,那么再下一个象素 的判别式为:
P1
d1 = F(xp + 2, yp - 0.5) 2 2 = (xp + 2) + (yp - 0.5) = d + 2xp +3 即d 的增量为 2xp +3.
-R
2
M P2
中点画圆法
若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) 即d 的增量为 2 (xp - yp) +5. P1 d的初值: d0 = F(1, R-0.5) M 2 2 = 1 + (R-0.5) - R P2 = 1.25 - R
圆的等面积正多边形逼近法
当用内接正多边形逼近圆时,其面积要 小于圆的面积;而当用圆的外切正多边 形逼近圆时,其面积则要大于圆的面积。 为了使近似代替圆的正多边形和圆之间 在面积上相等,只有使该正多边形和圆 弧相交,称之为圆的等面积正多边形。
圆的等面积正多边形逼近法
步骤: 求多边形径 长,从而求 所有顶点坐 标值 由逼近误差 值,确定边 所对应的圆 心角α
程序如下(完全用整数实现): MidpointCircle(r,color) Int r, color; { int x,y,d; x = 0; y = r; d = 1-r; putpixcel(x,y,color); while( x < y) { if (d <0) { d += 2*x+3; x++; } else { d += 2*(x-y)+5; x++ ; y--; } putpixcel(x,y,color); } }
第二章 二维图形生成技术
第二节 二次曲线
一、圆弧
1、中点算法
2、内接正多边形迫近法 3、等面积正多边形逼近法 4、生成圆弧的正负法 二、椭圆弧扫描转换
1、中点算法
第三章 二次曲线
圆是图形系统中常用的元素。我们将圆心定义为 ( xc , yc ) 。 圆的方程为: (x-xc)2+(y-yc)2=r2 所以圆为:距离中心位置 ( xc , yc )为给定值r的点集。 利用这个方程,我们可以沿x轴,从
Pi-i
Bresenham画圆算法
当di<0时->取Hi -> yi=yi-1,则 di+1 = di + 4xi-1 + 6
当di ≥ 0时->取Li -> yi=yi-1-1, 则di+1 = di + 4(xi-1-yi-1) + 10
易知 x0=0,y0=R,x1=x0+1 因此 d0 =12 + y02 + 12 +(y0 - 1)2 - 2R2 = 3 - 2y0= 3 - 2R
中点画圆法
为了进一步提高算法的效率,可以将上面的 算法中的浮点数改写成整数,将乘法运算改 成加法运算,即仅用整数实现中点画圆法。 使用e=d-0.25代替d e0=1-R
所以:初始化运算d0 = 1.25 – R 对应于 e 0= 1- R 判别式 d < 0 对应于 e < -0.25 又因为:e的初值e0为整数,运算过程中的分量也为整数, 故e始终为整数 所以: e < -0.25 等价于 e < 0
xc r
xc r 到
,以单位步长计算对应的y值,从而得
到圆周上每点的位置。
圆的扫描转换算法
下面仅以圆心在原点、半径R为 整数的圆为例,讨论圆的生成算法。 假设圆的方程为: X + Y = R
2 2 2
扫描转换圆弧
处理对象:圆心在原点的圆弧 圆的八对称性
圆弧扫描算法
X + Y = R 2 2 Y = Sqrt(R - X ) 在一定范围内,每给定一个 X值,可得一个Y值。
设圆的方程为F(x,y)=X + Y - R =0; 假设求得Pi的坐标为(xi,yi); 则当Pi在圆内时-> F(xi,yi)<0 -> 向右-> 向圆外 Pi在圆外时-> F(xi,yi)>0 -> 向下-> 向圆内
2
2
2
生成圆弧的正负法
即求得Pi点后选择下一个象素点Pi+1的规则为: 当F(xi,yi) ≤0 取xi+1 = xi+1,yi+1 = yi; 当F(xi,yi) >0 取xi+1 = xi, yi+1 = yi - 1; 这样用于表示圆弧的点均在圆弧附近,且使 F(xi,yi) 时正时负,故称正负法(课本逐点比 较法)。 快速计算的关键是F(xi,yi) 的计算,能否采用增 量算法?
生成圆弧的正负法
若F(xi,yi) 已知,计算F(xi+1,yi+1) 可分两种
情况: 1、F(xi,yi)≤0-> xi+1 = xi+1,yi+1 = yi; 2 2 2 -> F(xi+1,yi+1)= (xi+1 ) +(yi+1 ) -R 2 2 2 -> = (xi+1) + yi -R = F(xi,yi) +2xi +1 2、 F(xi,yi)>0-> xi+1 = xi,yi+1 = yi -1; 2 2 2 -> F(xi+1,yi+1)= (xi+1 ) +(yi+1 ) -R 2 2 2 -> = xi +(yi –1) -R = F(xi,yi) - 2yi +1 3、初始值:略
Bresenham画圆算法
使用Bresenham算法扫描转换圆时需要的步骤: Plot(x+k,y+h); Plot(-x+k,-y+h); Plot(y+k,x+h); Plot(-y+k,-x+h); Plot(-y+k,x+h); Plot(y+k,-x+h);
–4、根据圆的对称性,由当前坐标(x,y)绘制八个点
Plot(-x+k,y+h); Plot(x+k,-y+h);
5、跳到步骤2
算法 三:正负划分性
圆弧的正负划分性
F ( x, y) x 2 y 2 R2 0
圆弧外的点:F(X,Y)>0 圆弧上的点:F(X,Y)=0 圆弧内的点:F(X,Y)<0
生成圆弧的正负法
原理:(只考虑第一象限)
P1 M P2
2 2 2
中点画圆法
有如下结论:
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
中点画圆法
MidpointCircle(int r, int color) { int x,y; float d; x=0; y=r; d=1.25-r; putpixel(x,y,color); while(x<y){ if(d<0){ d+ = 2*x+3; x++ } else{d+ = 2*(x-y) + 5; x++;y--; } putpixel(x,y,color); } }
xi =Rcos i ; yi =Rsin i
圆的内接正多边形逼近法
内接正n边形代替圆
计算多边形各顶点的递推公式
Xi+1
=
Rcos( Rsin
a+ i)
Yi +1 Xi+1
=
(a+ i) - sin a cosa Xi Yi
cos a sin a
Yi +1
因为: a是常数, sin a, cosa只在开始时计算一 次所以,一个顶点只需4次乘法,共4n次乘法, 外加直线段的中点算法的计算量。
二、椭圆的扫描转换
椭圆方程:
b2x2+a2y2-a2b2=0
椭圆的扫描转换
F(x,y)=b2x2+a2y2-a2b2=0 椭圆的对称性,只考虑第一象限椭圆弧生成,分 上下两部分,以切线斜率为-1的点作为分界点。 椭圆上一点处的法向: N(x,y) = (F)' x i + (F)' y j = 2b2 x i + 2a2 y j
2 2 2
y
当X取整数时,Y须取整。
缺点:浮点运算,开方, 取整,不均匀。
x
• 两种直接离散方法: 离散点:
利用隐函数方程 2 y 2 R 2 x ( xi , yi R 2 xi2 ) 取整 xi,yi ,r ) (
离散角度:
x R cos 利用参数方程 y R sin (round( R cos i ), round( R sin i ))
算法 一:中点画圆法
利用圆的对称性,只须讨论1/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)
在上半部分,法向量的y分量大 在下半部分,法向量的x分量大 法向量 两分量相等 M1 上半部分 下半部分 M2
生成圆弧的多边形逼近法
? 圆的内接正多边形迫近法 ? 圆的等面积正多边形迫近法
圆的内接正多边形逼近法
思想:当一个正多边形的边数足够多时,该多 边形可以和圆无限接近。即
lim ( 边正内接多边形) 圆 n
因此,在允许的误差范围内,可以用正多边形 代替圆。 设内接正n边形的顶点为Pi(xi,yi), Pi的幅角为i , 每一条边对应的圆心角为a,则有
中点画圆法
上述算法能否再改进呢?
注意到d的增量是x,y的线性函数, 每当x递增1,则d的增量递增Δx=2 每当y递减1,则d的增量递增Δy=2 Δx初始值=3;Δy初始值=-2r+2 思考题:怎样实现算法?
算法 二: Bresenham画圆算法
现在从A点开始向右下方逐点来寻找 弧AB要用的点。如图中点Pi-1是已 选中的一个表示圆弧上的点,根 据弧AB的走向,下一个点应该从 Hi或者Li中选择。显然应选离AB最 近的点作为显示弧AB的点。 假设圆的半径为R,显然,当 xhi2 + yhi2 -R2 ≥ R2 - (xli2 + yli2)时,应该取Li。否则取Hi。 令di = xhi2 + yhi2 + xli2 + yli2 - 2R2 显然,当di ≥0 时 应该取Li。否则取Hi。
• 开根,三角函数运算,计算量大,不可 取。
角度DDA法
x = x0 + Rcos y = y0 + Rsin dx =- Rsind dy = Rcosd xn+1 =x n + dx y n+1 =y n + dy xn+1 = x n + dx = x n - Rsind =x n - (y n - y 0 )d y n+1 = y n + dy = y n + Rcosd =y n + (x n - x 0 )d 显然,确定x,y的初值及d值后,即可以增量方 式获得圆周上的坐标,然后取整可得象素坐标。 但要采用浮点运算、乘法运算、取整运算。
Pi-1
Hi B
A
Li
应取Hi还是取Li
Bresenham画圆算法
剩下的问题是如何快速的计算di。设图中Pi-1的坐标为 (xi-1,yi-1),则Hi和Li的坐标为(xi,yi-1)和(xi,yi-1-1 ) di = xi2 + yi-12 + xi2 + (yi-1-1)2 - 2R2 =2xi2 + 2yi-12 - 2yi-1 - 2R2 di+1 = (xi + 1)2 + yi2 + (xi + 1)2 + (yi - 1)2 - 2R2 =2xi2 + 4xi + 2yi2 - 2yi - 2R2 + 3
Pi-1
Hi B Li
A
应取Hi还是取Li
Bresenham画圆算法
使用Bresenham算法扫描转换圆时需要的步骤:
–1、赋初值:y=半径;(h,k)=圆心坐标;
x=0;d=3-2r;
–2、测试整个圆是否扫描转换完毕。如果x>y,
则程序结束。
–3、计算下一个象素的位置。
如果d<0,则d=4x+6,x=x+1; 如果d>=0,则d=4(x-y)+10, x=x+1,y=y+1。
P1
d1 = F(xp + 2, yp - 0.5) 2 2 = (xp + 2) + (yp - 0.5) = d + 2xp +3 即d 的增量为 2xp +3.
-R
2
M P2
中点画圆法
若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) 即d 的增量为 2 (xp - yp) +5. P1 d的初值: d0 = F(1, R-0.5) M 2 2 = 1 + (R-0.5) - R P2 = 1.25 - R
圆的等面积正多边形逼近法
当用内接正多边形逼近圆时,其面积要 小于圆的面积;而当用圆的外切正多边 形逼近圆时,其面积则要大于圆的面积。 为了使近似代替圆的正多边形和圆之间 在面积上相等,只有使该正多边形和圆 弧相交,称之为圆的等面积正多边形。
圆的等面积正多边形逼近法
步骤: 求多边形径 长,从而求 所有顶点坐 标值 由逼近误差 值,确定边 所对应的圆 心角α
程序如下(完全用整数实现): MidpointCircle(r,color) Int r, color; { int x,y,d; x = 0; y = r; d = 1-r; putpixcel(x,y,color); while( x < y) { if (d <0) { d += 2*x+3; x++; } else { d += 2*(x-y)+5; x++ ; y--; } putpixcel(x,y,color); } }
第二章 二维图形生成技术
第二节 二次曲线
一、圆弧
1、中点算法
2、内接正多边形迫近法 3、等面积正多边形逼近法 4、生成圆弧的正负法 二、椭圆弧扫描转换
1、中点算法
第三章 二次曲线
圆是图形系统中常用的元素。我们将圆心定义为 ( xc , yc ) 。 圆的方程为: (x-xc)2+(y-yc)2=r2 所以圆为:距离中心位置 ( xc , yc )为给定值r的点集。 利用这个方程,我们可以沿x轴,从
Pi-i
Bresenham画圆算法
当di<0时->取Hi -> yi=yi-1,则 di+1 = di + 4xi-1 + 6
当di ≥ 0时->取Li -> yi=yi-1-1, 则di+1 = di + 4(xi-1-yi-1) + 10
易知 x0=0,y0=R,x1=x0+1 因此 d0 =12 + y02 + 12 +(y0 - 1)2 - 2R2 = 3 - 2y0= 3 - 2R
中点画圆法
为了进一步提高算法的效率,可以将上面的 算法中的浮点数改写成整数,将乘法运算改 成加法运算,即仅用整数实现中点画圆法。 使用e=d-0.25代替d e0=1-R
所以:初始化运算d0 = 1.25 – R 对应于 e 0= 1- R 判别式 d < 0 对应于 e < -0.25 又因为:e的初值e0为整数,运算过程中的分量也为整数, 故e始终为整数 所以: e < -0.25 等价于 e < 0
xc r
xc r 到
,以单位步长计算对应的y值,从而得
到圆周上每点的位置。
圆的扫描转换算法
下面仅以圆心在原点、半径R为 整数的圆为例,讨论圆的生成算法。 假设圆的方程为: X + Y = R
2 2 2
扫描转换圆弧
处理对象:圆心在原点的圆弧 圆的八对称性
圆弧扫描算法
X + Y = R 2 2 Y = Sqrt(R - X ) 在一定范围内,每给定一个 X值,可得一个Y值。
设圆的方程为F(x,y)=X + Y - R =0; 假设求得Pi的坐标为(xi,yi); 则当Pi在圆内时-> F(xi,yi)<0 -> 向右-> 向圆外 Pi在圆外时-> F(xi,yi)>0 -> 向下-> 向圆内
2
2
2
生成圆弧的正负法
即求得Pi点后选择下一个象素点Pi+1的规则为: 当F(xi,yi) ≤0 取xi+1 = xi+1,yi+1 = yi; 当F(xi,yi) >0 取xi+1 = xi, yi+1 = yi - 1; 这样用于表示圆弧的点均在圆弧附近,且使 F(xi,yi) 时正时负,故称正负法(课本逐点比 较法)。 快速计算的关键是F(xi,yi) 的计算,能否采用增 量算法?
生成圆弧的正负法
若F(xi,yi) 已知,计算F(xi+1,yi+1) 可分两种
情况: 1、F(xi,yi)≤0-> xi+1 = xi+1,yi+1 = yi; 2 2 2 -> F(xi+1,yi+1)= (xi+1 ) +(yi+1 ) -R 2 2 2 -> = (xi+1) + yi -R = F(xi,yi) +2xi +1 2、 F(xi,yi)>0-> xi+1 = xi,yi+1 = yi -1; 2 2 2 -> F(xi+1,yi+1)= (xi+1 ) +(yi+1 ) -R 2 2 2 -> = xi +(yi –1) -R = F(xi,yi) - 2yi +1 3、初始值:略
Bresenham画圆算法
使用Bresenham算法扫描转换圆时需要的步骤: Plot(x+k,y+h); Plot(-x+k,-y+h); Plot(y+k,x+h); Plot(-y+k,-x+h); Plot(-y+k,x+h); Plot(y+k,-x+h);
–4、根据圆的对称性,由当前坐标(x,y)绘制八个点
Plot(-x+k,y+h); Plot(x+k,-y+h);
5、跳到步骤2
算法 三:正负划分性
圆弧的正负划分性
F ( x, y) x 2 y 2 R2 0
圆弧外的点:F(X,Y)>0 圆弧上的点:F(X,Y)=0 圆弧内的点:F(X,Y)<0
生成圆弧的正负法
原理:(只考虑第一象限)
P1 M P2
2 2 2
中点画圆法
有如下结论:
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
中点画圆法
MidpointCircle(int r, int color) { int x,y; float d; x=0; y=r; d=1.25-r; putpixel(x,y,color); while(x<y){ if(d<0){ d+ = 2*x+3; x++ } else{d+ = 2*(x-y) + 5; x++;y--; } putpixel(x,y,color); } }
xi =Rcos i ; yi =Rsin i
圆的内接正多边形逼近法
内接正n边形代替圆
计算多边形各顶点的递推公式
Xi+1
=
Rcos( Rsin
a+ i)
Yi +1 Xi+1
=
(a+ i) - sin a cosa Xi Yi
cos a sin a
Yi +1
因为: a是常数, sin a, cosa只在开始时计算一 次所以,一个顶点只需4次乘法,共4n次乘法, 外加直线段的中点算法的计算量。
二、椭圆的扫描转换
椭圆方程:
b2x2+a2y2-a2b2=0
椭圆的扫描转换
F(x,y)=b2x2+a2y2-a2b2=0 椭圆的对称性,只考虑第一象限椭圆弧生成,分 上下两部分,以切线斜率为-1的点作为分界点。 椭圆上一点处的法向: N(x,y) = (F)' x i + (F)' y j = 2b2 x i + 2a2 y j
2 2 2
y
当X取整数时,Y须取整。
缺点:浮点运算,开方, 取整,不均匀。
x
• 两种直接离散方法: 离散点:
利用隐函数方程 2 y 2 R 2 x ( xi , yi R 2 xi2 ) 取整 xi,yi ,r ) (
离散角度:
x R cos 利用参数方程 y R sin (round( R cos i ), round( R sin i ))
算法 一:中点画圆法
利用圆的对称性,只须讨论1/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)
在上半部分,法向量的y分量大 在下半部分,法向量的x分量大 法向量 两分量相等 M1 上半部分 下半部分 M2
生成圆弧的多边形逼近法
? 圆的内接正多边形迫近法 ? 圆的等面积正多边形迫近法
圆的内接正多边形逼近法
思想:当一个正多边形的边数足够多时,该多 边形可以和圆无限接近。即
lim ( 边正内接多边形) 圆 n
因此,在允许的误差范围内,可以用正多边形 代替圆。 设内接正n边形的顶点为Pi(xi,yi), Pi的幅角为i , 每一条边对应的圆心角为a,则有
中点画圆法
上述算法能否再改进呢?
注意到d的增量是x,y的线性函数, 每当x递增1,则d的增量递增Δx=2 每当y递减1,则d的增量递增Δy=2 Δx初始值=3;Δy初始值=-2r+2 思考题:怎样实现算法?
算法 二: Bresenham画圆算法
现在从A点开始向右下方逐点来寻找 弧AB要用的点。如图中点Pi-1是已 选中的一个表示圆弧上的点,根 据弧AB的走向,下一个点应该从 Hi或者Li中选择。显然应选离AB最 近的点作为显示弧AB的点。 假设圆的半径为R,显然,当 xhi2 + yhi2 -R2 ≥ R2 - (xli2 + yli2)时,应该取Li。否则取Hi。 令di = xhi2 + yhi2 + xli2 + yli2 - 2R2 显然,当di ≥0 时 应该取Li。否则取Hi。
• 开根,三角函数运算,计算量大,不可 取。
角度DDA法
x = x0 + Rcos y = y0 + Rsin dx =- Rsind dy = Rcosd xn+1 =x n + dx y n+1 =y n + dy xn+1 = x n + dx = x n - Rsind =x n - (y n - y 0 )d y n+1 = y n + dy = y n + Rcosd =y n + (x n - x 0 )d 显然,确定x,y的初值及d值后,即可以增量方 式获得圆周上的坐标,然后取整可得象素坐标。 但要采用浮点运算、乘法运算、取整运算。
Pi-1
Hi B
A
Li
应取Hi还是取Li
Bresenham画圆算法
剩下的问题是如何快速的计算di。设图中Pi-1的坐标为 (xi-1,yi-1),则Hi和Li的坐标为(xi,yi-1)和(xi,yi-1-1 ) di = xi2 + yi-12 + xi2 + (yi-1-1)2 - 2R2 =2xi2 + 2yi-12 - 2yi-1 - 2R2 di+1 = (xi + 1)2 + yi2 + (xi + 1)2 + (yi - 1)2 - 2R2 =2xi2 + 4xi + 2yi2 - 2yi - 2R2 + 3
Pi-1
Hi B Li
A
应取Hi还是取Li
Bresenham画圆算法
使用Bresenham算法扫描转换圆时需要的步骤:
–1、赋初值:y=半径;(h,k)=圆心坐标;
x=0;d=3-2r;
–2、测试整个圆是否扫描转换完毕。如果x>y,
则程序结束。
–3、计算下一个象素的位置。
如果d<0,则d=4x+6,x=x+1; 如果d>=0,则d=4(x-y)+10, x=x+1,y=y+1。