图形学—光栅化算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
已知直线段起点(0, 0),终点(8,6),利用 Bresenham算法和中点画线算法生成此直线段, 写出生成过程中坐标点及误差e的变化情况,并在 下面的方格中,标出直线上各点
2013-7-30
Computer Graphics
9.2 圆的光栅化算法
圆的八对称性 圆心位于原点的圆有四条
y (-x,y) (-y,x) (-y,-x) (-x,-y) o (y,-x) (x,-y) R (x,y) (y,x) x
一个象素点。
P2 Q
M
P=(xp,yp) P1
2013-7-30
Computer Graphics
9.1.2 中点画线法
问题:判断距离理想直线最近的下一个象素点 已知:线段两端点(x0,y0),(x1,y1) 直线方程:F(x,y)=ax+by+c=0 a=y0-y1 如何判断M点在Q点上方还是在Q点下方? b=x1-x0 c=x0y1-x1y0
y方向增加k的办法得到下一个直线点。
x 1 y k
2013-7-30
Computer Graphics
9.1.1 DDA算法
void Line ( int xs,ys; int xe,ye; int value)
{ //设0≤k≤1,xs<xe //左端点 //右端点 //赋给线上的像素属性值
drawpixel(y,x,color); drawpixel(-x,y,color);
drawpixel(y,-x,color);
drawpixel(x,-y,color); drawpixel(-y,x,color); drawpixel(-x,-y,color); drawpixel(-y,-x,color); }
1.整体介绍 2.建模(图形描述) 3.绘制(光栅化算法) 4.光照模型
2013-7-30
Computer Graphics
内容提要
直线光栅化算法 圆光栅化算法
多边形的填充
2013-7-30
Computer Graphics
9.1 直线光栅化算法
假设 整型坐标系,直线段斜率0<m<1 对m>1,x、y互换 基本原理 确定最佳逼近于该直线的一组象素 按扫描线顺序,对这些象素进行写操作
e
当e<0时,最接近P1(xi+1,yi), y 方向不走步
P
P1
e0=y/ x-0.5
P2
e P
2013-7-30
e’
P1 Computer Graphics
9.1.3 Bresenham算法
设e=e×2x,不影响判断的准确性 当e≥0时,最接近P2(xi+1,yi+1), y方向走一步
9.1.2 中点画线法
d的初始值 d0=F(X0+1,Y0+0.5) =F(X0,Y0)+a+0.5b =a+0.5b d的增量都是整数 用2d代替d:d0=2a+b=a+a+b d1=2a d2=2(a+b)
因(X0,Y0)在直线 上,所以 F(X0,Y0)=0
2013-7-30
Computer Graphics
当d<0时,M在L(Q点)下方,取P2为下一个象素; 当d>0时,M在L(Q点)上方,取P1为下一个象素;
当d=0时,选P1或P2均可,约定取P1为下一个象素;
P2 Q
M
P=(xp,yp) P1
2013-7-30
Computer Graphics
9.1.2 中点画线法
d=F(M)=F(xp+1, yp+0.5)=a(xp+1)+b(yp+0.5)+c
2013-7-30
Computer Graphics
9.1.3 Bresenham算法
使用最广泛 与中点画线法的思想类似 由误差项符号决定下一个象素取正右方像 素还是右上方像素
2013-7-30
Computer Graphics
9.1.3 Bresenham算法
基本思想
比较从理想直线到位于直线上方的像素的距离d2和相邻 的位于直线下方的像素的距离d1 根据距离误差项的符号确定与理想直线最近的象素
2013-7-30
Computer Graphics
9.2.2 中点画圆法
9.1.1 DDA算法
数值微分分析(Digital Differential Analyzer,DDA)是一种增量算法。其实质是用数 值方法解微分方程,通过同时对x和y各增加一个 小增量,计算下一步的x、y值。
2013-7-30
Computer Graphics
9.1.1 DDA算法
已知一条直线段L(P1, P2),其端点坐标分别为:P1 (x1, y1), P2(x2, y2)。直线段所在的直线的斜率为:
= d + a
增量为a
若d<0,中点M在直线下方,取右上方象素P2 (Xp+1,Yp+1)
再下一个象素的判别式为: d2=F((Xp+1)+1,(Yp+1)+0.5) =a(Xp+2)+b(Yp+1.5)+c =d + a+b 增量为a+b
P2
M P1
2013-7-30
Computer Graphics
对称轴x=0,y=0,x=y和x=-y。
若已知圆弧上一点(x,y),可以 得到其关于四条对称轴的其它 7个点,这种性质称为圆的八 对称性。
2013-7-30
Computer Graphics
9.2.1 简单画圆法
y
假设圆心在原点 x2+y2=R2
(-y,x)
(-x,y) R o
(x,y)
(y,x) x (y,-x)
当e<0.5时,最接近 P1(xi+1,yi),y方向不走步
P2
初值:e0= y/ x
P
2013-7-30
e
P1
e’
Computer Graphics
9.1.3 Bresenham算法
为方便与0比较,设e=e-0.5 当e≥0时,最接近P2(xi+1,yi+1), y方向走一步
P2
e’
y yk+1 y yk
0
P2
}d
2
P1 xk xk+1
}
d1 x
2013-7-30
Computer Graphics
9.1.3 Bresenham算法
x方向递增一个单位 y方向走步与否取决于d1-d2的值
取决于误差e值的大小 当e≥0.5时,最接近
P2
e’ e
误差判断
P
P1
P2(xi+1,yi+1), y方向走一步
圆的八对称性
只考虑第二个八分圆 For(x=0;x<=R/
2
(-y,-x)
(-x,-y)
)
(x,-y)
wk.baidu.com
2013-7-30
Computer Graphics
9.2.1 简单画圆法
void CirclePoints(int x,int y,int color)
{ drawpixel(x,y,color);
2013-7-30
Computer Graphics
9.1 直线光栅化算法
已知线段端点:P0(x0,y0), P1(x1,y1) 直线方程
y=k(x-x0)+y0 浮点数取整 : yi=round(yi)=(int)(yi+0.5)
用到浮点数的乘法、加法和取整运算
2013-7-30
Computer Graphics
int x; //x以步长为单位从xs增长到xe double dx =xe-xs; double dy =ye-ys; double k =dy/dx; // 直线之斜率k double y =ys; for (x=xs; x<=xe; x++) { WritePixel(x,Round(y),value); //像素属性值value
} /* while */
} /* mid PointLine */
2013-7-30
Computer Graphics
9.1.2 中点画线法
举例:用中点画线方法扫描转换连接两点P0(0,0)和P1 (5,2)的直线段。 a=y0-y1=-2; b=x1-x0=5; d0=2*a+b=1; d1=2*a=-4;d2=2*(a+b)=6 x 0 1 2 3 4 5 y 0 0 1 1 2 2 d 1 -3 3 -1 5 1
x y e
0 0
1 0 2 1
-1
3 -3
3 1
4 2 5 2
1
-5 -1
2013-7-30
Computer Graphics
9.1.3 Bresenham算法
优点 整数运算,速度快 精度高 乘2运算可用移位实现,适于硬件实现
2013-7-30
Computer Graphics
9.1.3 Bresenham算法
2013-7-30
Computer Graphics
9.1.2 中点画线法—基本原理
假定直线斜率k在0-1之间,当前象素点为(xp,yp), 则下一个象素点有两种可选择点P1(xp+1,yp)或P2 (xp+1,yp+1)。若P1与P2的中点(xp+1,yp+0.5)称为M,
Q为理想直线与x=xp+1垂线的交点。当M在Q的下方时,则 取P2应为下一个象素点;当M在Q的上方时,则取P1为下
9.1.2 中点画线法
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);
P2
e’ e
当e<0时,最接近P1(xi+1,yi), y 方向不走步
P
P1
e0=2y - x
P2
e P
2013-7-30
e’
P1 Computer Graphics
9.1.3 Bresenham算法
下一步误差的计算
当e≥0时,y方向走一步
P2
e’=2y/ x - 1
e’=e + 2y - 2x
P2
M (Xp+1,Yp+0.5)
P P1
2013-7-30
Computer Graphics
9.1.2 中点画线法
若d≥0,中点M在直线上方,取正右方象素P1
P2 M
P1
(Xp+1,Yp)
下一个象素的判别式为: d1=F((Xp+1)+1,Yp+0.5)=a(Xp+2)+b(Yp+0.5)+c
K
直线方程为 则
y y x x
2 2
1
1
y x
y kx b
y
i 1
k ( x x) b k x i b k x
i
y k x
i
2013-7-30
Computer Graphics
9.1.1 DDA算法
因光栅单位为1, 可以采用每次x方向增加1,
e’ e
P
P1
当e<0时,y方向不走步 e’=2y/ x e’=e + 2y e P
2013-7-30
P2
e’
P1
Computer Graphics
9.1.3 Bresenham算法
2013-7-30
Computer Graphics
9.1.3 Bresenham算法
例:用Bresenham方法扫描转换连接两点P0(0,0)和P1 (5,2)的直线段。
2013-7-30
Computer Graphics
9.2.1 简单画圆法
两种直接离散生成方法
离散点 y y c r 2 ( x c x) 2 开方运算 离散角度 xi xc r cos i 三角函数运算 yi yc r sin i 缺点: 计算量大 所画像素位置间的间距不一致
点在直线上面 点在直线上方 点在直线下方
Q
M
F x, y 0 F x, y 0 F x, y 0
P2
P=(xp,yp) P1
2013-7-30
Computer Graphics
9.1.2 中点画线法
构造判别式: d=F(M)=F(Xp+1,Yp+0.5) 由d>0,d<0可判定下一个象素
y+=k;
}
// y移动步长是斜率k
} //
2013-7-30
Computer Graphics
9.1.1 DDA算法
例:用DDA方法扫描转换连接两点P0(0,0)和P1(5,2) 的直线段。
x
round(y) 0 0 1 1 2 2
0 1 2 3 4 5
y(yi+k)
0 0.4 0.8 1.2 1.6 2.0
2013-7-30
Computer Graphics
9.2 圆的光栅化算法
圆的八对称性 圆心位于原点的圆有四条
y (-x,y) (-y,x) (-y,-x) (-x,-y) o (y,-x) (x,-y) R (x,y) (y,x) x
一个象素点。
P2 Q
M
P=(xp,yp) P1
2013-7-30
Computer Graphics
9.1.2 中点画线法
问题:判断距离理想直线最近的下一个象素点 已知:线段两端点(x0,y0),(x1,y1) 直线方程:F(x,y)=ax+by+c=0 a=y0-y1 如何判断M点在Q点上方还是在Q点下方? b=x1-x0 c=x0y1-x1y0
y方向增加k的办法得到下一个直线点。
x 1 y k
2013-7-30
Computer Graphics
9.1.1 DDA算法
void Line ( int xs,ys; int xe,ye; int value)
{ //设0≤k≤1,xs<xe //左端点 //右端点 //赋给线上的像素属性值
drawpixel(y,x,color); drawpixel(-x,y,color);
drawpixel(y,-x,color);
drawpixel(x,-y,color); drawpixel(-y,x,color); drawpixel(-x,-y,color); drawpixel(-y,-x,color); }
1.整体介绍 2.建模(图形描述) 3.绘制(光栅化算法) 4.光照模型
2013-7-30
Computer Graphics
内容提要
直线光栅化算法 圆光栅化算法
多边形的填充
2013-7-30
Computer Graphics
9.1 直线光栅化算法
假设 整型坐标系,直线段斜率0<m<1 对m>1,x、y互换 基本原理 确定最佳逼近于该直线的一组象素 按扫描线顺序,对这些象素进行写操作
e
当e<0时,最接近P1(xi+1,yi), y 方向不走步
P
P1
e0=y/ x-0.5
P2
e P
2013-7-30
e’
P1 Computer Graphics
9.1.3 Bresenham算法
设e=e×2x,不影响判断的准确性 当e≥0时,最接近P2(xi+1,yi+1), y方向走一步
9.1.2 中点画线法
d的初始值 d0=F(X0+1,Y0+0.5) =F(X0,Y0)+a+0.5b =a+0.5b d的增量都是整数 用2d代替d:d0=2a+b=a+a+b d1=2a d2=2(a+b)
因(X0,Y0)在直线 上,所以 F(X0,Y0)=0
2013-7-30
Computer Graphics
当d<0时,M在L(Q点)下方,取P2为下一个象素; 当d>0时,M在L(Q点)上方,取P1为下一个象素;
当d=0时,选P1或P2均可,约定取P1为下一个象素;
P2 Q
M
P=(xp,yp) P1
2013-7-30
Computer Graphics
9.1.2 中点画线法
d=F(M)=F(xp+1, yp+0.5)=a(xp+1)+b(yp+0.5)+c
2013-7-30
Computer Graphics
9.1.3 Bresenham算法
使用最广泛 与中点画线法的思想类似 由误差项符号决定下一个象素取正右方像 素还是右上方像素
2013-7-30
Computer Graphics
9.1.3 Bresenham算法
基本思想
比较从理想直线到位于直线上方的像素的距离d2和相邻 的位于直线下方的像素的距离d1 根据距离误差项的符号确定与理想直线最近的象素
2013-7-30
Computer Graphics
9.2.2 中点画圆法
9.1.1 DDA算法
数值微分分析(Digital Differential Analyzer,DDA)是一种增量算法。其实质是用数 值方法解微分方程,通过同时对x和y各增加一个 小增量,计算下一步的x、y值。
2013-7-30
Computer Graphics
9.1.1 DDA算法
已知一条直线段L(P1, P2),其端点坐标分别为:P1 (x1, y1), P2(x2, y2)。直线段所在的直线的斜率为:
= d + a
增量为a
若d<0,中点M在直线下方,取右上方象素P2 (Xp+1,Yp+1)
再下一个象素的判别式为: d2=F((Xp+1)+1,(Yp+1)+0.5) =a(Xp+2)+b(Yp+1.5)+c =d + a+b 增量为a+b
P2
M P1
2013-7-30
Computer Graphics
对称轴x=0,y=0,x=y和x=-y。
若已知圆弧上一点(x,y),可以 得到其关于四条对称轴的其它 7个点,这种性质称为圆的八 对称性。
2013-7-30
Computer Graphics
9.2.1 简单画圆法
y
假设圆心在原点 x2+y2=R2
(-y,x)
(-x,y) R o
(x,y)
(y,x) x (y,-x)
当e<0.5时,最接近 P1(xi+1,yi),y方向不走步
P2
初值:e0= y/ x
P
2013-7-30
e
P1
e’
Computer Graphics
9.1.3 Bresenham算法
为方便与0比较,设e=e-0.5 当e≥0时,最接近P2(xi+1,yi+1), y方向走一步
P2
e’
y yk+1 y yk
0
P2
}d
2
P1 xk xk+1
}
d1 x
2013-7-30
Computer Graphics
9.1.3 Bresenham算法
x方向递增一个单位 y方向走步与否取决于d1-d2的值
取决于误差e值的大小 当e≥0.5时,最接近
P2
e’ e
误差判断
P
P1
P2(xi+1,yi+1), y方向走一步
圆的八对称性
只考虑第二个八分圆 For(x=0;x<=R/
2
(-y,-x)
(-x,-y)
)
(x,-y)
wk.baidu.com
2013-7-30
Computer Graphics
9.2.1 简单画圆法
void CirclePoints(int x,int y,int color)
{ drawpixel(x,y,color);
2013-7-30
Computer Graphics
9.1 直线光栅化算法
已知线段端点:P0(x0,y0), P1(x1,y1) 直线方程
y=k(x-x0)+y0 浮点数取整 : yi=round(yi)=(int)(yi+0.5)
用到浮点数的乘法、加法和取整运算
2013-7-30
Computer Graphics
int x; //x以步长为单位从xs增长到xe double dx =xe-xs; double dy =ye-ys; double k =dy/dx; // 直线之斜率k double y =ys; for (x=xs; x<=xe; x++) { WritePixel(x,Round(y),value); //像素属性值value
} /* while */
} /* mid PointLine */
2013-7-30
Computer Graphics
9.1.2 中点画线法
举例:用中点画线方法扫描转换连接两点P0(0,0)和P1 (5,2)的直线段。 a=y0-y1=-2; b=x1-x0=5; d0=2*a+b=1; d1=2*a=-4;d2=2*(a+b)=6 x 0 1 2 3 4 5 y 0 0 1 1 2 2 d 1 -3 3 -1 5 1
x y e
0 0
1 0 2 1
-1
3 -3
3 1
4 2 5 2
1
-5 -1
2013-7-30
Computer Graphics
9.1.3 Bresenham算法
优点 整数运算,速度快 精度高 乘2运算可用移位实现,适于硬件实现
2013-7-30
Computer Graphics
9.1.3 Bresenham算法
2013-7-30
Computer Graphics
9.1.2 中点画线法—基本原理
假定直线斜率k在0-1之间,当前象素点为(xp,yp), 则下一个象素点有两种可选择点P1(xp+1,yp)或P2 (xp+1,yp+1)。若P1与P2的中点(xp+1,yp+0.5)称为M,
Q为理想直线与x=xp+1垂线的交点。当M在Q的下方时,则 取P2应为下一个象素点;当M在Q的上方时,则取P1为下
9.1.2 中点画线法
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);
P2
e’ e
当e<0时,最接近P1(xi+1,yi), y 方向不走步
P
P1
e0=2y - x
P2
e P
2013-7-30
e’
P1 Computer Graphics
9.1.3 Bresenham算法
下一步误差的计算
当e≥0时,y方向走一步
P2
e’=2y/ x - 1
e’=e + 2y - 2x
P2
M (Xp+1,Yp+0.5)
P P1
2013-7-30
Computer Graphics
9.1.2 中点画线法
若d≥0,中点M在直线上方,取正右方象素P1
P2 M
P1
(Xp+1,Yp)
下一个象素的判别式为: d1=F((Xp+1)+1,Yp+0.5)=a(Xp+2)+b(Yp+0.5)+c
K
直线方程为 则
y y x x
2 2
1
1
y x
y kx b
y
i 1
k ( x x) b k x i b k x
i
y k x
i
2013-7-30
Computer Graphics
9.1.1 DDA算法
因光栅单位为1, 可以采用每次x方向增加1,
e’ e
P
P1
当e<0时,y方向不走步 e’=2y/ x e’=e + 2y e P
2013-7-30
P2
e’
P1
Computer Graphics
9.1.3 Bresenham算法
2013-7-30
Computer Graphics
9.1.3 Bresenham算法
例:用Bresenham方法扫描转换连接两点P0(0,0)和P1 (5,2)的直线段。
2013-7-30
Computer Graphics
9.2.1 简单画圆法
两种直接离散生成方法
离散点 y y c r 2 ( x c x) 2 开方运算 离散角度 xi xc r cos i 三角函数运算 yi yc r sin i 缺点: 计算量大 所画像素位置间的间距不一致
点在直线上面 点在直线上方 点在直线下方
Q
M
F x, y 0 F x, y 0 F x, y 0
P2
P=(xp,yp) P1
2013-7-30
Computer Graphics
9.1.2 中点画线法
构造判别式: d=F(M)=F(Xp+1,Yp+0.5) 由d>0,d<0可判定下一个象素
y+=k;
}
// y移动步长是斜率k
} //
2013-7-30
Computer Graphics
9.1.1 DDA算法
例:用DDA方法扫描转换连接两点P0(0,0)和P1(5,2) 的直线段。
x
round(y) 0 0 1 1 2 2
0 1 2 3 4 5
y(yi+k)
0 0.4 0.8 1.2 1.6 2.0