图形学—光栅化算法

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

{
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
1.整体介绍 2.建模(图形描述) 3.绘制(光栅化算法) 4.光照模型
内容提要
直线光栅化算法 圆光栅化算法 多边形的填充
9.1 直线光栅化算法
假设 整型坐标系,直线段斜率0<m<1 对m>1,x、y互换
基本原理 确定最佳逼近于该直线的一组象素 按扫描线顺序,对这些象素进行写操作
9.1 直线光栅化算法
已知线段端点:P0(x0,y0), P1(x1,y1)
直线方程
y=k(x-x0)+y0 浮点数取整 : yi=round(yi)=(int)(yi+0.5)
用到浮点数的乘法、加法和取整运算
9.1.1 DDA算法
数值微分分析(Digital Differential Analyzer,DDA)是一种增量算法。其实质是用数 值方法解微分方程,通过同时对x和y各增加一个 小增量,计算下一步的x、y值。
P2 Q
M
P=(xp,yp) P1
9.1.2 中点画线法
d=F(M)=F(xp+1, yp+0.5)=a(xp+1)+b(yp+0.5)+c
P2
M (Xp+1,Yp+0.5)
Байду номын сангаас
P
P1
9.1.2 中点画线法
若d≥0,中点M在直线上方,取正右方象素P1
P2
(Xp+1,Yp)
下一个象素的判别式为:
M
d1=F((Xp+1)+1,Yp+0.5)=a(Xp+2)+b(Yp+0.5)+c
=d+a
增量为a
P1
若d<0,中点M在直线下方,取右上方象素P2
(Xp+1,Yp+1)
再下一个象素的判别式为:
P2
d2=F((Xp+1)+1,(Yp+1)+0.5)
=a(Xp+2)+b(Yp+1.5)+c
M
=d + a+b
xy d 00 1 1 0 -3 21 3 3 1 -1 42 5 52 1
9.1.3 Bresenham算法
使用最广泛 与中点画线法的思想类似 由误差项符号决定下一个象素取正右方像
素还是右上方像素
9.1.3 Bresenham算法
else {x++; d+=d1;} drawpixel (x, y, color); } /* while */ } /* mid PointLine */
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
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; }
Fx, y0 Fx, y0 Fx, y0
点在直线上面 点在直线上方 点在直线下方
P2
Q M
P=(xp,yp) P1
9.1.2 中点画线法
构造判别式: d=F(M)=F(Xp+1,Yp+0.5) 由d>0,d<0可判定下一个象素
当d<0时,M在L(Q点)下方,取P2为下一个象素; 当d>0时,M在L(Q点)上方,取P1为下一个象素; 当d=0时,选P1或P2均可,约定取P1为下一个象素;
一个象素点。
P2
Q M
P=(xp,yp) P1
9.1.2 中点画线法
问题:判断距离理想直线最近的下一个象素点
已知:线段两端点(x0,y0),(x1,y1)
直线方程:F(x,y)=ax+by+c=0
a=y0-y1 b=x1-x0
如何判断M点在Q点上方还是在Q点下方?
c=x0y1-x1y0
因光栅单位为1, 可以采用每次x方向增加1, y方向增加k的办法得到下一个直线点。
x1

yk
9.1.1 DDA算法
void Line (
//设0≤k≤1,xs<xe
int xs,ys; //左端点 int xe,ye; //右端点
int value) //赋给线上的像素属性值
y+=k;
// y移动步长是斜率k
}
} //
9.1.1 DDA算法
例:用DDA方法扫描转换连接两点P0(0,0)和P1(5,2) 的直线段。
x round(y)
0
0
1
0
2
1
3
1
4
2
5
2
y(yi+k)
0 0.4 0.8 1.2 1.6 2.0
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为下
增量为a+b
P1
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
9.1.2 中点画线法
9.1.1 DDA算法
已知一条直线段L(P1, P2),其端点坐标分别为:P1 (x1, y1), P2(x2, y2)。直线段所在的直线的斜率为:
直线方程为
y y
K 2 1
y
x2 x1 x
y kxb

y k(x
i1
i
x)bkxibk
x
yk x i
9.1.1 DDA算法
相关文档
最新文档