计算机图形学-直线、圆、椭圆的生成
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2014-9-5 浙江大学计算机图形学 7
数值微分(DDA)法
增量算法:在一个迭代算法中,如果每 一步的x、y值是用前一步的值加上一个 增量来获得,则称为增量算法。 DDA算法就是一个增量算法。
2014-9-5
浙江大学计算机图形学
8
数值微分(DDA)法
void DDALine(int x0,int y0,int x1,int y1,int color) int x; float dx, dy, y, k; dx, = x1-x0, dy=y1-y0; k=dy/dx, y=y0; for (x=x0; xx1, x++) drawpixel (x, int(y+0.5), color); y=y+k;
2014-9-5
浙江大学计算机图形学
18
中点画线法
void Midpoint Line (int x0,int y0,int x1, int y1,int color) { int a, b, d1, d2, d, x, y; a=y0-y1, b=x1-x0, d=2*a+b; d1=2*a, d2=2* (a+b); x=x0, y=y0; drawpixel(x, y, color); while (x<x1) { if (d<0) {x++; y++; d+=d2; } else {x++; d+=d1;} drawpixel (x, y, color); } /* while */ } /* mid PointLine */
k
x1 x0
令x x0 x1; x x stepx y kx b x, round( y)
这种方法直观,但效率太低,因为每一步需要一次浮点乘法 和一次舍入运算。
2014-9-5 浙江大学计算机图形学 6
数值微分(DDA)法
计算yi+1= kxi+1+b = kxi+b+kx = yi+kx 当x =1; yi+1 = yi+k 即:当x每递增1,y递增k(即直线斜率); 注意上述分析的算法仅适用于k ≤1的情形。 在这种情况下,x每增加1,y最多增加1。 当 k 1时,必须把x,y地位互换
2014-9-5
浙江大学计算机图形学
9
数值微分(DDA)法
例:画直线段P0(0,0)--P1(5,2)
int(y+0.5) 0 0 1 1 2 2 y+0.5 0+0.5 0.4+0.5 0.8+0.5 1.2+0.5 1.6+0.5 2.0+0.5
Line: P0(0, 0)-- P1(5, 2) 3 2 1 0 1 2 3 4 5
2 2 2
y
当X取整数时,Y须取整。 缺点:浮点运算,开方, 取整,不均匀。
2014-9-5 浙江大学计算机图形学
x
27
角度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值后,即可以增量方式 获得圆周上的坐标,然后取整可得象素坐标。但 要采用浮点运算、乘法运算、取整运算。
2014-9-5 浙江大学计算机图形学 25
Bresenham画线算法
圆的扫描转换算法
下面仅以圆心在原点、半径R为整数的圆为 例,讨论圆的生成算法。 假设圆的方程为: 2 2 2 X + Y = R
2014-9-5
浙江大学计算机图形学
26
圆弧扫描算法
X + Y = R 2 2 Y = Sqrt(R - X ) 在一定范围内,每给定一 X值,可得一Y值。
2014-9-5 浙江大学计算机图形学 22
设图中xi列上已用(xi,yir)作为表示直线的点, 又设B点是直线上的点,其坐标为(xi+1,yi+1),显然 下一个表示直线的点( xi+1,yi+1,r)只能从图中的C 或者D点中去选。设A为CD边的中点。 若B在A点上面 则应取D点作为( xi+1,yi+1,r),否则应取C点。
∴欲判断中点M点是在Q点上方还是在Q点下 方,只需把M代入F(x,y),并检查它的符号。
2014-9-5 浙江大学计算机图形学 14
中点画线法
构造判别式: d=F(M)=F(xp+1,yp+0.5) =a(xp+1)+b(yp+0.5)+c 当d<0,M在直线(Q点)下 P=(xp,yp) 方,取右上方P2; 当d>0,M在直线(Q点)上 方,取右方P1; 当d=0,选P1或P2均可, 约定取P1; 能否采用增量算法呢?
2014-9-5
浙江大学计算机图形学
1
图形显示前需要:扫描转换+裁剪 ●裁剪---〉扫描转换:最常用,节约计算时间。 ●扫描转换---〉裁剪:算法简单;
2014-9-5
浙江大学计算机图形学
2
本章内容
扫描转换直线段
DDA算法 中点画线法 Bresenham画线算法
圆弧、椭圆弧扫描转换
中点算法 内接正多边形迫近法 等面积正多边形逼近法 生成圆弧的正负法
。 。
(X i , Yi)
。
栅格交点表示象素点位置
(X i+1 ,Yi + k) (X i , Int(Yi +0.5))
。
2014-9-5
浙江大学计算机图形学
5
数值微分(DDA)法
基本思想
已知过端点P0 (x0, y0), P1(x1, y1)的直线段L y=kx+b 直线斜率为 y1 y0
2014-9-5
中点画线法
假设直线方程为:ax+by+c=0 其中a=y0-y1, b=x1-x0, c=x0y1-x1y0 由常识知:
F x, y 0 F x, y 0 F x, y 0 点在直线上面 点在直线上方 点在直线下方
P2
Q
P=(xp,yp) P1
P=(xp,yp ) P1 浙江大学计算机图形学
16
中点画线法
若d<0->M在直线下方->取P2; 此时再下一个象素的判别式为 d2= F(xp+2, yp+1.5) =a(xp+2)+b(yp+1.5)+c = a(xp +1)+b(yp +0.5)+c +a +b =d+a+b ; 增量为a+b
2014-9-5
浙江大学计算机图形学
3
直线段的扫描转换算法
直线的扫描转换: 确定最佳逼近于该直线 的一组象素,并且按扫描线顺序,对这 些象素进行写操作。 三个常用算法:
数值微分法(DDA) 中点画线法 Bresenham算法。
2014-9-5
浙江大学计算机图形学
4
数值微分法(DDA)
假定直线的起点、终点分别为:(x0,y0), (x1,y1),且都为整数。
2014-9-5
浙江大学计算机图形学
24
程序如下: BresenhamLine(x0,y0,x1,y1,color) int x0,y0,x1,y1,color; { int x,y,dx,dy; float k,e; int e; dx = x1-x0; dy = y1-y0; k = dy/dx; e = -0.5; x=x0; y=y0; e = -dx; for( i=0; i<=dx; i++){ drawpixel(x,y,color); x++; e=e+k; e1=e-0.5; e=e+2*dy; e1= e-dx; if(e1 > 0) e = e - 1; e = e - 2*dx; if(e >=0) y++; } }
2014-9-5 浙江大学计算机图形学
P2
Q P1
15
中点画线法
若d0 ->M在直线上方->取P1; 此时再下一个象素的判别式为 d1=F(xp+2, yp+0.5) =a(xp+2)+b(yp+0.5)+c = a(xp +1)+b(yp +0.5)+c +a =d+a; 增量为a
P2
Q
2014-9-5
2014-9-5 浙江大学计算机图形学 19
中点画线法
例:用中点画线法P0(0,0) P1(5,2)
xi 0 1 2 3 yi 0 0 1 1 2 d 1 -3 3 -1 5
a=y0-y1=-2 b=x1-x0=5 d0=2a+b=1 d1=2a=-4 d2=2(a+b)=6
i 1 2 3 4
3 2 1 0 1 2 3 4 5
p p
现需确定下一个点亮的象素。
2014-9-5
浙江大学计算机图形学
12
中点画线法
当M在Q的下方-> P2离直线更近更近->取P2 。 M在Q的上方-> P1离直线更近更近->取P1 M与Q重合, P1、P2任取一点。
P2 Q
P=(xp,yp) P1
问题:如何判断M与Q点的关系?
浙江大学计算机图形学 13
P2
Q
2014-9-5 浙江大学计算机图形学
P=(xp,yp) P1
17
中点画线法
画线从(x0, y0)开始,d的初值 d0=F(x0+1, y0+0.5)= a(x0 +1)+b(y0 +0.5)+c = F(x0, y0)+a+0.5b = a+0.5b
由于只用d 的符号作判断,为了只包含整数运算, 可以用2d代替d来摆脱小数,提高效率。
x 0 1 2 3 4 5
2014-9-5
浙江大学计算机图形学
10
数值微分(DDA)法
缺点: 在此算法中,y、k必须是float,且每 一步都必须对y进行舍入取整,不利于硬件实 现。
2014-9-5
浙江大学计算机图形学
11
中点画线法
原理:
P2
Q
P=(xp,yp) P1
假定直线斜率0<K<1,且已 确定点亮象素点P(X ,Y ), 则下一个与直线最接近的像 素只能是P1点或P2点。设M 为中点,Q为交点
2014-9-5 浙江大学计算机图形学 28
圆的扫描转换
圆的扫描转换是在屏幕像素点阵中确定最佳逼近于 理想圆的像素点集的过程。圆的绘制可以使用简单方程 画圆算法或极坐标画圆算法,但这些算法涉及开方运算 或三角运算,效率很低。主要讲解仅包含加减运算的顺 时针绘制 1/8 圆的中点 Bresenham 算法原理,根据对称 性可以绘制整圆 。
第二章 直线、圆、椭圆生成算法
图形的扫描转换(光栅化):确定一个像素集合,用 于显示一个图形的过程。步骤如下: 1、确定有关像素 2、用图形的颜色或其它属性,对像素进行写操作。 对一维图形,不考虑线宽,则用一个像素宽的直线来 显示图形。二维图形的光栅化,即区域的填充:确定 像素集,填色或图案。 任何图形的光栅化,必须显示在一个窗口内,否则不 予显示。即确定一个图形的哪些部分在窗口内,哪些 在窗口外,即裁剪。
5 4
2014ቤተ መጻሕፍቲ ባይዱ9-5
浙江大学计算机图形学
20
Bresenham算法最初是为数字绘图仪提出,但同样 适用于CRT光栅显示器。
Jack Elton Bresenham
2014-9-5 浙江大学计算机图形学 21
Bresenham画线算法
在直线生成的算法中Bresenham算法是最有 效的算法之一。令 k=Δy/Δx,就 0≤k≤1的情况来说明Bresenham算法。 由DDA算法可知: yi+1=yi+k (1) 由于k不一定是整数,由此式求出的yi也 不一定是整数,因此要用坐标为(xi,yir) 的象素来表示直线上的点,其中yir表示 最靠近yi的整数。
为能确定B在A点上面或下面,令
Yi+1,r A Yi,r D B
Bresenham画线算法
ε(xi+1)=yi+1-yir-0.5
(2)
C
xi Xi+1 ε(x)的几何意义
若B在A的下面,则有ε(xi+1)<0,反之, 则ε(xi+1)>0。由图可知
yi+1,r=yir+1,若ε(xi+1)≥0
yi+1,r=yir, 若ε(xi+1)≤0
(3)
2014-9-5
浙江大学计算机图形学
23
Bresenham画线算法
由式(2)和式(3)可得到 ε(xi+2)=yi+2 - yi+1,r - 0.5 =yi+1 + k - yi+1,r - 0.5 ( 4) yi+1 - yir -0.5 + k - 1,当ε(xi+1)≥0 yi+1 - yir -0.5 + k, 当ε(xi+1)≤0 ε(xi+2)= ε(xi+1) + k -1 ,当ε(xi+1)≥0 ε(xi+2)= ε(xi+1) + k , 当ε(xi+1)≤0 由式(1)和式(2)可得到 ε(x2)= k - 0.5 (5)
数值微分(DDA)法
增量算法:在一个迭代算法中,如果每 一步的x、y值是用前一步的值加上一个 增量来获得,则称为增量算法。 DDA算法就是一个增量算法。
2014-9-5
浙江大学计算机图形学
8
数值微分(DDA)法
void DDALine(int x0,int y0,int x1,int y1,int color) int x; float dx, dy, y, k; dx, = x1-x0, dy=y1-y0; k=dy/dx, y=y0; for (x=x0; xx1, x++) drawpixel (x, int(y+0.5), color); y=y+k;
2014-9-5
浙江大学计算机图形学
18
中点画线法
void Midpoint Line (int x0,int y0,int x1, int y1,int color) { int a, b, d1, d2, d, x, y; a=y0-y1, b=x1-x0, d=2*a+b; d1=2*a, d2=2* (a+b); x=x0, y=y0; drawpixel(x, y, color); while (x<x1) { if (d<0) {x++; y++; d+=d2; } else {x++; d+=d1;} drawpixel (x, y, color); } /* while */ } /* mid PointLine */
k
x1 x0
令x x0 x1; x x stepx y kx b x, round( y)
这种方法直观,但效率太低,因为每一步需要一次浮点乘法 和一次舍入运算。
2014-9-5 浙江大学计算机图形学 6
数值微分(DDA)法
计算yi+1= kxi+1+b = kxi+b+kx = yi+kx 当x =1; yi+1 = yi+k 即:当x每递增1,y递增k(即直线斜率); 注意上述分析的算法仅适用于k ≤1的情形。 在这种情况下,x每增加1,y最多增加1。 当 k 1时,必须把x,y地位互换
2014-9-5
浙江大学计算机图形学
9
数值微分(DDA)法
例:画直线段P0(0,0)--P1(5,2)
int(y+0.5) 0 0 1 1 2 2 y+0.5 0+0.5 0.4+0.5 0.8+0.5 1.2+0.5 1.6+0.5 2.0+0.5
Line: P0(0, 0)-- P1(5, 2) 3 2 1 0 1 2 3 4 5
2 2 2
y
当X取整数时,Y须取整。 缺点:浮点运算,开方, 取整,不均匀。
2014-9-5 浙江大学计算机图形学
x
27
角度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值后,即可以增量方式 获得圆周上的坐标,然后取整可得象素坐标。但 要采用浮点运算、乘法运算、取整运算。
2014-9-5 浙江大学计算机图形学 25
Bresenham画线算法
圆的扫描转换算法
下面仅以圆心在原点、半径R为整数的圆为 例,讨论圆的生成算法。 假设圆的方程为: 2 2 2 X + Y = R
2014-9-5
浙江大学计算机图形学
26
圆弧扫描算法
X + Y = R 2 2 Y = Sqrt(R - X ) 在一定范围内,每给定一 X值,可得一Y值。
2014-9-5 浙江大学计算机图形学 22
设图中xi列上已用(xi,yir)作为表示直线的点, 又设B点是直线上的点,其坐标为(xi+1,yi+1),显然 下一个表示直线的点( xi+1,yi+1,r)只能从图中的C 或者D点中去选。设A为CD边的中点。 若B在A点上面 则应取D点作为( xi+1,yi+1,r),否则应取C点。
∴欲判断中点M点是在Q点上方还是在Q点下 方,只需把M代入F(x,y),并检查它的符号。
2014-9-5 浙江大学计算机图形学 14
中点画线法
构造判别式: d=F(M)=F(xp+1,yp+0.5) =a(xp+1)+b(yp+0.5)+c 当d<0,M在直线(Q点)下 P=(xp,yp) 方,取右上方P2; 当d>0,M在直线(Q点)上 方,取右方P1; 当d=0,选P1或P2均可, 约定取P1; 能否采用增量算法呢?
2014-9-5
浙江大学计算机图形学
1
图形显示前需要:扫描转换+裁剪 ●裁剪---〉扫描转换:最常用,节约计算时间。 ●扫描转换---〉裁剪:算法简单;
2014-9-5
浙江大学计算机图形学
2
本章内容
扫描转换直线段
DDA算法 中点画线法 Bresenham画线算法
圆弧、椭圆弧扫描转换
中点算法 内接正多边形迫近法 等面积正多边形逼近法 生成圆弧的正负法
。 。
(X i , Yi)
。
栅格交点表示象素点位置
(X i+1 ,Yi + k) (X i , Int(Yi +0.5))
。
2014-9-5
浙江大学计算机图形学
5
数值微分(DDA)法
基本思想
已知过端点P0 (x0, y0), P1(x1, y1)的直线段L y=kx+b 直线斜率为 y1 y0
2014-9-5
中点画线法
假设直线方程为:ax+by+c=0 其中a=y0-y1, b=x1-x0, c=x0y1-x1y0 由常识知:
F x, y 0 F x, y 0 F x, y 0 点在直线上面 点在直线上方 点在直线下方
P2
Q
P=(xp,yp) P1
P=(xp,yp ) P1 浙江大学计算机图形学
16
中点画线法
若d<0->M在直线下方->取P2; 此时再下一个象素的判别式为 d2= F(xp+2, yp+1.5) =a(xp+2)+b(yp+1.5)+c = a(xp +1)+b(yp +0.5)+c +a +b =d+a+b ; 增量为a+b
2014-9-5
浙江大学计算机图形学
3
直线段的扫描转换算法
直线的扫描转换: 确定最佳逼近于该直线 的一组象素,并且按扫描线顺序,对这 些象素进行写操作。 三个常用算法:
数值微分法(DDA) 中点画线法 Bresenham算法。
2014-9-5
浙江大学计算机图形学
4
数值微分法(DDA)
假定直线的起点、终点分别为:(x0,y0), (x1,y1),且都为整数。
2014-9-5
浙江大学计算机图形学
24
程序如下: BresenhamLine(x0,y0,x1,y1,color) int x0,y0,x1,y1,color; { int x,y,dx,dy; float k,e; int e; dx = x1-x0; dy = y1-y0; k = dy/dx; e = -0.5; x=x0; y=y0; e = -dx; for( i=0; i<=dx; i++){ drawpixel(x,y,color); x++; e=e+k; e1=e-0.5; e=e+2*dy; e1= e-dx; if(e1 > 0) e = e - 1; e = e - 2*dx; if(e >=0) y++; } }
2014-9-5 浙江大学计算机图形学
P2
Q P1
15
中点画线法
若d0 ->M在直线上方->取P1; 此时再下一个象素的判别式为 d1=F(xp+2, yp+0.5) =a(xp+2)+b(yp+0.5)+c = a(xp +1)+b(yp +0.5)+c +a =d+a; 增量为a
P2
Q
2014-9-5
2014-9-5 浙江大学计算机图形学 19
中点画线法
例:用中点画线法P0(0,0) P1(5,2)
xi 0 1 2 3 yi 0 0 1 1 2 d 1 -3 3 -1 5
a=y0-y1=-2 b=x1-x0=5 d0=2a+b=1 d1=2a=-4 d2=2(a+b)=6
i 1 2 3 4
3 2 1 0 1 2 3 4 5
p p
现需确定下一个点亮的象素。
2014-9-5
浙江大学计算机图形学
12
中点画线法
当M在Q的下方-> P2离直线更近更近->取P2 。 M在Q的上方-> P1离直线更近更近->取P1 M与Q重合, P1、P2任取一点。
P2 Q
P=(xp,yp) P1
问题:如何判断M与Q点的关系?
浙江大学计算机图形学 13
P2
Q
2014-9-5 浙江大学计算机图形学
P=(xp,yp) P1
17
中点画线法
画线从(x0, y0)开始,d的初值 d0=F(x0+1, y0+0.5)= a(x0 +1)+b(y0 +0.5)+c = F(x0, y0)+a+0.5b = a+0.5b
由于只用d 的符号作判断,为了只包含整数运算, 可以用2d代替d来摆脱小数,提高效率。
x 0 1 2 3 4 5
2014-9-5
浙江大学计算机图形学
10
数值微分(DDA)法
缺点: 在此算法中,y、k必须是float,且每 一步都必须对y进行舍入取整,不利于硬件实 现。
2014-9-5
浙江大学计算机图形学
11
中点画线法
原理:
P2
Q
P=(xp,yp) P1
假定直线斜率0<K<1,且已 确定点亮象素点P(X ,Y ), 则下一个与直线最接近的像 素只能是P1点或P2点。设M 为中点,Q为交点
2014-9-5 浙江大学计算机图形学 28
圆的扫描转换
圆的扫描转换是在屏幕像素点阵中确定最佳逼近于 理想圆的像素点集的过程。圆的绘制可以使用简单方程 画圆算法或极坐标画圆算法,但这些算法涉及开方运算 或三角运算,效率很低。主要讲解仅包含加减运算的顺 时针绘制 1/8 圆的中点 Bresenham 算法原理,根据对称 性可以绘制整圆 。
第二章 直线、圆、椭圆生成算法
图形的扫描转换(光栅化):确定一个像素集合,用 于显示一个图形的过程。步骤如下: 1、确定有关像素 2、用图形的颜色或其它属性,对像素进行写操作。 对一维图形,不考虑线宽,则用一个像素宽的直线来 显示图形。二维图形的光栅化,即区域的填充:确定 像素集,填色或图案。 任何图形的光栅化,必须显示在一个窗口内,否则不 予显示。即确定一个图形的哪些部分在窗口内,哪些 在窗口外,即裁剪。
5 4
2014ቤተ መጻሕፍቲ ባይዱ9-5
浙江大学计算机图形学
20
Bresenham算法最初是为数字绘图仪提出,但同样 适用于CRT光栅显示器。
Jack Elton Bresenham
2014-9-5 浙江大学计算机图形学 21
Bresenham画线算法
在直线生成的算法中Bresenham算法是最有 效的算法之一。令 k=Δy/Δx,就 0≤k≤1的情况来说明Bresenham算法。 由DDA算法可知: yi+1=yi+k (1) 由于k不一定是整数,由此式求出的yi也 不一定是整数,因此要用坐标为(xi,yir) 的象素来表示直线上的点,其中yir表示 最靠近yi的整数。
为能确定B在A点上面或下面,令
Yi+1,r A Yi,r D B
Bresenham画线算法
ε(xi+1)=yi+1-yir-0.5
(2)
C
xi Xi+1 ε(x)的几何意义
若B在A的下面,则有ε(xi+1)<0,反之, 则ε(xi+1)>0。由图可知
yi+1,r=yir+1,若ε(xi+1)≥0
yi+1,r=yir, 若ε(xi+1)≤0
(3)
2014-9-5
浙江大学计算机图形学
23
Bresenham画线算法
由式(2)和式(3)可得到 ε(xi+2)=yi+2 - yi+1,r - 0.5 =yi+1 + k - yi+1,r - 0.5 ( 4) yi+1 - yir -0.5 + k - 1,当ε(xi+1)≥0 yi+1 - yir -0.5 + k, 当ε(xi+1)≤0 ε(xi+2)= ε(xi+1) + k -1 ,当ε(xi+1)≥0 ε(xi+2)= ε(xi+1) + k , 当ε(xi+1)≤0 由式(1)和式(2)可得到 ε(x2)= k - 0.5 (5)