第2章 基本图形生成算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.1.1 直线的扫描转换算法
三个常用算法 – 数值微分(DDA)法 – 中点画线法 – Bresenham画线法
数值微分(DDA)法
DDA算法: 根据直线的微分方程来计算Δx或Δy生成 直线的扫描转换算法。
过程描述: 在水平坐标轴上以单位间隔对线段取样, 以 决定垂直坐标轴方向上最靠近理想线段的 整数值。
数值微分(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 ; x<=x1; x++) drawpixel (x, int(y+0.5), color) ;
k=(2-0)/(5-0)=0.4
x
y
int(y+0.5)
Line: P0(0, 0)-- P1(5, 2)
0
0
0
3
1
0.4
0
2
2
0.8
1
3
1.2
1
1
4
1.6
2
5
2.0
2
0 12 3 4 5
中点画线法
• 基本原理
只考虑斜率k(0<k<1)且保证起点坐标小于终点坐标
设当前像素点为P(Xp,Yp ), 则下一个与直线最接近的像 素只能是P1点或P2点。设M 为中点,Q为交点。 提出问题:如何确定下一个 象素点。
其中a=y0-y1, b=x1-x0, c=x0y1-x1y0
Fx, y 0 Fx, y 0 Fx, y 0
点在直线上面 点在直线上方 点在直线下方
欲判断M点与Q点关系,只需把 M(xp+1,yp+0.5)代入F(x,y),并检查它的符号。
中点画线法
构造判别式: d=F(M)=F(xp+1,yp+0.5) =a(xp+1)+b(yp+0.5)+c
优点:
– 只有整数运算,不含乘除法 – 可用硬件实现
中点画线法
void MidpointLine (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); } } /* 中点画线法程序 */
数值微分(DDA)法
基本原理:
已知直线段的起点、终点分别为:P0 (x0,y0), P1(x1,y1),且坐标值都为整数。 直线的微分方程为:
dy y y1 y0 k dx x x1 x0
设|k|≤1, 则有
yi+1=kxi+1+b=k(xi+Δx)+b=yi+kΔx 若Δx=1, 则当x每递增1时, y递增k 。
P2
Q
P=(xp,yp) P1
中点画线法
画线从直线起点P0(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来摆脱小数,提高效率。
算法特点: • 使用最广泛 • 与中点画线法的思想类似 • 由误差项符号决定下一个象素取正右方
像素还是右上方像素
Bresenham画线算法
基本原理: (k在0~1之间的情况,且保证起点坐标小于终点坐标 ) 给定直线的起点(x1, y1),终点(x2, y2)。 设当前已确定像素点Pk (xk, yk) ,沿扫描方向,x每次 增加一个单元格,即下一个像素点Pk+1 横坐标为xk+1, 而终坐标y或保持yk不变,或为yk+1 。
中点画线法
➢M在Q的下方-> P2离直线更近更近->取P2 ➢M在Q的上方-> P1离直线更近更近->取P1 ➢M与Q重合-> P1、P2任取一点->约定取P1
P2 Q
P=(xp,yp) P1
提出问题:如何判断M点与Q点的位置关系?
中点画线法
已知直线段的起点P0 (x0,y0), 终点P1(x1,y1)。 直Hale Waihona Puke Baidu方程为:F(x,y)=ax+by+c=0
当d<0,M在直线下方,取右上方P2 当d>0,M在直线上方,取正右方P1 当d=0,选P1或P2均可,约定取P1
提出问题:判别式d是否有增量。
中点画线法
(1) 若d0, 取正右方像素点P1(xp+1,yp) 此时再下一个象素的判别式为:
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
y=y+k ; // DDA算法描述
数值微分(DDA)法
算法特点: • DDA算法就是一个增量算法
增量算法:在一个迭代算法中,如果每 一步的x、y值是用前一步的值加上一个 增量来获得,则称为增量算法。 • 直观,易实现 • 不利于用硬件实现
数值微分(DDA)法
例:画直线段P0(0,0)--P1(5,2)
增量为a
P2
Q
P=(xp,yp) P1
中点画线法
(2) 若d<0, 取右上方像素点P2(xp+1,yp+1) 此时再下一个象素的判别式为:
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
中点画线法
例:用中点画线法P0(0, 0),P1(5, 2)
a=y0-y1= -2 b=x1-x0=5
d0=2a+b=1 d1=2a= -4 d2=2(a+b)=6
i xi yi d
10 0 1 3
2 1 0 -3 2
32 1 3
1
4 3 1 -1
54 2 5
0 12 3 4 5
65 2
Bresenham画线算法
第2章 基本图形生成算法
2.1 图形的扫描转换 – 直线的扫描转换 – 圆弧的扫描转换 – 椭圆弧的扫描转换
2.2 区域填充 2.3 图形裁剪
2.1.1 直线的扫描转换算法
基本原理 (1)确定最佳逼近于该直线的一组象素 (2)按扫描线顺序,对这些象素进行写操作
图5-1 用一系列的象素点来逼近直线