第2章 光栅图形学
第二章光栅特讲
五. 光栅方程 六. 谱线的半角宽度() 七. 谱线的缺级
衍射光栅
-2级光谱
-1级光谱
中央亮纹
1级光谱
2级光谱
【引言】
1、 广义定义:在一定的空间范围内,具有空间周期性结构,能够按 一定规律对光波(电磁波)进行调制(振幅和位相)的物体或者装置。 2、 研究方法:多光束干涉和衍射;傅里叶变换。 3、 分类:衍射光栅和计量光栅;1D,2D,3D 光栅;透射和反射光栅
2
表明,光栅衍射是单缝衍射和多缝干涉共同作用的 结果。
式中
b sin sin 称为单缝衍射因子 2 A0 2 b sin
2
d sin N sin 称为缝间干涉因子 2 d sin sin
5· 光栅衍射的强度分布 2 由于光栅上有多条狭缝存在,所以除了单缝衍 射外,还存在各缝间光束的干涉。光栅衍射强度应 是二者共同作用的结果。由积分可求得其表达式。 任意衍射角对应的P点处光强为:
b d 2 sin sin sin N sin 2 I p A0 2 2 d b sin sin sin
j 第j级谱线位置为: sin d 其一侧第一暗纹位置为 : 两式相减得: sin
jN 1
Nd
sin sin
Nd
将上式左侧展开、化简 可得 , cos 谱线半角宽度
Nd
Nd cos
5· 谱线的缺级 6
2
缝间干涉因子:决定各种、各级条纹的位置。 单缝衍射因子:决定各种、各级条纹的光强度。
3.对衍射图样的定性分析: ⑴.单缝衍射:每个缝均发生衍射,且衍射 b sin( sin ) A 分布相同,遵循: A b sin
计算机图形学_ 光栅图形学算法(一)_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
光栅图形学算法
光栅图形学算法光栅图形学算法基础其二(裁剪算法)光栅图形学算法的研究内容直线段的扫描转换算法多边形的扫描转换与区域填充算法直线裁剪算法反走样算法消隐算法一、裁剪简述使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的只是图形的一部分。
因此需要确定图形哪些部分落在显示区之内,哪些落在显示区之外。
这个选择的过程就称为裁剪。
常见的裁剪方式有点的裁剪、以及直线段的裁剪。
1、点的裁剪最简单的裁剪方法是把各种图形扫描转换为点之后,再判断点是否在窗口内。
对于任意一点P(x,y),若满足下列两对不等式:则点P在矩形窗口内;否则,点P在矩形窗口之外。
判断图形中每个点是否在窗口内,太费时,一般不可取。
2、直线段的裁剪直线段裁剪算法复杂图形裁剪的基础。
?直线段和剪裁窗口的可能关系:完全落在窗口内完全落在窗口外与窗口边界相交 ?要裁剪一条直线段,首先要判断:(1)它是否完全落在裁剪窗口内??(2)它是否完全在窗口外?(3)如果不满足以上两个条件,则计算它与一个或多个裁剪边界的交点。
常用的裁剪算法有三种,即Cohen-Sutherland、中点分割法和 Liang-Barsky 裁剪算法。
1) Cohen - Sutherland算法此算法又称编码裁剪算法,算法的基本思想是对每条直线段分三种情况处理:若点p1和p2完全在裁剪窗口内。
“简取”之?若点p1(x1,y1)和p2(x2,y2)均在窗口外,且满足下列四个条件之一:如果直线段既不满足“简取”的条件,也不满足“简弃”的条件?需要对直线段按交点进行分段,分段后判断直线是“简取”还是“简弃”。
每条线段的端点都赋以四位二进制码D3D2D1D0,编码规则如下:若XXleft,则D0=1,否则D0=0若XXright,则D1=1,否则D1=0若yybottom,则 D2=1,否则 D2=0若yytop,则 D3=1,否则 D3=0 窗口及其延长线所构成了9个区域。
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
光栅图形学 (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. 光栅的发展历史光栅的概念最早由德国物理学家约瑟夫·冯特慕尔于19世纪初提出。
当时,冯特慕尔利用光栅将光分解成不同颜色,并发现了光的波动性质。
此后,光栅经过不断的改进和发展,广泛应用于光谱分析、光学仪器和通信等领域。
3. 光栅的工作原理光栅的工作原理基于多波干涉和衍射效应。
当平行光束照射到光栅上时,不同波长的光会由于光栅的周期性结构而发生干涉衍射,形成一系列明暗条纹。
通过改变光栅的参数,如槽宽、周期等,可以调节光栅的工作模式和光的分解效果。
4. 光栅的应用领域光栅广泛应用于多个领域,包括但不限于以下几个方面:•光谱分析:光栅可以将多波长光分解成单色光,用于光谱分析、光度计校准、荧光光谱分析等领域。
•光学仪器:光栅可以用作光学仪器的关键元件,如光栅光谱仪、光栅显微镜、光栅分束器等。
•通信技术:光栅可以用于光纤通信系统中的波长分复用和频率选择器件,提高光信号传输的带宽和效率。
•色彩显示:光栅可以应用于LCD背光源中,通过分解光束的不同波长,实现色彩的显示和调节。
5. 光栅的设计与制造光栅的设计与制造需要考虑多个参数,如槽宽、周期、槽深等。
根据不同的应用需求,可以采用不同的光栅类型和制造工艺,如光刻、光刻胶、电子束曝光等。
光栅的制造过程需要高精度的设备和工艺控制,以确保光栅的性能和质量。
6. 光栅的发展趋势随着科技的不断进步,光栅技术也在不断发展和创新。
未来,光栅将更加广泛地应用于光学通信、人工智能、虚拟现实等新兴领域。
同时,光栅的制造工艺和性能也将继续提升,以满足不同应用的需求。
7. 总结光栅作为一种重要的光学元件,具有广泛的应用前景。
通过光栅的设计和制造,可以实现光谱分析、色彩显示、通信技术等多种应用。
光栅图形学.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
第二章 光栅图形学-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, 则该线
虽然点的裁剪不如直线和多边形的裁剪用的多,但是某些 应用中还是需要点的裁剪。例如,点的裁剪可以用于粒子爆炸 或海面泡沫的显示,它们是通过场景中分散的粒子建模。
传感器与检测技术课件第二章-4光栅
光栅检测技术在智能制造中的应用
光栅检测技术在智能制造中起到质量检测和测量的关键作用,有效提高生产效率和产品质量。
光谱学
光栅在光谱学中起到分光和波长选择的作用,广泛 应用于光谱仪和光谱分析中。
荧光分析
光栅在荧光分析中用于选择性激发特定波长的荧光 材料,提高检测灵敏度。
光栅在飞行器姿态控制中的应 置信息,用于飞行器的姿 态控制和导航。
光栅检测技术的未来发展趋势
随着科技的不断进步,光栅检测技术将更加精密和高效,应用领域将进一步扩展,为智能制造和安全监测带来新的 突破。
光栅的分类
根据光栅的不同性质和结构,可以将光栅分为折射光栅、反射光栅和折射反射复合光栅。
光栅的生产技术
光栅的生产技术包括光刻、电子束曝光、激光干涉和机械刻蚀等方法,其中激光干涉技术是最常用的方法。
光栅的应用领域
激光测量
光栅在激光测量中应用广泛,可用于测量距离、速 度、位移等参数。
光学显微镜
光栅在光学显微镜中可以提高分辨率并实现更精准 的检测。
传感器与检测技术课件第 二章-4光栅
光栅是一种常见的光学器件,它通过周期性的结构使光发生衍射现象。本章 将介绍光栅的工作原理、分类、生产技术以及在不同领域的应用。
什么是光栅
光栅是一种具有规则周期性结构的光学元件,它能够将光按照特定的规律进 行衍射和干涉。
光栅的工作原理
光栅的工作原理是基于光的衍射现象,当入射光通过光栅时,会发生衍射,形成一系列亮暗交替的衍射条纹。
计算机图形学(三种画线算法)
计算机图形学(三种画线算法)第⼆章:光栅图形学算法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值的情况下还是关于浮点数的计算,所以把浮点数化为整数。
计算机图形学基础-第2章 光栅图形学
由于只用d 的符号作判断,为了只包含整数运算, 可以 用2d代替d来摆脱小数,提高效率。
计算机图形学基础
2.1 直线段的扫描转换算法
中点画线法
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 */
(y0,x0) (x0,y0)
(y1,x1)
计算机图形学基础
2.1 直线段的扫描转换算法
斜率不在[0,1]的直线的处理
若-1<k<0
先对(x0,-y0)和(x1,-y1)所确定的直线进行扫描转换, 每确定一组(x,y),输出(x,-y)。
(x0,y0) (x1,-y1)
(x0,-y0)
(x1,y1)
P2 Q
计算机图形学基础
P=(xp,yp) P1
2.1 直线段的扫描转换算法
中点画线法
若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 若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
计算机图形学教材第二章光栅图形学(希赛教育基础学院)
★第二章光栅图形学【课前思考】计算机是如何在屏幕上画一条直线或一个圆的?在计算机屏幕上画直线时,经常出现锯齿,这是为什么?如何解决?【学习目标】了解光栅图形学的特点;掌握直线、圆弧和椭圆的光栅显示方法;学习反走样的几种算法,并能够编程实现。
【学习指南】在数控插补技术中也有关于直线、圆弧和椭圆的NC插补的更多算法,可以参考有关的数控编程的书或资料;某些图象处理方法对学习和掌握反走样技术会有帮助。
【难重点】Bresenham画直线和画圆算法;直线的反走样。
【知识点】Bresenham画直线算法;Bresenham画圆算法;多边形区域填充;直线反走样;离散区域反走样算法。
◇第一节画线算法光栅图形显示器可以看成是由许多可发光的离散点(即像素)组成的矩阵,它需要专门的算法来生成直线、圆弧和曲线等等图形。
本章将介绍生成光栅图形的相关算法。
这些算法对于开发图形设备驱动程序是必需的。
不过,在Windows、Unix或Linux操作系统上开发计算机图形时,现在都有支持OpenGL的图形硬件和软件开发工具可供使用,而OpenGL程序库本身都提供了光栅图形显示的驱动程序,这为图形软件开发人员提供了便利。
2.1画线算法在数学上,理想的点和直线都是没有宽度的。
但是,由于每个像素对应于图形设备上的一个矩形区域,当我们在光栅图形设备上显示一个点时,实际上它是有用一个发光的矩形区域来表示的;当在光栅图形设备上显示一条直线时,我们只能在显示器所给定的有限个像素组成的矩阵中,按扫描线顺序,依次确定最佳逼近于该直线的一组像素,并且对这些像素进行写操作。
这个过程称为直线的扫描转换。
对于水平线、垂直线和45º斜线,选择哪些像素是显而易见的,但是对于其它的直线,确定用哪些像素来表示它就不那麽简单了。
本节我们介绍用于直线扫描转换的常用算法:Bresenham画线算法。
在介绍画线算法之前,我们先讨论画直线的基本要求:直线必须有精确的起点和终点,外观要直,线宽应当均匀一致、且与直线的长度和方向无关,最后,算法速度要快。
第二章 光栅图形学
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@
光栅图形学
1. 数值微分法(DDA)
Pe(xe, ye)
栅格交点表示像素点位置
Ps(xs, ys)
7
4/12/2022
①基本思想:
已知过端点Ps (xs, ys), Pe(xe, ye)的直线段L:
y=kx+b,直线斜率为:
k ys ye xs xe
yi 1yi yyik x
当△x=1时 yi1yi k
若直线的起点在整数点上,则d0=0
◎当d<0.5,则xi+1=xi+1,di+1=di+k ◎当d≥0.5,则yi+1=yi+1,di+1=di+k-1
4/12/2022
令e=d-0.5,e0=-0.5
e<0时,取当前像素(xi,yi)的右方像素(xi+1,yi) e>0时,取当前像素(xi,yi)的右上方像素(xi+1,yi+1) e=0时,可任取上、下光栅点显示
当d0时 当d0时
4/12/2022
例2:用中点画线法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
21
0
-3
3
32
1
3
2
43
1
-1
1
54
2
5
65
2
1
0 12 3 4 5
4/12/2022
◎当e<0,则xi+1=xi+1,ei+1=ei+k ◎当e≥0,则yi+1=yi+1,ei+1=ei+k-1
第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值是用前一步的值加上一个增量来获得,则称为 增量算法。
第二章光栅图形学--裁剪
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) 计算图形元素与区域边界的交点。
第二章光栅图形学--裁剪
第二章 光栅图形学
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
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2002年10月24日
上海交通大学计算机系 何援军
1
直线光栅化算法
DDA算法 算法 Bresenham算法 算法
圆光栅化算法
中点算法 中点整数算法 中点整数优化算法
2002年10月24日
上海交通大学计算机系 何援军
2
2.1直线光栅化算法 2.1直线光栅化算法
DDA算法(Digital Differential Analyzer) 算法( 算法 Bresenham算法 算法
dx=xe-xs; dy=ye-ys; //初始点处理 初始点处理 if (fabs(dy)<fabs(dx) { //x方向跨距长,|斜率 方向跨距长, 斜率|<=1 方向跨距长 斜率 Length=abs(Round(xe)-Round(xs)); Flag=1; //最大的插补长度和方向标记 最大的插补长度和方向标记 ix= Round(xs); //初始 点 初始x点 初始 idx=isign(dx); //x方向单位增量 方向单位增量 y= ys+dy/dx*((float)(ix)-xs);//初始 点修正 初始y 初始 dy=dy/fabs(dx); //x方向斜率增量 方向斜率增量 }
{
int n,ix,iy,idx,idy ; int Flag; //插补方向标记 插补方向标记 int Length; //插补长度 插补长度 float x,y,dx,dy;
2002年10月24日 上海交通大学计算机系 何援军 13
4)本教程描述——任意方向直线插补算法 4)本教程描述——任意方向直线插补算法
y递增 后,与当前光栅点误差超过 ,递增 递增k后 与当前光栅点误差超过0.5,递增1 递增 y递增 后,与当前光栅点误差小于 ,递增 递增k后 与当前光栅点误差小于0.5,递增0 递增 y递增 后,与当前光栅点误差等于 ,递增 递增k后 与当前光栅点误差等于0.5,递增0/1 递增
2002年10月24日 上海交通大学计算机系 何援军 11
4)本教程描述——几个注记 4)本教程描述——几个注记
终点按四舍五 入原则校正到 光栅点上
起点直接按四 舍五入原则校 正到光栅点上
先求取直线与 最近垂直光栅 线的交点
先 将 直 线 延 长求 取 与 最 近 垂 直光 2002年10月24日 栅线的交点
上海交通大学计算机系 何援军 4
2002年10月24日
1)David F. Rogers 描述
直线的基本微分方程是: 直线的基本微分方程是: Dy/Dx=常数 =常数(k) 设直线通过点P 设直线通过点 1(x1,y1)和P2(x2,y Dy/Dx), 和 , 则直线方程可表示为: 则直线方程可表示为: Dy/Dx=(y2-y1)/(x2-x1)=k
2002年10月24日 上海交通大学计算机系 何援军 9
2) James D.Foley 描述
void Line ( int xs,ys; int xe,ye; int value)
{ //设0≤k≤1,xs<xe 设 //左端点 左端点 //右端点 右端点 //赋给线上的象数值 赋给线上的象数值
2002年10月24日
上海交通大学计算机系 何援军
17
4)本教程描述——首点校正对逼近的影响 4)本教程描述——首点校正对逼近的影响
不校正首点, 不校正首点,光 栅化的结果直线
小红圈: 小红圈:不校 正首点的逼近
理想直线
大黑圈: 大黑圈:首点 校正后的逼近
2002年10月24日 上海交通大学计算机系 何援军 18
end while
2002年10月24日 上海交通大学计算机系 何援军 8
2) James D.Foley 描述
令 k =(y2-y1)/(x2-x1) 有: yi+1=yi+k•StepX 若0<k<1,即∆x >∆y ,
因光栅单位为1, 因光栅单位为 , 可以采用每次x方向增加 , 可以采用每次 方向增加1, 方向增加 方向增加k的办法得到下一个直线点 而y方向增加 的办法得到下一个直线点。 方向增加 的办法得到下一个直线点。
x= xs+dx/dy*((float)(iy)-ys); //初始 点修正 初始x点修正 初始
2002年10月24日
上海交通大学计算机系 何援军
15
4)本教程描述——任意方向直线插补算法 4)本教程描述——任意方向直线插补算法
if (Flag) {
//x方向单位增量 方向单位增量 //x方向插补过程 方向插补过程
else
{
//y方向斜率增量 方向斜率增量
for (n=0; n<= Length; n++) {//y方向插补过程 方向插补过程 WritePixel (Round(x), iy, value); iy+=idy; x+=dx; } //End of for } //End of else } //Finish
2.1.2 Bresenham算法 Bresenham算法
Bresenham算法 算法
基本原理 Bresenham算法 算法 整数Bresenham算法 算法 整数 一般整数Bresenham算法 算法 一般整数
ห้องสมุดไป่ตู้
2002年10月24日
上海交通大学计算机系 何援军
19
2.1.2 Bresenham算法 Bresenham算法
2002年10月24日
上海交通大学计算机系 何援军
5
1)David F. Rogers 描述
如果已知第i点的坐标,可用步长 如果已知第 点的坐标,可用步长StepX和StepY 点的坐标 和 得到第i+1点的坐标为 点的坐标为: 得到第 点的坐标为: xi+1=xi+ StepX yi+1=yi+ StepY 或 yi+1=yi+ k • StepX 例图中 0<k<1 StepX=1 StepY=k 将算得的直线上每个点 的当前坐标, 的当前坐标,按四舍五 入得到光栅点的位置
value y+=k; } // End of for } // Line
2002年10月24日
// y移动步长是斜率 移动步长是斜率k 移动步长是斜率
上海交通大学计算机系 何援军
10
3)已有算法描述分析 3)已有算法描述分析
Rogers 描述: 描述: 采用x 采用 = x + StepX ,y = y + StepY, , 逼近点并不一定是直线的一个最好的逼近; 逼近点并不一定是直线的一个最好的逼近; D.Foley描述: 描述: 描述 未分析直线端点不在象素点上的情况; 未分析直线端点不在象素点上的情况; 只给出0- °卦限的描述。 只给出 -45°卦限的描述。 为避免引起积累误差, 为避免引起积累误差,D.Foley描述中采用 描述中采用 double dx =xe-xs; double dy =ye-ys; double k =dy/dx; // 直线之斜率 直线之斜率k
2002年10月24日 上海交通大学计算机系 何援军 6
1) David F. Rogers 描述
// Digital Differential Analyzer (DDA ) routine for rasterizing a line // The line end points are (xs,ys) and (xe,ye) assumed not equal. // Round is the function. Note: Many Round functions are floor functions, i.e Round (-8.5)=-9 rather than -8. The algorithm assumes this is the case. // Approximate the line length if (|xs- xe | ≥ | ys-ye |) then //插补长度 插补长度
2002年10月24日 上海交通大学计算机系 何援军 14
4)本教程描述——任意方向直线插补算法 4)本教程描述——任意方向直线插补算法
else
{ // y方向跨距长,|斜率 方向跨距长, 斜率|>1 方向跨距长 斜率 Length=abs(Round(ye)-Round(ys)); Flag=0; iy= Round(ys); idy=isign(dy); dx=dx/fabs(dy); } //初始 点 初始y点 初始 //y方向单位增量 方向单位增量 //x方向斜率增量 方向斜率增量
for (n=0; n<= Length; n++){
WritePixel(ix, Round(y), value); ix+=idx; y+=dy; } //End of for } //End of if
2002年10月24日
上海交通大学计算机系 何援军
16
4)本教程描述——任意方向直线插补算法 4)本教程描述——任意方向直线插补算法
从另一个角度看直线光栅化算法的原理: 从另一个角度看直线光栅化算法的原理:
一个方向上每次递增( 一个方向上每次递增(减)1个单位 个单位 另一个方向的递增( 另一个方向的递增(减)量为0或1 量为 或
取决于实际直线与最近光栅网格点的距离 这个距离的最大误差为0.5。 这个距离的最大误差为 。
2002年10月24日
上海交通大学计算机系 何援军
20
1) Bresenham的基本原理 Bresenham的基本原理
假定直线斜率k在 之间。 假定直线斜率 在0~1之间。 之间
考虑x方向每次递增 个单位 考虑 方向每次递增1个单位 方向每次递增 决定y方向每次递增 或 。 决定 方向每次递增0或1。 方向每次递增