计算机图形学第二讲 光栅图形学
第二章 光栅图形学2--多边形的扫描转换与区域填充
山东科技大学信息学院
区域的连贯性
根据这些性质,实际上只需知道该长方形 区域内任一梯形内一点关于多边形P的内 外关系后,即可确定区域内所有梯形关 于P的内外关系。
山东科技大学信息学院
扫描线的连贯性
设e为一整数,yi0≥e≥yin。若扫描线y=e与多边形P的 Pi-1Pi相交,则记其交点的横坐标为xei。 现设xei1,xei2,xei3,…,xeil 是该扫描线与P的边界各交点 横坐标的递增序列,称此序列为交点序列。由区域的连贯 性可知,此交点序列具有以下性质:
山东科技大学信息学院
三、多边形的扫描转换
山东科技大学信息学院
1 逐点判断法
• 逐个判断绘图窗口内的像素: • 如何判断点在多边形的内外关系?
1)射线法: 2)累计角度法 3)编码法;
山东科技大学信息学院
逐点判断法
1)射线法
• 步骤: 1. 从待判别点v发出射线 2. 求交点个数k 3. K的奇偶性决定了点与多边形的内外关系
山东科技大学信息学院
3 扫描线种子填充算法
• 扫描线种子填充算法
–目标:减少递归层次 –适用于边界表示的4连通区域 算法思想:在任意不间断区间中只取一个种子 像素(不间断区间指在一条扫描线上一组相 邻元素),填充当前扫描线上的该段区间; 然后确定与这一区段相邻的上下两条扫描线 上位于区域内的区段,并依次把它们保存起 来,反复进行这个过程,直到所保存的个区 段都填充完毕。
逐点判断法程序简单, 速度太慢,效率低。
P1
v P2
山东科技大学信息学院
逐点判断法
• 逐点判断的算法虽然程序简单,但不可取。原 因是速度太慢,主要是由于该算法割断了各象 素之间的联系,孤立地考察各象素与多边形的 内外关系,使得几十万甚至几百万个象素都要 一一判别,每次判别又要多次求交点,需要做 大量的乘除运算,花费很多时间。
计算机图形学2
当 △x>△y 时,让 x 从 x1 到 x2 变化,每
步递增 1,
那么,x 的变化可以表示为 xi+1=xi+1
y 的变化可以表示为 yi+1=yi+k
2.1.1 直线DDA算法 (Digital Differential Analyser)
用上式可求得图中直线 P1P2 和 y 向网格线的交点, 但显示时要用舍入, 找到 最靠近交点处的象素点耒 表示。 当 △x<△y 时,让 y 递 增 1,x作相应变化。
2.1.1 直线的扫描转换——中点画线算法
在d≥0时,取正右方像素点P1,则下一个中点M 坐标:M1(xp+2,yp+0.5),则下一个像素点的判 别式 d1=F(xp+2,yp+0.5)=a(xp+2)+b(yp+0.5)+c=d+a 故d的增量为a。
而若d<0,则取右上方像素点P2,则下一个中点M 坐标:M2(xp+2,yp+1.5),则下一个像素点的判 别式
2.1.2 直线Bresenham算法( 续)
求误差的初值P1,可将x1、y1和b代入式(2.4)中的xi、 yi而得到 P1 = 2dydx 综述上面的推导,第1a象限内的直线Bresenham算法 思想如下: ⒈ 画点(x1, y1),dx=x2x1,dy=y2y1,计算误差初值 P1=2dy dx,i=1; ⒉ 求直线的下一点位置 xi+1 = xi + 1 如果Pi>0,则yi+1=yi+1,否则yi+1=yi; ⒊ 画点(xi+1, yi+1); ⒋ 求下一个误差Pi+1,如果Pi>0,则Pi+1=Pi+2dy2dx, 否则 Pi+1=Pi+2dy; ⒌ i=i+1;如果i<dx+1则转步骤2;否则结束操作。
计算机图形学_ 光栅图形学算法(一)_24 多边形扫描转换X扫描线算法_
x
d、区间填色:把这些相交区间内的 像素置成不同于背景色的填充色
当扫描线与多边形顶点相交时,交点的取舍问题(交点的个数 应保证为偶数个)
y 12 11 10 9 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 101112 x
解决方案:
y
(1)若共享顶点的两条边分别落
12 11
x
算法的核心是按X递增顺序
排列交点的X坐标序列。由 y P7
此,可得到X-扫描线算法步
12 11
骤如下:
10 9
P6
P5
8
(3)对一条扫描线填充的过
7 6
P1
P3
5
程可分为四个步骤:
4 3
2
a、求交:计算扫描线与多边
1
1 2P23 4 5 6 7 8P4 9 101112 x
形各边的交点
b、排序:把所有交点按递增 顺序进行排序
任意两顶点间的连线均在多边形内
(2)凹多边形 任意两顶点间的连线有不在在多边形内
(3)含内环的多边形 多边形内包含多边形
现在的问题是,知道多边形的边界,如何找到多边形内部 的点,即把多边形内部填上颜色
P2
P3
P4
P1 P6
P5
顶点表示
点阵表示
1、X-扫描线算法
X-扫描线算法填充多边形的基本思想是按扫描线顺序,计算 扫描线与多边形的相交区间,再用要求的颜色显示这些区间 的像素,即完成填充工作
区间的端点可以通过计算扫 描线与多边形边界线的交点 获得
扫描线
交点 交点
交点
交点
如扫描线y=3与多边形的边界相 y
交于4点:
11
计算机图形学第二讲 光栅图形学
中点画线法
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); } /* while */ } /* mid PointLine */
= kxi+b+kx = yi+kx 当x =1; yi+1 = yi+k
• 即:当x每递增1,y递增k(即直线斜率); • 注意上述分析的算法仅适用于k ≤1的情形。
在这种情况下,x每增加1,y最多增加1。 • 当 k 1时,必须把x,y地位互换
数值微分(DDA)法
• 增量算法:在一个迭代算法中,如果每一 步的x、y值是用前一步的值加上一个增量 来获得,则称为增量算法。
部分重要概念
光栅化(扫描转化)
确定最佳逼近图形的像素集合,并用指定属性 写像素的过程称为图形的扫描转化或光栅化。
区域充填
确定二维图形内部区域对应的像素集,并用 指定的属性或图案进行显示的过程。
部分重要概念
裁剪
确定一个图形的哪些部分在窗口内,必须显示;哪 些部分落在窗口之外,不该显示的过程称为裁剪。
chp2-光栅图形学2
2.7 反走样
不光滑(阶梯状)的图形边界
走样现象
2.7 反走样
图形细节失真
走样现象
2.7 反走样
狭小图形的遗失与 动态图形的闪烁
走样现象
2.7 反走样
什么是反走样 在图形显示过程中,用于减少或消除走样现象 的方法。 提高分辨率方法 非加权区域采样 加权区域采样
2.5.2 有序边表算法
边的连贯性 第一类交点:新出现的边与扫描线的交点 第二类交点:位于同一条边上的后继交点
2.5.2 有序边表算法
交点的取整规则 要求:使生成的像素全部位于多边形之内 用于线画图元生成的四舍五入原则导致部分像素位 于多边形之外,从而不可用 假定非水平边与扫描线y=e相交,交点的横坐标为x.
2.5.2 有序边表算法
规则1 X为小数,即交点落于扫描线上两个相邻像素之间 (a)交点位于左边之上,向右取整 (b)交点位于右边之上,向左取整
2.5.2 有序边表算法
规则2 边界上象素的取舍问题,避免填充扩大化。 解决方法: 边界象素:规定落在右边界的象素不予填充。具体实现 时,只要对扫描线与多边形的相交区间左闭右开。
基 底
第二章 光栅图形学
2.1 2.2 2.3 2.4 2.5 2.6 2.7 直线段的扫描转换算法 圆、椭圆和圆弧的生成 多边形填充区 OpenGL学习 多边形扫描算法 字符属性 反走样
30
2.7 反走样
走样: 用离散量(像素)表示连续的量(图形)而引起 的失真,叫混淆或叫走样(aliasing)。 光栅图形的走样现象: 阶梯状边界; 图形细节失真; 狭小图形遗失:动画序列中时隐时现,产生闪烁。
26
第二章 光栅图形学-消隐
(4)求所剩线段的投影与平面边界投影的所有交点, 并根据交点在原直线参数方程中的参数值求出 Z值(即深度)。若无交点,转5。 (5) 以上所求得的各交点将线段的投影分成若干 段,求出第一段中点。 (6) 若第一段中点在平面的投影内,则相应的段 被遮挡,否则不被遮挡;其他段的遮挡关系可 依次交替取值进行判断。 (7) 结束。
G H A
n
E D
B
C V
前向面
后向面
多面体的隐藏线消除
图3中的JEAF、HCBG和DEABC所在的面均为后向面。 其它为前向面。
线消隐
基本数据结构 面表(存放参与消隐的面) + 线表(存放待显示的线) 算法 假设E为面F的一条边, 需判别F以外每一 个面与E的遮挡关系.
2.7.3消除隐藏面
3.3.1画家算法(列表优先算法)
6 5 4 3 2 1 0
∧ ∧ ∧
IP2 Ymax2 ∧
∧
IP1 Ymax1 ∧
∧
待消隐对象
多边形y表
活化多边形表APT:与当前扫描线相交的多边形。APT 是一个动态的链表
APT IP2 Ymax2 ∧ y=2 APT IP1 Ymax1 y=4 IP2 Ymax2 ∧
边Y表ET:活化多边形表中的每一个多边形都有一个边 表ET e2
关键问题:判断象素点(i,j)是否在pk的投影 多边形之内 Pk 计算多边形 在点(i,j)处的深度。设多 边形Pk的平面方程为:
ax by cz d 0
ai bj d depth c
点与多边形的包含性检测
射线法
P P1 P2 P3 P P1 P2
由被测点P处向 y = - 方向作射线 交点个数是奇数,则被测点在多边形内部 否则,偶数,在多边形外部。
光栅图形学
Pe T1
Psx
Psn
Ps
B1
x 1
y k
ye ys xe xs
◎|k| >1,|xe-xs|<|ye-ys|,则:
x k y 1
6/9/2019
2.中点画线法 ①原理: 假定直线斜率0<K<1,且已确定点亮象素
点P(xi ,yi ),则下一个与直线最接近的像 素只能是Pu点或Pd点。设M为中点,Q为交点, 现需确定下一个点亮的象素。
为了便于硬件操作,令:
e 2 e dx 2dy dx
则整数Bresenham画线算法可描述为:
◎当e<0,则xi+1=xi+1,ei+1=ei+2dy ◎当e≥0,则yi+1=yi+1,ei+1=ei+2dy-2dx
优点:
无乘除法(计算坐标时);
在同一坐标上不可能连续停留两次。
dy=y2-y1;
现
k=dy/dx;
e=-0.5; x=x1; y=y1;
for(i=0;i<=dx;i++)
{
pDC->SetPixel(x,y,color);
x++;
e=e+k;
if(e>=0) { y++; e=e-1;}
}
}
6/9/2019
例3:利用Bresenham算法绘制直线:
P0(0, 0), P1(5,2)
由直线的斜率确定选择在x方向或y方向上每次递增减1个单位另一变量的递增减量为0或1它取决于实际直线与最近光栅网格点的距离这个距离的最大误差为05然后根据误差项的符号确定由直线的斜率确定选择在x方向或y方向上每次递增减1个单位另一变量的递增减量为0或1它取决于实际直线与最近光栅网格点的距离这个距离的最大误差为05然后根据误差项的符号确定852016dddd该列像素中与此交点最近的像素
光栅图形学 (2)
2.1.1 数值微分(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;
–当M在Q的下方-> P2离直线更近更近->取P2 。 –M在Q的上方-> P1离直线更近更近->取P1 –M与Q重合, P1、P2任取一点。
计算机图形学 福建师范大学
2.1.2 中点画线法
问题:如何判断M与Q点的关系?
计算机图形学
福建师范大学
2.1.2 中点画线法
• 假设直线方程为:F(x,y)=ax+by+c=0 • 其中a=y0-y1, b=x1-x0, c=x0y1-x1y0 • 由常识知:
– 作为最底层的光栅图形算法,在通常的CAD/图 形系统中,会被大量应用,因此,哪怕节约一 个加法或减法,也是很了不起的改进。 – 由此出发点,导致增量算法的思想。 – 增量算法:在一个迭代算法中,如果每一步的x、 y值是用前一步的值加上一个增量来获得,则称 为增量算法。
计算机图形学
福建师范大学
2.1.1 数值微分(DDA)法
• • • • •
for (x=x0; xx1, x++) drawpixel (x, int(y+0.5), color); y=y+k;
福建师范大学
计算机图形学
2.1.1 数值微分(DDA)法 • 注意上述分析的算法仅适用于k ≤1的情形。 在这种情况下,x每增加1, y最多增加1。 • 问题: • 当 k 1时,会如何?(答案见下页)
知识点归纳 计算机图形学中的光栅化与渲染技术
知识点归纳计算机图形学中的光栅化与渲染技术计算机图形学是研究计算机应用中的图像处理和图像生成的学科,涉及到许多核心的知识点和技术。
其中,光栅化和渲染技术是计算机图形学中非常重要的一部分。
本文将对光栅化和渲染技术进行归纳总结,并探讨其在计算机图形学中的应用。
一、光栅化技术光栅化是计算机图形学中一种将连续的几何形状转换为离散的像素图像的技术。
在计算机渲染过程中,光栅化技术起到了至关重要的作用。
1. 点、线、多边形的光栅化在计算机图形学中,最基本的图形形状是点、线和多边形。
光栅化技术可以将这些形状转换为像素点集,从而在屏幕上显示出来。
通过合适的算法,可以准确地计算出像素的坐标和颜色值,从而实现图形的显示和绘制。
2. 光栅化算法光栅化过程中,需要使用各种算法来提高渲染效率和准确性。
常见的光栅化算法包括扫描线算法、中点画线算法、多边形填充算法等。
这些算法根据不同的需求和图形形状,选择合适的计算方法,以实现快速而准确的图形显示。
3. 光栅化与几何变换在对图形进行光栅化之前,常常需要进行几何变换,如平移、旋转、缩放等。
光栅化技术需要能够适应几何变换,并处理变换后的图形数据,以保持图形的形状和结构的准确性。
二、渲染技术渲染技术是计算机图形学中将三维模型转换为二维图像的过程。
通过适当的光照和材质处理,可以使得渲染结果更加真实和逼真。
1. 光照模型光照模型是渲染中的关键要素之一,决定了图像中各部分的明暗和色彩。
常见的光照模型有环境光照、点光源光照、平行光源光照等。
这些模型根据实际光照的物理模型,计算出每个像素点的光强和颜色。
2. 材质和纹理处理在渲染过程中,对于不同的物体材质,需要采用不同的渲染算法来模拟它们的表现方式。
常见的材质特性有反射率、折射率、光滑度等,需要根据不同的材质属性来计算图像的渲染效果。
同时,通过纹理映射技术,还可以将图像贴在物体表面,使得渲染结果更加真实和细致。
3. 光线跟踪光线跟踪是一种高级的渲染技术,它模拟了现实世界中光线的传播和反射路径,能够产生非常真实的渲染效果。
光栅图形学.ppt
清华大学
矢量轮廓字符 计算机图形学
• 特点:
– 点阵字符:存储量大,易于显示 – 矢量字符:存储量小,美观,变换方便; 但需要光
栅化后才能显示。
清华大学
计算机图形学
字符属性
–字体 宋体 仿宋体 楷体 黑体 隶书
–字高 宋体 宋体 宋体 宋体
–字宽 大海 大海 大海 大海
–字倾斜角
倾斜 倾斜
–对齐 (左对齐、中心对齐、右对齐)
在使用计算机处理图形信息时,计算机内部存储的图形 往往比较大,而屏幕显示的只是图的一部分。
清华大学
计算机图形学
问:为什么要裁减,直接处理呢?即:在绘制(写帧 缓存时)再处理?
清华大学
计算机图形学
最简单的裁剪方法是把各种图形扫描转换 为点之后,再判断各点是否在窗内。但那样太 费时,一般不可取。这是因为有些图形组成部 分全部在窗口外,可以完全排除,不必进行扫 描转换。所以一般采用先裁剪再扫描转换的方 法。
清华大学
计算机图形学
2.5.1直线段裁剪
• 直线段裁剪算法是复杂图元裁剪的基础。复杂 的曲线可以通过折线段来近似,从而裁剪问题 也可以化为直线段的裁剪问题。
2.5.1.1Cohen-Sutherland 2.5.1.2中点分割算法 2.5.1.3梁友栋-barskey算法。
清华大学
计算机图形学
2.5.1.1 Cohen-Sutherland裁剪
清华大学
计算机图形学
• 为快速判断,采用如下编码方法:
– 每个区域赋予4位编码 Ct CbCr Cl
1 Ct 0
y ymax other
1 Cb 0
y ymin other
1 Cr 0
第二章 光栅图形学
d初=0, 每走一步:d=d+k 一旦y方向上走了一步,d=d-1
23
• 算法步骤:
–1 输入直线的两端点P0(x0,y0)和P1(x1,y1)。 –2 计算初始值△x、△y、d=0、x=x0、y=y0。 k= △y/△x –3 绘制点(x,y)。
–4 d更新为d+k,判断d的符号。若d 0.5,则
• 直线的扫描转换基本思想
– 按直线从起点到终点的顺序,每绘制(转换) 一个点就与原直线比较,根据比较结果决定下 一步的走向,从而一步一步逼近直线。 (|K| <=1)
– 由一个点到下一个点的走向方法有如下三种: • X,Y方向各走一步;在X方向走一步 ; • 在Y方向走一步 ;
•约定一步为一个像素,x每次向右 走1步, 如何确定y的值?
21
2.1 直线段的扫描转换算法(Bresenham算法)
• y+1后立即d-1的原因???保证|d|在0,1之间 • 如果直线斜率较小,下一个当前点的d值有可 能为负?的确如此。
d d d
d
22
2.1 直线段的扫描转换算法(Bresenham算法)
xi 1 xi 1 y yi 1 (d 0.5) i 1 yi (d 0.5) < 改进前:误差项的计算
2.1 直线段的扫描转换算法(中点画线法)
• 例:用中点画线法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 0 0 0 1 3 1 1 0 -3 2 2 1 3 2 3 3 1 -1 1 4 4 2 5 5 5 2
d,摆脱0.5的浮点运算。 例: d + a大于0,2*(d + a)也大于0
第二章 光栅图形学-3(1)
计算机图形学
区域中的点采用同一编码。区域码的各位指出点关于裁剪窗口 的四个相对坐标位置:左、右、下、上。将区域码各位从右到 左编号,则坐标区域与各位的关系如下(图 2 ):
y 1001
yT
0001
1000 0000
1010 0010
yB 0101
0100
0110
x
xL
xR
图 2. 区域编码
2021/1/8
7
Northwest University
计算机图形学
存,两个端点都在同一条裁剪边界外的线段(如图1 中的 P3P4) 判断为落在窗口外,而其他贯穿一个或多个裁剪边界的线段需
要计算多个交点。为了使计算量最小,需设计一个能有效地识
别外部线段并减少求交运算的裁剪算法。
对于端点为 Pi = (xi , yi), i = 0, 1, 的线段,其参数方程为:
x y
x0 y0
(x1 x0 )u ( y1 y0 )u
,
0u 1
在该线段与裁剪边界求交时,可求得参数 u 值。若 u [0,1],则
该线段不在该边界处进入窗口内。否则,线段穿过了裁剪区。
该方法可用于各个裁剪边界,以便确定是否该线段的所有部分
2021/1/8
信息科学与技术学院 康宝生
8
第一位为 x - xL 的符号位,第二位为 xR–x 的符号位,第三位 为 y - yB 的符号位,第四位为 yT - y 的符号位。
一旦确定了线段两端点的区域码,便可快速判断完全可见
和完全不可见的线段。如果线段两端点的编码均为 0000,则该
线段完全可见;如果线段两端点的编码中同一位都为 1, 则该线
虽然点的裁剪不如直线和多边形的裁剪用的多,但是某些 应用中还是需要点的裁剪。例如,点的裁剪可以用于粒子爆炸 或海面泡沫的显示,它们是通过场景中分散的粒子建模。
计算机图形学教材第二章光栅图形学(希赛教育基础学院)
★第二章光栅图形学【课前思考】计算机是如何在屏幕上画一条直线或一个圆的?在计算机屏幕上画直线时,经常出现锯齿,这是为什么?如何解决?【学习目标】了解光栅图形学的特点;掌握直线、圆弧和椭圆的光栅显示方法;学习反走样的几种算法,并能够编程实现。
【学习指南】在数控插补技术中也有关于直线、圆弧和椭圆的NC插补的更多算法,可以参考有关的数控编程的书或资料;某些图象处理方法对学习和掌握反走样技术会有帮助。
【难重点】Bresenham画直线和画圆算法;直线的反走样。
【知识点】Bresenham画直线算法;Bresenham画圆算法;多边形区域填充;直线反走样;离散区域反走样算法。
◇第一节画线算法光栅图形显示器可以看成是由许多可发光的离散点(即像素)组成的矩阵,它需要专门的算法来生成直线、圆弧和曲线等等图形。
本章将介绍生成光栅图形的相关算法。
这些算法对于开发图形设备驱动程序是必需的。
不过,在Windows、Unix或Linux操作系统上开发计算机图形时,现在都有支持OpenGL的图形硬件和软件开发工具可供使用,而OpenGL程序库本身都提供了光栅图形显示的驱动程序,这为图形软件开发人员提供了便利。
2.1画线算法在数学上,理想的点和直线都是没有宽度的。
但是,由于每个像素对应于图形设备上的一个矩形区域,当我们在光栅图形设备上显示一个点时,实际上它是有用一个发光的矩形区域来表示的;当在光栅图形设备上显示一条直线时,我们只能在显示器所给定的有限个像素组成的矩阵中,按扫描线顺序,依次确定最佳逼近于该直线的一组像素,并且对这些像素进行写操作。
这个过程称为直线的扫描转换。
对于水平线、垂直线和45º斜线,选择哪些像素是显而易见的,但是对于其它的直线,确定用哪些像素来表示它就不那麽简单了。
本节我们介绍用于直线扫描转换的常用算法:Bresenham画线算法。
在介绍画线算法之前,我们先讨论画直线的基本要求:直线必须有精确的起点和终点,外观要直,线宽应当均匀一致、且与直线的长度和方向无关,最后,算法速度要快。
计算机图形学(三种画线算法)
计算机图形学(三种画线算法)第⼆章:光栅图形学算法1、光栅显⽰器:光栅扫描式图形显⽰器简称光栅显⽰器,是画点设备,可看作是⼀个点阵单元发⽣器,并可控制每个点阵单元的亮度2、由来:随着光栅显⽰器的出现,为了在计算机上处理、显⽰图形,需要发展⼀套与之相适应的算法。
3、研究内容:1>直线段的扫描转换算法2>多边形的扫描转换与区域填充算法3>裁剪算法4>反⾛样算法5>消隐算法⼀、直线段的扫描转换算法1.为了显⽰⼀条直线,就在光栅显⽰器上⽤离散的像素点逼近直线,所以我们就要知道这些像素点的坐标已知P0和P1,利⽤斜截式⽅程,y=kx+b,求出k=(y1-y0)/(x1-x0),b为截距现在k,b已知,x,y未知,现在假设⼀个像素距离为y,即可求出y的值。
因为像素的坐标是整数,所以y值还要进⾏取整处理2.在计算机中加法的运算更快,乘法较慢,故可以把上述⽅法优化来提⾼效率1>数值微分法(DDA)2>中点划线法3>Bresenham算法数值微分法(DDA)-----增量算法(只有⼀个加法)这个式⼦的含义是:当前步的y值等于前⼀步的y值加上斜率k(增量)例⼦:思考:x递增1,y递增k,是否适合任意的k?可改进的点:1>⼀般情况下,k都是⼩数,且每⼀步均要对y四舍五⼊,唯⼀改进的途径是把浮点运算变为整数加法!2>⽅程还有两点式,⼀般式当|k|<=1时,伪代码如下:voidDDALine(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);//drawpixel(x, y, color)在(x, y)像素点绘制颜⾊为color的点Y=y+k;}}中点画线法采⽤直线的⼀般式⽅程:Ax+By+C=0 F(x,y)=0,其中a = y0 - y1, b = x1 - x0,c = x0y1 - x1y0令F(x, y)=0则得出直线⽅程,代⼊ (x0, y0)和(x1, y1),便可得到三个⽅程,可求出a,b,c的值⼀条直线把平⾯分成了三个部分,直线上⽅,直线上,直线下⽅x⽅向上+1,y⽅向上加不加1需判断如何判断Q在M的上⽅还是下⽅?把M点的坐标带⼊⽅程,其中a = y0 - y1, b = x1 - x0分析计算量?两个乘法,四个加法,推导出d的增量公式d的初始值包含⼩数,因此可以⽤2d来代替d实现整数加法,所以d=2a+b伪代码如下:Void MidPointLine(int x0,int y0,int x1,int y1,int color){Int a,b,delta1,delta2,d,x,y;a=y0-y1;b=x1-x0;d=2*a+b;Delta1 = 2*a;Delta2 =2*(a+b);X = x0;Y=y0;//在对应的x,y像素点着⾊putpixel(x,y,GREEN);while(x<x1){if(d<0){x++;y++;d+=delta2;}else{x++;d+=delta1;}//在对应的x,y像素点着⾊putpixel(x,y,GREEN);}Bresenham算法每步的进化:DDA把算法效率提⾼到每步只做⼀个加法中点算法进⼀步把效率提⾼到每步只做⼀个整数加法Bresenham算法提供了⼀个更⼀般的算法,该算法不仅有好的效率,⽽且有更⼴泛的适⽤范围如何把算法的效率也提⾼到整数加法?改进⼀:令e=d-0.5因为d的初值为0,所以e的初值为-0.5,e=e+k,如果e>0,e=e-1改进⼆:在计算e值的情况下还是关于浮点数的计算,所以把浮点数化为整数。
计算机图形学--基本光栅图形生成算法
– 直线的正负划分性
直线上方点:F(X,Y)>0 直线下方的点F(X,Y)<0
要判断点M在直线上、上方还是下方,
即要判断点M在点Q的上方还是下方
将M代入下面的判别式d判断符号即可
d F ( M ) F ( x i 1, y i 0.5) a ( x i 1) b ( y i 0.5) c
二、DDA算法程序
void dda(int x1,int y1,int x2,int y2) //直线DDA { int k,i; float x, y, dx, dy; k = abs(x2-x1); if (abs(y2-y1)>k) k = abs(y2-y1); dx = float(x2-x1)/k; dy = float(y2-y1)/k; x=float(x1); y=float(y1); for (i=0;i<k;i++){ gl_Point(int(x+0.5), int(y+0.5)); 图中圆黑点表示用 DDA法生成的直线 x = x+dx; y = y+dy; } }// end DDA
正负法每步迭代涉及的 像素和中点示意图
则若M在Q的下方,则 PT离直线近,应取为 下一个逼近直线的像素; 否则应取PB 。
P2 M (Xp+1,Yp+0.5) P P1
二、算法具体实现
设直线起点 ( x s , y s ) 直线方程为: 其中,
a ys ye
终点 ( x e , y e )
x i 1 x i X t y i 1 y i Y t
上述处理基于从左端点到右端点, 若处理过程取反,即起始端点在右侧
第二章 光栅图形学
e初=-0.5, 每走一步有e=e+k。 if (e>0) then e=e-1
30
扫描转换直线段—Bresenham算法
算法步骤为:
◦ 输入直线的两端点P0(x0,y0)和P1(x1,y1)。
◦ 计算初始值△x、△y、e=-0.5、x=x0、y=y0。 ◦ 绘制点(x,y)。 ◦ e更新为e+k,判断e的符号。若e>0,则(x,y)更新为(x+1,y+1) ,同时将e更新为e-1;否则(x,y)更新为(x+1,y)。 ◦ 当直线没有画完时,重复步骤3和4。否则结束。
P2 Q
P=(xp,yp) P1
能否采用增量算法呢?
19
扫描转换直线段—中点算法
若d0,则M在直线上方->取P1; 此时再下一个象素的判别式为 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; 增量为a
P2 Q
P=(xp,yp) P1
20
扫描转换直线段—中点算法
若d<0 ------>M在直线下方->取P2; 此时再下一个象素的判别式为 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
计算机图形学
主讲:刘圣军 Email: shjliu.cg@
第2章 光栅图形学
数值微分法(DDA)
中点画线法
Bresenham算法
2.1.1 数值微分(DDA)法
已知线段两端点:P0(x0,y0), P1(x1,y1) 直线方程 y=kx+b {(xi, yi)}, i=0,….n. 浮点数取整 : yi=round(yi)=int (yi+0.5) 若直线经过点(0,0)和点(5,2),则直线方程为:y=0.4x 当x分别取值0,1,2,3,4,5时,y可取如下的值:
中点画圆法(4/6)
中点画圆法效果图
中点画圆整数算法(1/4)
思考题2 如何将上面算法中的浮点数改写成整数, 将乘法改成加法运算,即仅用整数实现 中点画圆法,以进一步提高算法的效率。
中点画圆整数算法(2/4)
中点画圆整数算法(3/4)
中点画圆整数算法(4/4)
MidpointCircle(r,color) Int r,color; {x=0;y=r;deltax=3;deltay=2-r-r;d=1-r; Drawpixel(x,y,color); While(x<y) {if(d<0) {d+=deltax;deltax+=2;x++} Else {d+=(deltax+deltay); Deltax+=2;deltay+=2; X++;y--;} Drawpixel(x,y,color); } }
法或减法,也是很了不起的改进。
由此出发个迭代算法中,如果每一步的x、 y值是用前一步的值加上一个增量来获得,则称为 增量算法。
计算机形学中的光栅化算法
计算机形学中的光栅化算法光栅化算法是计算机图形学中一个重要的概念,它用于将矢量图形转化为栅格图像。
本文将介绍计算机形学中的光栅化算法的原理、应用和发展。
一、光栅化算法的原理光栅化算法的目标是将矢量图形转化为栅格图像,使得图形具有清晰的边缘和色彩。
光栅化算法主要包括以下几个步骤:1. 坐标变换:从世界坐标系转化为屏幕坐标系,确定图形在屏幕上的位置和大小。
2. 边缘检测:通过扫描线算法或其他方法检测出图形的边缘,在边缘处确定像素的取值。
3. 插值计算:对于边缘上的像素,通过插值计算确定像素的精确位置和颜色值。
4. 像素抗锯齿:对于斜线等锯齿状边缘,通过像素抗锯齿算法使得边缘更加平滑。
5. 色彩填充:根据图形的填充方式,将图形的内部像素进行填充,形成最终的栅格图像。
二、光栅化算法的应用光栅化算法在计算机形学中有着广泛的应用,主要体现在以下几个方面:1. 计算机图形学:光栅化算法是计算机图形学中最基础的算法之一,它可以将矢量图形转化为栅格图像,实现图形的绘制和显示。
2. 游戏开发:游戏中的角色、场景等都是通过光栅化算法进行渲染和显示的,可以实现逼真的图形效果和动画效果。
3. 三维建模与渲染:光栅化算法可以用于对三维模型进行光栅化处理,实现真实感的三维渲染。
4. 虚拟现实:虚拟现实中的场景和物体都是通过光栅化算法进行绘制和显示的,使得用户可以身临其境地感受虚拟世界。
三、光栅化算法的发展随着计算机图形学的不断发展,光栅化算法也得到了改进和完善。
主要体现在以下几个方面:1. 增强的边缘检测算法:为了提高图像的清晰度和边缘的锐利度,研究者们不断提出改进的边缘检测算法,如Canny边缘检测算法和Sobel算子算法等。
2. 更高效的插值计算方法:为了提高图像的精细度,研究者们提出了更高效的插值计算方法,如双线性插值和双三次插值等。
3. 实时光栅化算法:随着计算机硬件的不断发展,研究者们致力于开发实时光栅化算法,以满足实时渲染的需求。
第二章光栅图形学--裁剪
3 裁剪的策略及原理
• 裁剪的策略: (1) 裁剪与窗口-视图变换的先后 。 “先裁剪后变换”可以避免窗口外的图形进行 无效的窗口-视图变换。 (2) 图形的生成与裁剪的先后。 “先生成后裁剪”只需要简单的直线段裁剪算 法,但可能造成无效的生成运算。 “先裁剪后生成”可以避免对那些被裁剪的图 形进行无效的生成运算,却要采用比较复杂图 形(如圆弧,椭圆弧)的的裁剪处理。
可弃之。然后对另一段重复上述处理。
1001
1000
1010
0001
0000
0010
0101
0100
0110
–
编码
P1 P3 P4
P2
线段裁剪
第二章光栅图形学--裁剪
Cohen-Sutherland裁剪
如何判定应该与窗口的哪条边求交呢? 编码中对应位为1的边。
• 计算线段P1(x1,y1)P2(x2,y2)与窗口边界的交点 if(LEFT&code !=0) { x=XL; y=y1+(y2-y1)*(XL-x1)/(x2-x1);} else if(RIGHT&code !=0) { x=XR; y=y1+(y2-y1)*(XR-x1)/(x2-x1);} else if(BOTTOM&code !=0) { y=YB; x=x1+(x2-x1)*(YB-y1)/(y2-y1);} else if(TOP & code !=0) { y=YT; x=x1+(x2-x1)*(YT-y1)/(y2-y1);}
第二章光栅图形学--裁剪
• 裁剪的原理: (1) 点在区域内外的判断。 (2) 计算图形元素与区域边界的交点。
第二章光栅图形学--裁剪
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Bresenham画线算法
在直线生成的算法中Bresenham算法 是最有效的算法之一。令 k=Δy/Δx, 就0≤k≤1的情况来说明Bresenham算法。 由DDA算法可知:
斜率不在[0,1]的直线的处理
• 若-1<k<0
• 先对(x0,-y0)和(x1,-y1)所确定的
• 直线进行扫描转换,
(x0,y0)
• 每确定一组(x,y),输出(x,-y)。
(x1,-y1)
(x0,-y0)
(x1,y1)
斜率不在[0,1]的直线的处理
• 若k<-1
• 对(-y0,x0)和(-y1,x1)所确定的
。
数值微分(DDA)法
•基本思想
已知过端点P0 (x0, y0), P1(x1, y1)的直线段L y=kx+b
直线斜率为
k y1 y0 x1 x0
考虑当x从xixi+1时y的变化规律: 设x=xi+1- xi xi+1= xi+ x
数值微分(DDA)法
计算yi+1= kxi+1+b= k (xi+ x) +b
通过两点不能唯一确定a,b,c,
取 a=y0-y1, b=x1-x0, c=x0y1-x1y0, F(x,y)=ax+by+c;
则有
Fx, y 0 Fx, y 0 Fx, y 0
点在直线上面 点在直线上方 点在直线下方
P2 Q
P=(xp,yp) P1
∴欲判断M点是在Q点上方还是在Q点下方,
只需把M代入F(x,y),并检查它的符号。
直线进行扫描转换,
(x0,y0)
每确定一组(x,y),
输出(y,-x)。
(-y0,x0)
(x1,-y1) (-y1,x1)
(x,-y0)
(x1,y1)
3 Bresenham算法(教材上介绍的)
假定直线段的0≤k≤1 基本原理:
kd k
d kd
k kd
图5-8 改进B的reBsreennhsaemmh算am法算原法理绘制直线的原理
为(x+1,y+1),同时将d更新为d-1;否则(x,y)更新 为(x+1,y)。 5.当直线没有画完时,重复步骤3和4。否则结束。
改进1:令e=d-0.5
yi1
xi1
yi yi
xi 1
1 (e (e
0) 0)
• e初=-0.5, • 每走一步有e=e+k。 • if (e>0) then e=e-1
(X i+1, kX i+1+b)
栅格交点表示象素点位置
直接计算法
这样一来,只要给定 x的值,根据解析式立即 可以计算出对应的y值,然后输出(x,round(y)).
。
。。
(X i , Yi)
。
(X i , Yi)
(X i+1, kX i+1+b)
这种方法直观,但效率太低,因为每一步需要 一次浮点乘法、一次浮点加法和一次舍入运算。
由于只用d 的符号作判断,为了只包含整数运算, 可以用2d代替d来摆脱小数,提高效率。
中点画线法
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); } /* while */ } /* mid PointLine */
部分重要概念
光栅化(扫描转化)
确定最佳逼近图形的像素集合,并用指定属性 写像素的过程称为图形的扫描转化或光栅化。
区域充填
确定二维图形内部区域对应的像素集,并用 指定的属性或图案进行显示的过程。
部分重要概念
裁剪
确定一个图形的哪些部分在窗口内,必须显示;哪 些部分落在窗口之外,不该显示的过程称为裁剪。
• 在介绍三个常用算法前,先介绍一种最容易 想到的算法: 直接计算法!
0 直接计算法
假定直线的起点、终点分别为:(x0,y0), (x1,y1), 且都为整数。 计算出斜率k=(y1-y0)/(x1-x0) , 在Y轴的截距b=y0-k*x0
y=k*x+b
。
。。
(X i , Yi)
。
(X i , Yi)
• DDA算法就是一个增量算法。
数值微分(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; xx1, x++) drawpixel (x, int(y+0.5), color);
中点画线法
构造判别式:
d=F(M)=F(xp+1,yp+0.5)
P2
=a(xp+1)+b(yp+0.5)+c
Q
当d<0,M在直线(Q点)下 方,取右上方P2;
P=(xp,yp) P1
当d>0,M在直线(Q点)上
方,取右方P1;
当d=0,选P1或P2均可, 约定取P1;
能否采用增量算法呢?
中点画线法
走样和反走样
因像素逼近误差,使图形产生畸变(台阶、锯齿)的现 象称之为走样。用于减少或消除走样的技术称为反走样。
消隐(消除隐藏线和隐藏面)
为了提高图形的真实性,必须把隐藏的部分从图中删 除,习惯上称为消除隐藏线和隐藏面,或简称消隐。
直线段的扫描转换算法
• 直线的扫描转换: 确定最佳逼近于该直线的 一组象素,并且按扫描线顺序,对这些象素 进行写操作。
• 此时再下一个象素的判别式为
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
P2
Q
P=(xp,yp) P1
中点画线法
• 画线从(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
• 原理:
P2 Q
P=(xp,yp) P1
2 中点画线法
假定直线斜率0<K<1,且已 确定点亮象素点P(Xp ,Yp ), 则下一个与直线最接近的像 素只能是P1点或P2点。设M 为中点,Q为交点 现需确定下一个点亮的象素。
中点画线法
– 当M在Q的下方-> P2离直线更近更近->取P2 。 – M在Q的上方-> P1离直线更近更近->取P1 – M与Q重合, P1、P2任取一点。
更新为(x+1,y+1),同时将e更新为e-2△x;否则 (x,y)更新为(x+1,y)。 5.当直线没有画完时,重复步骤3和4。否则结束。
Bresenham画线算法
BresenhamLine(x0,y0,x1,y1,color) {
int x0,y0,x1,y1,color; int x,y,dx,dy,e; dx = x1-x0; dy = y1-y0; e = -dx; x=x0; y=y0; for( i=0; i<=dx; i++)
yi
1
xi1 xi
yi yi
1
1 (d (d
0.5) 0.5)
误差项d的计算 • d初=0, • 每走一步:d=d+k • 一旦y方向上走了一步,d=d-1
算法步骤:
1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。 2.计算初始值△x、△y、d=0、x=x0、y=y0。 3.绘制点(x,y)。 4.d更新为d+k,判断d的值。若d>0.5,则(x,y)更新
• 设起点和终点分别为(x0,y0)和(x1,y1)
• 若k>1
• 则(y0,x0)和(y1,x1)所确定的
(x1,y1)
直线斜率k€ [0,1], (y1,x1)
适用于前面讨论的情形。
• 对(y0,x0)和(y1,x1)所确定的 (y0,x0) 直线进行扫描转换,
(x0,y0)
每确定一组(x,y),输出(y,x)。
y=y+k;
数值微分(DDA)法
• 例:画直线段P0(0,0)--P1(5,2) k=0.4
x y int(y+0.5)
00
0
Line: P0(0, 0)-- P1(5, 2)
1 0.4 0
3
2 0.8 1
2
3 1.2 1
4 1.6
2
1
5 2.0
2
0 12 3 4 5
数值微分(DDA)法
• 缺点: 在此算法中,y、k必须是float,且每一 步都必须对y进行舍入取整,不利于硬件实现。