- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
面——多边形区域填充 字符 图形反走样
圆弧的扫描转换
圆的八对称性
只考虑第二个八分圆
y
假设圆心在原点 x2+y2=R2 (y,x) (-y,-x)
(-x,y)
(x,y)
R o
(y,x) x
(y,-x) (x,-y)
(-x,-y)
圆弧扫描算法
2 2 2
X
+
Y
2
=
R
2
Y = Sqrt(R - X )
假设
像素间均匀网格,整型坐标系,直线段斜率0<m<1 对m>1,x、y互换
直线的扫描转换
直线的绘制要求:
1.直线要直 2.直线的端点要准确,即无定向性和断裂情况 3.直线的亮度、色泽要均匀 4.画线的速度要快 5.要求直线具有不同的色泽、亮度、线型等
直线段的扫描转换算法
直线的扫描转换
Bresenham画线算法(1/7)
使用最广泛 与中点画线法的思想类似 由误差项符号决定下一个象素取正右方像素
还是右上方像素
Bresenham画线算法(2/7)
基本思想
过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交 点,然后根据误差项的符号确定该列象素中与此交点最近的象素。
(x,y) y y=-x y=x
选择像素的原则
使其与实际圆弧的距离平方达到最小
y
Pu P M Pd
M的坐标为:M(xi +1,yi-0.5)
当F(xM,yM)<0时,取Pu(xi +1,yi)
当F(xM,yM)=0时,约定取Pu。
当F(xM,yM)>0时,取Pd(xi +1,yi-1)
构造判别式:
中点画线法(1/4)
问题:判断距离理想直线最近的下一个象素点 已知:线段两端点(x0,y0),(x1,y1) 直线方程:F(x,y)=ax+by+c=0
a=y0-y1 b=x1-x0 如何判断M点在Q点上方还是在Q点下方?
c=x0y1-x1y0
P2
M
Q
P=(xp,yp) P1
中点画线法(2/4)
y方向走一步
当e<0时,最接近P1(xi+1,yi)
y方向不走步
有除法,不宜硬件实现
Bresenham画线算法(5/7)
设
e=e×2x,不影响判断的准确性
e0=2y
- x
P
P2
e’
e
当e≥0时,最接近P2(xi+1,yi+1)
y方向走一步
P1
当e<0时,最接近P1(xi+1,yi)
x
图5-11 中点Bresenham画圆的原理
d F ( xM , yM ) F ( xi 1, yi 0.5) ( xi 1)2 ( yi 0.5)2 R2
当d≤0时,下一点取Pu(xi +1,yi); 当d>0时,下一点取Pd(xi +1,yi-1)。
误差项的递推
误差计算
初值:d0=
P
P1
y/ x
P2
当d≥0.5时,最接近P2(xi+1,yi+1)
y方向走一步
当d<0.5时,最接近P1(xi+1,yi)
d P
P1
d’
y方向不走步
Bresenham画线算法(4/7)
为方便与0比较,设e=d-0.5,则
e0=y/ x-0.5
当e≥0时,最接近P2(xi+1,yi+1)
直线上方点: F(x,y)>0 0
直线下M)=F(Xp+1,Yp+0.5) 由d>0,d<0可判定下一个象素
P2 M (Xp+1,Yp+0.5)
P
P1
分两种情形考虑再一下个象素的判定:
d = F(M)=F(Xp+1,Yp+0.5) = a(Xp+1)+b(Yp+0.5)+c
x=x0, y=y0;
for (i=0; idx; i++) { drawpixel (x, y, color); // x=x+1 , e = e+k; x=x+1,e = e+2*dy; if (e0)
基本图形生成算法
点、线、面、字符
线——图元扫描转换
直线段扫描转换 圆(椭圆)弧扫描转换 曲线(第六章)
P2 M P1
d2 = d+a+b
中点画线法(4/4)
d的初始值
d0=F(X0+1,Y0+0.5) =F(X0,Y0)+a+0.5 =a+0.5b 用2d代替d后,d0=2a+b d的增量都是整数
因(X0,Y0)在直线上, 所以F(X0,Y0)=0
优点:
只有整数运算,不含乘除法 可用硬件实现
例:用中点画线法P0(0,0) P1(5,2)
y方向不走步
P2
e P
P1
e’
Bresenham画线算法(6/7)
下一步误差的计算 当e≥0时,y方向走一步
e’=2y/ x - 1 =e + y/ x - 1 e’=e + 2y - 2x
P2
e’
e
当e<0时,y方向不走步
e’=2y/ x=e + y/ x e’=e + 2y
d F ( xM , yM ) F ( xi 1, yi 0.5) ( xi 1)2 ( yi 0.5)2 R2
yi
P
yi-1
d≤0:
d F ( xi 2, yi 0.5) ( xi 2) 2 ( yi 0.5) 2 R 2 ( xi 1) 2 ( yi 0.5) 2 R 2 2 xi 3 d 2 xi 3
图5-1
用一系列的象素点来逼近直线
基本图形生成算法
点、线、面、字符
线——图元扫描转换
直线段扫描转换 圆(椭圆)弧扫描转换 曲线(第六章)
面——多边形区域填充 字符 图形反走样
光栅图形中点的表示
…
地址线性表 1D表示
(x,y)坐 标
显示屏幕 2D表示
像素由其左下角坐标表示
直线段扫描转换
yi=round(yi)=(int)(yi+0.5)
池州学院
数值微分(DDA)法
增量算法
yi+1 = kxi+1+b = k(xi+1)+b = yi+k
(xi,yi)→(xi+1,yi+k)
缺点:
有浮点数取整运算
不利于硬件实现 效率低
仅适用于k ≤1的情形:x每增加1,y最多增加1。当 k 1时,必须把x,y互换。
P
P1
P2
e P
P1
e’
Bresenham画线算法(7/7)
优点
整数运算,速度快 精度高
乘2运算可用移位实现,适于硬件实现
void Bresenhamline (int x0,int y0,int x1, int y1,int color) { int x, y, dx, dy; float // int e; dx = x1-x0, dy = y1- y0; k=dy/dx, e=-0.5; = 2*dy – dx; // e k, e;
M(xM,yM) α β o
9
计算机图形学
① Fi+1 = Fi – yA Fi+1 = Fi +xA
Fi >=0 Fi <0
数值微分(DDA)法
已知线段端点:P0(x0,y0),
P1(x1,y1)
直线方程
y=kx+b {(xi, yi)},
浮点数取整
i=0,….n.
:
用到浮点数的乘法、加法和取整运算
为方便计算,令e=d-0.5, e的初值为-0.5,增量为k。
当e≥0时,取当前象素(xi,yi)的右上方象素(xi+1,yi+1); 当e<0时,更接近于右方象素(xi+1,yi)。
Bresenham画线算法(3/7)
最大位移方向每次走一步
k<1时,x为最大位移方向
y方向走步与否
P2
d’
d
取决于误差d值的大小
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;
例 : 画 直 线 段 P0(0,0)-P1(5,2)
x 0 1 2 0 0 1 int(y+0.5) 0 0.4+0.5 0.8+0.5
1 0 1
Line: P0(0, 0)-- P1(5, 2)
y+0.5 3
2
3
4 5
1
2 2
1.2+0.5
1.6+0.5 2.0+0.5
2
3
4
5
注:网格点表示象素
{