计算机图形学 - 第三章讲义
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Pk < 0, 则选择yk
Pk ≥ 0, 则选择yk+1
Bresenham算法公式推导
决wk.baidu.com参数Pk的递推公式
Pk = 2y*xk - 2x*yk + C
由 Pk+1 = 2y*xk+1 - 2x*yk+1 + C
∴ Pk+1 - Pk = 2y - 2x(yk+1 - yk);
Pk+2 y Pk+1=
x = y/m
3.2 画线算法
对于模拟显示设备,方程y、 x是决定偏 转电压变化的基础。
当|m|<1, △x 可以设置为正比于一水平偏转 电压, △y则可以根据公式计算。 当|m|>1, △y 可以设置为正比于一垂直偏转 电压, △x则可以根据公式计算。
直线绘制要求
直
端点准确
pk+2(xk+1-yk+1)+1 pk≥0
r取整
p0 = 5/4 – r = 1- r
中点画圆算法的步骤
1) 输入圆半径r和圆心(xc, yc), 获得(x0, y0) = (0, r) 2) 计算P0 = 1 - r; 3) 在每个xk位置,测试计算下一个点
Pk < 0, (xk+1, yk)
内-外测试
多边形表 前向面与后向面
3.4.1 多边形分类
(1) 有封闭折线边界且无交叉边的平面图形
凹多边形 凸多边形
(2) 识别凹多边形
若|m|≤1:xk+1=xk+1,yk+1=yk+m
若|m|≥1:yk+1=yk+1, xk+1=xk+1/m or :yk+1=yk-1, xk+1=xk-1/m
DDA算法 举例
已知直线的两个端点P1(20,10),P2(30,18),
用DDA算法使该线段光栅化。
解:dx = 10; dy = 8;
直线的绘制
光栅扫描系统
屏幕位置以整数值表示; 以线路径上的离散点来显示线段 显示的线段具有阶梯效果
直线的绘制
计算机绘制的直线是由一系列与该 直线最近的像素绘制而成
理论直线与计算机绘制的直线之间 总有一定的偏差 只能尽量减少偏差
偏差取决于屏幕光栅(分辨率)和光 点的运动方向
阶梯效果的直线
d1=y - yk=m*xk+1+b - yk =m*(xk+1)+b- yk d2= yk+1 - y=yk+1-m*(xk+1)-b
d1 - d2=2m(xk+1)-2yk+2b-1
代入m= y / x,
Bresenham 算法公式推导
d1-d2 = 2*y / x(xk+1)-2yk+2b-1
P0 = 2y-x = 6
Bresenham 算法举例
step k 0 1 2 3 4 5 6 7 8 9 Pk 6 2 -2 14 10 6 2 -2 14 10 (x k+1,yk+1) (21,11) (22,12) (23,12) (24,13) (25,14) (26,15) (27,16) (28,16) (29,17) (30,18)
Bresenham 算法举例
18 17
16
15 14
13 12 11 10 20 2122 23 2425 26 272829 30
Bresenham 算法公式修正
修正公式以适应任何方向线段的绘制
m>1,交换x和y方向的规则,y单位步长移动,
计算x
从任何端点开始绘制像素
水平线、垂直线和对角线
fcircle(x,y)
=0 >0
pk = f(xk+1, yk-0.5) = (xk+1)2+(yk-0.5)2-r2
如果
pk < 0,选择 (xk+1, yk)
pk ≥ 0,选择(xk+1, yk-1)
中点画圆算法公式推导
pk+1 = f(xk+1+1, yk+1-0.5) = (xk+1+1)2+(yk+1-0.5)2-r2 pk+1 = pk+2(xk+1)+(yk+12-yk2)-(yk+1-yk)+1 pk+2xk+1+1 pk+1 = pk<0
思想
算法公式推导
算法描述 举例
Bresenham 算法思想
思想:只用整数计算寻找最接近实际直线的整数坐标
13 12 11 10 10 11 12 13 14 15 16
y=mx+ b
从(10,10)像素开始,绘制0<m<1直线的屏幕网格
Bresenham 算法思想
y yk+1
y=mx+b
Pk >= 0, (xk+1, yk -1)
根据公式计算Pk+1;
4) 确定对称点; 5) 重复步骤3,直至x ≥ y
中点画圆算法举例 圆半径r=10
P0= 1-10=-9
P1= -9+2*1+1=-6 k 0 1 2 3 4 5 6 Pk -9 -6 -1 6 -3 8 5 (xk,yk) (0,10) (1,10) (2,10) (3,10) (4,9) (5,9) (6,8) (7,7)
P2= -6+2*2+1=-1
P3= -1+2*3+1=6 P4= 6+2*(4-9)+1=-3 P5= -3+2*5+1=8 P6= 8+2*(6-8)+1=5
中点画圆算法举例 圆半径r=10
y
10 9
8 7 6 5 4 3 2 1 0 Y=X
0 1 2 3 4 5
6 7 8 9
1 0
x
不同算法的比较
Pk+2 y Pk+1= Pk+2 y-2 x
(Pk < 0) (xk+1, yk ) (Pk ≥ 0) (xk+1, yk+1 )
5) 重复第4步,共x-1次
Bresenham算法 举例
已知直线的两个端点P1(20,10),P2(30,18),
用DDA算法使该线段光栅化。
解:dx = 10; dy = 8;
setpixel(Round(x), Round(y), RED);
}
}
DDA算法 评价
比直接使用公式
y=m*x+b快 ,没有
用乘法
运算仍然耗时
设置增量的除法运算 取整操作 浮点
较长线段的误差积累
2. Bresenham算法
由Bresenham提出的一种精确而有效的光 栅线段生成算法,可用于直线、圆(圆弧)和 其它曲线的生成
d2 d1
y
yk
xk
xk+1
x
Bresenham 算法公式推导
假定:0<m<1,
已知(xk, yk),求下一点(xk+1, yk+1) (xk+1, yk+1)的两种可能:
(xk+1, yk) 和 (xk+1, yk+1),其中xk+1 = xk+1
Bresenham 算法公式推导
推导:设两点与理想直线距离分别为d1、d2
(Pk < 0)
Pk+2 y-2 x
(Pk ≥ 0)
P0 = 2y-x
Bresenham算法的步骤
1) 输入直线端点坐标(x0,y0),(xn,yn)
2) 画起始点(x0,y0);
3) 计算常量x、y、2 y 和2y - 2x, 并计算决策参数P0 =2y - x 4) 从k=0开始,在沿线路径的每个xk处,计 算Pk+1,并确定下一点(xk+1,yk+1)
循环次数:steps = 10;
沿X轴单位取样:x_in= 1
Y按斜率变化: y_in = 0.8
DDA算法 举例
step k 0 1 2 3 4 5 6 7 8 9 (x,y) (20,10) (21,10.8) (22,11.6) (23,12.4) (24,13.2) (25,14) (26,14.8) (27,15.6) (28,16.4) (29,17.2) (30,18) 像素点 (20,10) (21,11) (22,12) (23,12) (24,13) (25,14) (26,15) (27,16) (28,16) (29,17) (30,18)
圆的标准方程包括乘法和平方根运算
圆的极坐标参数方程包含乘法和三角运算
Bresenham算法以决策参数的增量计算为 基础,仅包括简单的整数处理 中点方法更易应用于其他圆锥曲线,沿任何 圆锥曲线所确定的像素位置,其误差限制在 像素分段的1/2以内
3.4 多边形
多边形分类、识别与分割凹多边形
方程两边同乘以x
x(d1-d2) = 2 y* xk+2 y - 2 x*yk+ x(2b-1)
引入决策参数Pk表示相对距离,其值为
其中C = 2y + x*(2b-1)
Pk = x (d1-d2)=2y*xk - 2x*yk + C
Bresenham 算法公式推导
推论:
第三章 输出图元
第三章
输出图元
点绘制 画线算法 圆生成算法 多边形
图元的概念
最基本的图形元素/图形输出原语 类型
图形一级元素:点、线
图形二级元素:弧、圆、多边形、曲 线、字符 其他:...
3.1 点和直线
点 直线
点的绘制
光栅扫描系统:帧缓冲器对应位置设为1 其他元素的绘制都在以点为基础产生。
DDA算法 举例
18 17 16 15 14 13 12 11 10 20 21 22 23 24 25 26 27 28 29 30
DDA算法的C实现
#define Round(a) ((int)(a + 0.5))
void lineDDA(int xa, int ya, int xb, int yb)
3.2 画线算法
问题 画线算法
DDA算法 Bresenham算法
3.2 画线算法
问题
已知直线的两个端点P1(x1, y1),P2(x2, y2)
求直线的中间各点
3.2 画线算法
已知:P1(x1,y1),P2(x2,y2)
直线的笛卡尔斜率截距方程 y = m*x + b m = (y2-y1)/(x2-x1) b = y1-m*x1 y= m* x
{
int dx = xb - xa, dy = yb - ya, steps, k; float xIncrement, yIncrement, x=xa, y=ya; if (abs(dx) > abs(dy)) steps = abs(dx); else steps = abs(dy);
xIncrement = dx/(float) steps; yIncrement = dy/(float) steps; setpixel(Round(x), Round(y), RED); for(k=0;k<steps;k++) { x += xIncrement; y += yIncrement;
1
算法描述
程序实现 举例
中点
3.3.2 中点画圆算法
思想
中点在圆边界内, 选(x+1, y)
P2
y
M
P1
中点在圆边界外, y-1 选(x+1, y-1)
中点
中点画圆算法公式推导
定义圆函数 fcircle (x, y)=x2+y2-r2 <0 (x, y)位于圆边界内 (x, y)位于圆边界上 (x, y)位于圆边界外
3.3 圆生成算法
圆的属性 中点画圆算法
3.3.1 圆的特性
圆的方程
(x-xc)2+(y-yc)2=r2 x=xc + r cosθ
y=yc + r sinθ
圆的对称性
y
(-y,x) (-x,y) (-x,-y)
(y,x) (x,y) (x,-y) x
(-y,-x) (y, -x)
直接基于圆的方程绘圆
圆的标准方程 (x-xc)2+(y-yc)2=r2 y= yc sqrt(r2-(x-xc)2)
圆的极坐标参数方程 x=xc+r cosθ y=yc+r sinθ
圆的对称性
y
(0,r)
x
3.3.2 中点画圆算法
思想 判断公式
Yi Yi-1 Yi-2
X Xi+
i
亮度均匀
速度
属性
求直线中间的各个像素点
y y2 y1 x1 x2 x
1. DDA算法
数字微分分析仪
思想:在一个坐标轴上以单位间隔对线
段取样,则另一个坐标轴以常数m或 1/m变化,从而获得线段上各像素点
直线中间的各个像素点-沿x轴取样
y
|m| <1
y2 y1 x1 x2 x
DDA算法公式
直线斜率满足|m|<1时,取x方向为 单位步长
递推公式为:
xk+1=xk1 yk+1=ykm
求直线中间各个像素点-沿y轴取样
y
|m|>1 y2
y1 x1 x2 x
DDA算法公式
直线斜率满足|m|>1时,取y 方向为单位步长
递推公式为:
yk+1=yk1 xk+1=xk1/m
DDA算法
画直线的DDA算法可表示为: ;xa<xb ;xa>xb ;ya<yb ; ya>yb or : xk+1=xk-1,yk+1=yk-m
Pk ≥ 0, 则选择yk+1
Bresenham算法公式推导
决wk.baidu.com参数Pk的递推公式
Pk = 2y*xk - 2x*yk + C
由 Pk+1 = 2y*xk+1 - 2x*yk+1 + C
∴ Pk+1 - Pk = 2y - 2x(yk+1 - yk);
Pk+2 y Pk+1=
x = y/m
3.2 画线算法
对于模拟显示设备,方程y、 x是决定偏 转电压变化的基础。
当|m|<1, △x 可以设置为正比于一水平偏转 电压, △y则可以根据公式计算。 当|m|>1, △y 可以设置为正比于一垂直偏转 电压, △x则可以根据公式计算。
直线绘制要求
直
端点准确
pk+2(xk+1-yk+1)+1 pk≥0
r取整
p0 = 5/4 – r = 1- r
中点画圆算法的步骤
1) 输入圆半径r和圆心(xc, yc), 获得(x0, y0) = (0, r) 2) 计算P0 = 1 - r; 3) 在每个xk位置,测试计算下一个点
Pk < 0, (xk+1, yk)
内-外测试
多边形表 前向面与后向面
3.4.1 多边形分类
(1) 有封闭折线边界且无交叉边的平面图形
凹多边形 凸多边形
(2) 识别凹多边形
若|m|≤1:xk+1=xk+1,yk+1=yk+m
若|m|≥1:yk+1=yk+1, xk+1=xk+1/m or :yk+1=yk-1, xk+1=xk-1/m
DDA算法 举例
已知直线的两个端点P1(20,10),P2(30,18),
用DDA算法使该线段光栅化。
解:dx = 10; dy = 8;
直线的绘制
光栅扫描系统
屏幕位置以整数值表示; 以线路径上的离散点来显示线段 显示的线段具有阶梯效果
直线的绘制
计算机绘制的直线是由一系列与该 直线最近的像素绘制而成
理论直线与计算机绘制的直线之间 总有一定的偏差 只能尽量减少偏差
偏差取决于屏幕光栅(分辨率)和光 点的运动方向
阶梯效果的直线
d1=y - yk=m*xk+1+b - yk =m*(xk+1)+b- yk d2= yk+1 - y=yk+1-m*(xk+1)-b
d1 - d2=2m(xk+1)-2yk+2b-1
代入m= y / x,
Bresenham 算法公式推导
d1-d2 = 2*y / x(xk+1)-2yk+2b-1
P0 = 2y-x = 6
Bresenham 算法举例
step k 0 1 2 3 4 5 6 7 8 9 Pk 6 2 -2 14 10 6 2 -2 14 10 (x k+1,yk+1) (21,11) (22,12) (23,12) (24,13) (25,14) (26,15) (27,16) (28,16) (29,17) (30,18)
Bresenham 算法举例
18 17
16
15 14
13 12 11 10 20 2122 23 2425 26 272829 30
Bresenham 算法公式修正
修正公式以适应任何方向线段的绘制
m>1,交换x和y方向的规则,y单位步长移动,
计算x
从任何端点开始绘制像素
水平线、垂直线和对角线
fcircle(x,y)
=0 >0
pk = f(xk+1, yk-0.5) = (xk+1)2+(yk-0.5)2-r2
如果
pk < 0,选择 (xk+1, yk)
pk ≥ 0,选择(xk+1, yk-1)
中点画圆算法公式推导
pk+1 = f(xk+1+1, yk+1-0.5) = (xk+1+1)2+(yk+1-0.5)2-r2 pk+1 = pk+2(xk+1)+(yk+12-yk2)-(yk+1-yk)+1 pk+2xk+1+1 pk+1 = pk<0
思想
算法公式推导
算法描述 举例
Bresenham 算法思想
思想:只用整数计算寻找最接近实际直线的整数坐标
13 12 11 10 10 11 12 13 14 15 16
y=mx+ b
从(10,10)像素开始,绘制0<m<1直线的屏幕网格
Bresenham 算法思想
y yk+1
y=mx+b
Pk >= 0, (xk+1, yk -1)
根据公式计算Pk+1;
4) 确定对称点; 5) 重复步骤3,直至x ≥ y
中点画圆算法举例 圆半径r=10
P0= 1-10=-9
P1= -9+2*1+1=-6 k 0 1 2 3 4 5 6 Pk -9 -6 -1 6 -3 8 5 (xk,yk) (0,10) (1,10) (2,10) (3,10) (4,9) (5,9) (6,8) (7,7)
P2= -6+2*2+1=-1
P3= -1+2*3+1=6 P4= 6+2*(4-9)+1=-3 P5= -3+2*5+1=8 P6= 8+2*(6-8)+1=5
中点画圆算法举例 圆半径r=10
y
10 9
8 7 6 5 4 3 2 1 0 Y=X
0 1 2 3 4 5
6 7 8 9
1 0
x
不同算法的比较
Pk+2 y Pk+1= Pk+2 y-2 x
(Pk < 0) (xk+1, yk ) (Pk ≥ 0) (xk+1, yk+1 )
5) 重复第4步,共x-1次
Bresenham算法 举例
已知直线的两个端点P1(20,10),P2(30,18),
用DDA算法使该线段光栅化。
解:dx = 10; dy = 8;
setpixel(Round(x), Round(y), RED);
}
}
DDA算法 评价
比直接使用公式
y=m*x+b快 ,没有
用乘法
运算仍然耗时
设置增量的除法运算 取整操作 浮点
较长线段的误差积累
2. Bresenham算法
由Bresenham提出的一种精确而有效的光 栅线段生成算法,可用于直线、圆(圆弧)和 其它曲线的生成
d2 d1
y
yk
xk
xk+1
x
Bresenham 算法公式推导
假定:0<m<1,
已知(xk, yk),求下一点(xk+1, yk+1) (xk+1, yk+1)的两种可能:
(xk+1, yk) 和 (xk+1, yk+1),其中xk+1 = xk+1
Bresenham 算法公式推导
推导:设两点与理想直线距离分别为d1、d2
(Pk < 0)
Pk+2 y-2 x
(Pk ≥ 0)
P0 = 2y-x
Bresenham算法的步骤
1) 输入直线端点坐标(x0,y0),(xn,yn)
2) 画起始点(x0,y0);
3) 计算常量x、y、2 y 和2y - 2x, 并计算决策参数P0 =2y - x 4) 从k=0开始,在沿线路径的每个xk处,计 算Pk+1,并确定下一点(xk+1,yk+1)
循环次数:steps = 10;
沿X轴单位取样:x_in= 1
Y按斜率变化: y_in = 0.8
DDA算法 举例
step k 0 1 2 3 4 5 6 7 8 9 (x,y) (20,10) (21,10.8) (22,11.6) (23,12.4) (24,13.2) (25,14) (26,14.8) (27,15.6) (28,16.4) (29,17.2) (30,18) 像素点 (20,10) (21,11) (22,12) (23,12) (24,13) (25,14) (26,15) (27,16) (28,16) (29,17) (30,18)
圆的标准方程包括乘法和平方根运算
圆的极坐标参数方程包含乘法和三角运算
Bresenham算法以决策参数的增量计算为 基础,仅包括简单的整数处理 中点方法更易应用于其他圆锥曲线,沿任何 圆锥曲线所确定的像素位置,其误差限制在 像素分段的1/2以内
3.4 多边形
多边形分类、识别与分割凹多边形
方程两边同乘以x
x(d1-d2) = 2 y* xk+2 y - 2 x*yk+ x(2b-1)
引入决策参数Pk表示相对距离,其值为
其中C = 2y + x*(2b-1)
Pk = x (d1-d2)=2y*xk - 2x*yk + C
Bresenham 算法公式推导
推论:
第三章 输出图元
第三章
输出图元
点绘制 画线算法 圆生成算法 多边形
图元的概念
最基本的图形元素/图形输出原语 类型
图形一级元素:点、线
图形二级元素:弧、圆、多边形、曲 线、字符 其他:...
3.1 点和直线
点 直线
点的绘制
光栅扫描系统:帧缓冲器对应位置设为1 其他元素的绘制都在以点为基础产生。
DDA算法 举例
18 17 16 15 14 13 12 11 10 20 21 22 23 24 25 26 27 28 29 30
DDA算法的C实现
#define Round(a) ((int)(a + 0.5))
void lineDDA(int xa, int ya, int xb, int yb)
3.2 画线算法
问题 画线算法
DDA算法 Bresenham算法
3.2 画线算法
问题
已知直线的两个端点P1(x1, y1),P2(x2, y2)
求直线的中间各点
3.2 画线算法
已知:P1(x1,y1),P2(x2,y2)
直线的笛卡尔斜率截距方程 y = m*x + b m = (y2-y1)/(x2-x1) b = y1-m*x1 y= m* x
{
int dx = xb - xa, dy = yb - ya, steps, k; float xIncrement, yIncrement, x=xa, y=ya; if (abs(dx) > abs(dy)) steps = abs(dx); else steps = abs(dy);
xIncrement = dx/(float) steps; yIncrement = dy/(float) steps; setpixel(Round(x), Round(y), RED); for(k=0;k<steps;k++) { x += xIncrement; y += yIncrement;
1
算法描述
程序实现 举例
中点
3.3.2 中点画圆算法
思想
中点在圆边界内, 选(x+1, y)
P2
y
M
P1
中点在圆边界外, y-1 选(x+1, y-1)
中点
中点画圆算法公式推导
定义圆函数 fcircle (x, y)=x2+y2-r2 <0 (x, y)位于圆边界内 (x, y)位于圆边界上 (x, y)位于圆边界外
3.3 圆生成算法
圆的属性 中点画圆算法
3.3.1 圆的特性
圆的方程
(x-xc)2+(y-yc)2=r2 x=xc + r cosθ
y=yc + r sinθ
圆的对称性
y
(-y,x) (-x,y) (-x,-y)
(y,x) (x,y) (x,-y) x
(-y,-x) (y, -x)
直接基于圆的方程绘圆
圆的标准方程 (x-xc)2+(y-yc)2=r2 y= yc sqrt(r2-(x-xc)2)
圆的极坐标参数方程 x=xc+r cosθ y=yc+r sinθ
圆的对称性
y
(0,r)
x
3.3.2 中点画圆算法
思想 判断公式
Yi Yi-1 Yi-2
X Xi+
i
亮度均匀
速度
属性
求直线中间的各个像素点
y y2 y1 x1 x2 x
1. DDA算法
数字微分分析仪
思想:在一个坐标轴上以单位间隔对线
段取样,则另一个坐标轴以常数m或 1/m变化,从而获得线段上各像素点
直线中间的各个像素点-沿x轴取样
y
|m| <1
y2 y1 x1 x2 x
DDA算法公式
直线斜率满足|m|<1时,取x方向为 单位步长
递推公式为:
xk+1=xk1 yk+1=ykm
求直线中间各个像素点-沿y轴取样
y
|m|>1 y2
y1 x1 x2 x
DDA算法公式
直线斜率满足|m|>1时,取y 方向为单位步长
递推公式为:
yk+1=yk1 xk+1=xk1/m
DDA算法
画直线的DDA算法可表示为: ;xa<xb ;xa>xb ;ya<yb ; ya>yb or : xk+1=xk-1,yk+1=yk-m