3第三章 二维图元的基本光栅图形学算法-2
图形学第三章
记Hi(xHi, yHi), Li(xLi, yLi) sM 对应的圆半径Rm , 且满足: (xHi2 + yHi2 – Rm2) + (xLi2 + yLi2 – Rm2 ) = 0 如何判断弧AB在sM 的上方还是下方? 设AB弧对应半径为R, 令D(P) = x2 +y2 – R2 且 di = D(Hi) + D(Li) = (xHi2 + yHi2 –R2) + (xLi2 + yLi2 –R2) 易知 di 是R的递减函数, R = Rm时, di = 0;取Hi 或Li 。 R > Rm时, AB弧在sM上方, di < 0,取Hi; R< Rm 时, AB弧在sM下方, di > 0,取Li。
3.2.1 Bresenham 生成圆弧算法
void BshCircle(double Radius, int color) {
int x, y, d; x = 0; y = Radius; d = 3 – 2*Radius; while(x <= y) {
SetPixel(x,y,color); if (d < 0) d += 4*x + 6; else { d += 4*(x-y) + 10; y - -; } x++;
基本光栅图形学算法
SEI
18
高级语言程序设计 计算机图形学 2010秋季 程序设计基础 • 2007春季
C++ 填充
步骤 求交
逐点比较法 Y-X扫描线 X
扫描线算法
求扫描线与多边形各边交点 排序 按 x 递增顺序对交点排序 交点匹配 1-2,3-4,5-6等 填充 填充每对交点间在多边形区域 内部的象素。 内部的象素。
17
逐点比较法 Y-X扫描线 X 扫描线种子
SEI
高级语言程序设计 计算机图形学 2010秋季 程序设计基础 • 2007春季
C++ 填充
扫描线算法
原理
逐点比较法 Y-X扫描线 X
对任一条扫描线, 对任一条扫描线,确 定该扫描线与多边形 边的交点位置,自左 边的交点位置, 向右存储, 向右存储,并对每对 内部交点间的帧缓存 填写指定颜色
SEI
15
高级语言程序设计 计算机图形学 2010秋季 程序设计基础 • 2007春季
C++ 填充
3.3 多边形区域填充
区域填充是光栅系统的一大亮点,优于向量 区域填充是光栅系统的一大亮点 优于向量 系统 区域填充利于物体的真实感建模
SEI
16
高级语言程序设计 计算机图形学 2010秋季 程序设计基础 • 2007春季
SEI
21
高级语言程序设计 计算机图形学 2010秋季 程序设计基础 • 2007春季
C++ 填充
扫描线算法
每条扫描线具有一个链表, 每条扫描线具有一个链表,包含与其相交边的信息
struct E { double ymax; double x_Intersection; double dx; E * pointer ; }
光栅方程_精品文档
光栅方程概述光栅是一种具有定期排列的平行缝隙或条带的光学元件,它通常用于分光仪、光学显微镜等光学设备中。
光栅方程是描述光栅的主要数学模型之一,可以用来计算光栅的衍射效应。
本文将详细介绍光栅方程的基本概念、推导过程以及实际应用。
1. 光栅的基本结构光栅由一系列平行的孔隙或条带组成,这些孔隙或条带的宽度和间距是恒定的。
光栅可以分为反射光栅和透射光栅两种类型。
反射光栅的条带通常由高反射率的金属或介质材料组成,而透射光栅的条带则通常由透明材料制成。
2. 光栅方程的基本概念光栅方程是描述光栅的衍射效应的数学模型。
在光栅方程中,光栅的周期性结构被用傅里叶级数展开,通过不同级数的叠加来描述光栅衍射的特性。
光栅方程的基本形式如下:dsinθ = mλ其中,d表示光栅的周期,θ表示入射光束与法线的夹角,m表示衍射的级数,λ表示入射光的波长。
3. 光栅方程的推导过程光栅方程可以通过几何光学和衍射光学的理论来推导。
假设入射平行光束通过光栅时发生衍射,我们可以使用几何光学的原理来推导光栅方程。
首先,根据几何光学的原理,我们知道入射光束与法线的夹角等于反射光束与法线的夹角。
因此,入射光束与法线的夹角可以表示为θ。
同时,反射光束也满足绕过衍射光栅的条件,即反射光束的光程差等于相邻条带间距的整数倍。
这可以表示为dsinθ = mλ,其中m表示衍射的级数。
根据光栅的周期性结构,我们可以用傅里叶级数展开光栅的衍射效应,从而得到光栅方程的基本形式。
4. 光栅方程的实际应用光栅方程在实际应用中具有广泛的用途。
首先,光栅方程可以用来计算光栅的衍射效应。
通过确定入射光束的波长和夹角,可以预测和分析光栅衍射图样的特征。
这对于设计和优化光栅结构具有重要意义。
此外,光栅方程也可以用于分光仪和光学显微镜等设备中。
在这些设备中,光栅通常用于分离和分析不同波长的光。
通过根据光栅方程来选择合适的光栅参数,可以实现对入射光的精确谱线分离和测量。
总结光栅方程是描述光栅的衍射效应的数学模型,它可以通过傅里叶级数展开光栅的周期性结构来计算光栅的衍射特性。
第三章 二维图形基础
while(k<=length) {
SetPixel(hdc,x,y,RGB(0,0,0)); x=x+deltx; y=y+delty; k=k+1; Sleep(50); } }
2018/5/11
坚持就是胜利
3 Bresenham直线生成算法
Bresenham直线生成算法是由Bresenham提出的一种精确而有效的 光栅线段生成算法,算法的目标是选择表示直线的最佳光栅位置。 为此,算法根据直线的斜率确定选择变量在X方向上或在Y方向上 每次递增一个单位,另一变量的增量为0或1,它取决于实际直线 与最近网格点位置的距离,这一距离称为误差。算法的构思巧妙, 使得每次只需检查误差项的符号即可确定所选象素。
2018/5/11
坚持就是胜利
3.2.1 圆的参数方程生成算法
圆是图形中经常使用的元素,圆被定义为所有离一中心位置 (xc,yc)距离为给定值R的点集,其函数方程为: (x﹣xc)2﹢(y﹣yc)2﹦R2 利用这个方程,我们可以沿X轴从xc﹣R 到xc﹢R以单位步长计算对 应的y值来得到圆周上每点的位置, 但这并非是生成圆的好方法。
2018/5/11
坚持就是胜利
直线的点斜式方程
y﹦m· x﹢b 其中,m表示直线的斜率,b是y轴截距。给定线段的两个端点 (x1,y1)和(x2,y2),可以计算斜率m和截距b: m﹦(y2﹣y1)/(x2﹣x1) b﹦y1﹣m· x1 对任何沿直线给定的x的增量△x,对应的y增量△y: △y﹦m· △x 同样,对应于y的增量△y,x的增量△x为: △x﹦(1/m)△y
2018/5/11
对于斜率值大于1的 线段,只要交换x和 y之间的规则,即沿 Y方向以单位步长增 加并计算最接近线 段路径的x连续值。 考虑到XY平面各种 八分和四分区域间 的对称性, Bresenham算法对任 意斜率的线段具有 通用性。
光栅图形学算法
光栅图形学算法光栅图形学算法基础其二(裁剪算法)光栅图形学算法的研究内容直线段的扫描转换算法多边形的扫描转换与区域填充算法直线裁剪算法反走样算法消隐算法一、裁剪简述使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的只是图形的一部分。
因此需要确定图形哪些部分落在显示区之内,哪些落在显示区之外。
这个选择的过程就称为裁剪。
常见的裁剪方式有点的裁剪、以及直线段的裁剪。
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个区域。
知识点归纳 计算机图形学中的光栅化与渲染技术
知识点归纳计算机图形学中的光栅化与渲染技术计算机图形学是研究计算机应用中的图像处理和图像生成的学科,涉及到许多核心的知识点和技术。
其中,光栅化和渲染技术是计算机图形学中非常重要的一部分。
本文将对光栅化和渲染技术进行归纳总结,并探讨其在计算机图形学中的应用。
一、光栅化技术光栅化是计算机图形学中一种将连续的几何形状转换为离散的像素图像的技术。
在计算机渲染过程中,光栅化技术起到了至关重要的作用。
1. 点、线、多边形的光栅化在计算机图形学中,最基本的图形形状是点、线和多边形。
光栅化技术可以将这些形状转换为像素点集,从而在屏幕上显示出来。
通过合适的算法,可以准确地计算出像素的坐标和颜色值,从而实现图形的显示和绘制。
2. 光栅化算法光栅化过程中,需要使用各种算法来提高渲染效率和准确性。
常见的光栅化算法包括扫描线算法、中点画线算法、多边形填充算法等。
这些算法根据不同的需求和图形形状,选择合适的计算方法,以实现快速而准确的图形显示。
3. 光栅化与几何变换在对图形进行光栅化之前,常常需要进行几何变换,如平移、旋转、缩放等。
光栅化技术需要能够适应几何变换,并处理变换后的图形数据,以保持图形的形状和结构的准确性。
二、渲染技术渲染技术是计算机图形学中将三维模型转换为二维图像的过程。
通过适当的光照和材质处理,可以使得渲染结果更加真实和逼真。
1. 光照模型光照模型是渲染中的关键要素之一,决定了图像中各部分的明暗和色彩。
常见的光照模型有环境光照、点光源光照、平行光源光照等。
这些模型根据实际光照的物理模型,计算出每个像素点的光强和颜色。
2. 材质和纹理处理在渲染过程中,对于不同的物体材质,需要采用不同的渲染算法来模拟它们的表现方式。
常见的材质特性有反射率、折射率、光滑度等,需要根据不同的材质属性来计算图像的渲染效果。
同时,通过纹理映射技术,还可以将图像贴在物体表面,使得渲染结果更加真实和细致。
3. 光线跟踪光线跟踪是一种高级的渲染技术,它模拟了现实世界中光线的传播和反射路径,能够产生非常真实的渲染效果。
第3章基本图形光栅化ppt课件
dy
t=(yi-1+1)-
dy
dx
*(xi-1+1)
s-t=2* dx *(xi-1+1)-2yБайду номын сангаас-1-1
dx(s-t)=2(xi-1dy-2yi-1dx)+2dydx
3.1.3Bresenham画线算法
令di=dx(s-t), 那么di=2(xi-1dy-2yi-1dx)+2dy-dx di+1=2(xidy-2yidx)+2dy-dx di+1-di=2dy(xi-xi-1)-2dx(yi-yi-1)
如果进一步把算法中2*a改为a+a等等,那么这个 算法不仅只包含整数变量,而且不包含乘除法,适合硬 件实现。
3.1.3 Bresenham画线算法
原理:过各行各列像素中心构造一组虚拟网格线,按直 线从起点到终点的顺序计算直线与各垂直网格线的交点, 然后确定该列像素中与此交点最近的像素。
若s<t,则Si比较靠近理 想直线,应选Si; 若s≥t,则Ti比较靠近理 想直线,应选Ti。
d1=a(x+2)+b(y+0.5)+c =d+a 在d<0的情况下,取右上方像素PT, 判断下一像素应计算
d2=a(x+2)+b(y+1.5) = d+a+b d的初始值d0 = a+0.5b
3.1.2 中点画线法
由于我们使用的只是d的符号,而且d的增量都是 整数,只是其初始值包含小数。因此,我们可以用2d 代替d,来摆脱小数。
dxx,dyy tm ax,x y
dt
dt
取时间步长为1/△t,则可得上述微分方程数
基本光栅图形算法
if Pi>0 则yi+1=yi+1; 否则yi+1=yi;
3、画点(xi+1, yi+1); 4、求下一个误差Pi+1;
if Pi>0 则Pi+1=Pi+2dy-2dx; 否则Pi+1=Pi+2dy;
5、i=i+1; if i<dx+1则转4;否则end
xi1
yi
1,r
xi 1
yi,r
yi,r
1
(xi1 ) 0 (xi1 ) 0
偏差的递推关系
误差
( xi1 ) yi1 yi,r 0.5
因为 yi1 yi m
有 (xi1 ) yi1 yi,r 0.5
yi m yi,r 0.5
yi ( yi1,r
yi
2、
基本光栅图形算法
数学表示的若干方法
1)数学方程 2)点集 3)边界表示 4)关系表示
常用的图形对象
线段 圆 多边形 字符等
一、直线
在光栅显示器的荧光屏上生成一个对象,实质上是往 帧缓存寄存器的相应单元中填入数据。
线段 理想的是无数多的零面积的点构成。 而在实际显示中,在光栅扫描显示器上,线段是
Fk
= tg-tg=
Yk X A YA X k XAXk
偏差计算
可以简化为
Fk Yk X A YA X k
根据 Fk 计算出偏差,然后确定下一步的走向。 初始: X 0 0; Y0 0; 则 F0 =0;
第一步:如果选择X方向,则 X1 X 0 1 1; Y1 0; F1 Y1X A YA X1 0 *7 1*5 5
计算机图形学--基本光栅图形生成算法
– 直线的正负划分性
直线上方点: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
上述处理基于从左端点到右端点, 若处理过程取反,即起始端点在右侧
3第三章 二维图元的基本光栅图形学算法-2
计算机图形学
的像素之集合。如何确定一个点是否在多边形内呢?一般用累
计交点的方法。若从一点发出的射线与多边形边界的交点数目
为奇数,则该点位于多边形内,否则该点位于多边形外。 设 P = P0 P1„Pn P0 为一给定的多边形,序列 P0 P1„Pn P0 是多边形的顶点表示。设 inside(P, x, y) 是验证点 (x, y) 是否在多 边形 P 内的布尔函数。当从 (x, y) 到 (+∞, y) 的射线与 P 的交点
for (x = Screen_xmin; x <= Screen_max; x ++) if (inside(P, x, y)) DrwaPixel (x, y, PolyColor); else DrawPixel(x, y, BkColor);
计算机图形学
逐点判断算法程序简单,但不可取,原因是速度太慢。这 主要是由于该算法割断了各像素点之间的联系,孤立地考察各
yi0 , yi1 ,, yin
计算机图形学
(3.4.1)
(3.4.2)
即:
yik yik 1 , 0 k n 1
这样,当 yik yik1 , 0 k n 1 时,屏幕上位于和两条扫描线之 间的长方形区域(简记为 { yik , yik 1 } )被多边形 P 的边分割成若 干个梯形(三角形看作一底边长为 0 的梯形),它们具有以下 性质:
当扫描线与多边形 P 的边界的交点是 P 的顶点时,则称该 交点为奇点。上述多边形的三种形式的连贯性都是基于这样的
几何事实: 每一条扫描线与多边形 P 的边界的交点个数是偶数
(包括零)。但是,如果把每一奇点简单地记为一个交点,则
2013-8-4 信息科学与技术学院 康宝生 bskang@ 14
计算机图形学第三章
void Bresenhamline (int x0,int y0,int x1, int y1,int color) { int x, y, dx, dy; float k, e; dx = x1-x0, dy = y1- y0, k=dy/dx; e=-0.5, x=x0, y=y0; for (i=0; idx; i++) { drawpixel (x, y, color); x=x+1,e=e+k; if (e0) { y++, e=e-1;} } }
设备级显示算法,考虑运算方式、时间、 次数等细节。
扫描转换直线段
直线的绘制要求:
1.直线要直; 2.直线上的点要准确,即无不定向性和断裂情况; 3.直线的亮度、色泽要均匀; 4.画线的速度要快; 5.要求不同直线可具有不同的色泽、亮度、线型等。
扫描转换直线段
直线基础
我们知道:直线的笛卡儿斜率截距方程为:y=m•x+b
过各行各列象素中心构造一组虚拟网格线。按直线 从起点到终点的顺序计算直线与各垂直网格线的交 点,然后根据误差项的符号确定该列象素中与此交 点最近的象素。
d d d
d
yi 1 yi k ( xi 1 xi ) yi k 设直线方程为: ,其中k=dy/dx。 因为直线的起始点在象素中心,所以误差 项d的初值d0=0。 X下标每增加1,d的值相应递增直线的斜率值k,即d=d+k。 一旦d≥1,就把它减去1,这样保证d在0、1之间。 当d≥0.5时,最接近于当前象素的右上方象素 xi 1 , yi 1 ( ) xi 1 , yi 而当d<0.5时,更接近于右方象素( )。 为方便计算,令e=d-0.5, e的初值为-0.5,增量为k。 当e≥0时,取当前象素(xi,yi)的右上方象素 ( ); xi 1 , yi 1 而当e<0时,更接近于右方象素( xi 1 , yi )。
计算机图形学第3章二维基本图3培训课件
前面介绍的直线和圆都属于线划图,然而,光栅显示的一个 重要特点是能进行面着色,区域填充就是在一个闭合区域内 填充某种颜色或图案。
区域填充一般分两类:多边形填充和种子填充。
一、多边形填充
1、填充条件
多边形的顶点序列(Pi,i=0,1,…,n)、填充色。 2、多边形内点的判别准则
对多边形进行填充,关键是找出多边形内的象素。在顺序 给定多边形顶点坐标的情况下,如何判明一个象素点是处于 多边形的内部还是外部呢?
(a) 多边形
(b) ET表Biblioteka (c) AET表1)合并ET表;2)x递增排序; 3)实施填充;4)删除ymax=yj的边; 5)修改边记录xi=xi+1/m;6)yj+1进入下一轮循环。
四、边相关扫描线填充算法实现
1、根据给定的多边形顶点坐标,建立ET 表。
2、AET表初始化,每个桶置空。
3、for(y=ymin;y<= ymax;y++) { 合并当前扫描线y的ET表;
用来对除水平边外的所有边进行登记,来建立边的记录。边 的记录定义为:
扫描线 y 对应的ET表
第一项:某边的最大y值(ymax)。注意要进行奇异点处理: 对于非极值点应该ymax=ymax-1。 第二项:某边的最小的y对应的x值。 第三项:某边斜率的倒数:1/m。 第四项:指针。用来指向同一条扫描线相交的其它边,如 果其它边不存在,则该项置空。
边的相关性:由于相邻扫描线上的交点是与多边形的边线 相关的。对同一条边,前一条扫描线yi与该边的交点为xi, 而后一条扫描线yi+1=yi+1与该边的交点则为xi+1=xi+1/m, 利用这种相关性可以省去大量的求交运算。见下图(b)所示。
计算机图形学Chapter3-1概述
00
0
10
0.4
21
0.8
31
1.2
42
1.6
52
2.0
注:网格点表示象素中心
Line: P0(0, 0)-- P1(5, 2) 3 2 1
0 12 3 4 5
K=0.4
例:用DDA算法光栅化直线段 p0 (1,1)p1(8,5)
x floor(y+0.5) y
11
1
22
1+4/7
32
1+8/7
43
1+12/7
53
1+16/7
64
1+20/7
74
1+24/7
85
1+28/7
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; for (x=x0, y=y0; xx1;x++) Setpixel (x, floor(y+0.5), color);
在起始像素(x0,y0)的第一个参数d0为:
e0 x(d1 d2 ) x(2k(x0 1) 2y0 2b 1)
2y x
这样,我们已经得到斜率在-1到0之间(从左到 右绘制)的Bresenham画线算法:
1)初始化。 dy=y1-y0,dx=x1-x0,e=-2*dy-dx,delta1=-2*dy,delta2= 2*(-dydx) 。 2)画点(x0,y0)。 3)根据当前最佳像素的判别式e的符号确定下一个象素。 xi+1=xi+1,如果e<0,yi+1=yi,。e=e+delta1。如果e>=0, yi+1=yi-1, e=e+delta2。 3)画点( xi+1, yi+1)。 4)如果x<x1,则转步骤3);否则转5)。 5)结束。
第3章 光栅图形生成算法
颜色(亮度)
监视器
读
CRT控制器
同步信号
《图形学与虚拟环境》
郑州大学信息工程学院
赵新灿
2
3.1 3.2 3.3 3.4 3.5 3.6
直线生成算法 圆生成算法 椭圆生成算法 区域填充算法 字符的生成 反走样技术
《图形学与虚拟环境》
郑州大学信息工程学院
赵新灿
3
3.1 直线生成算法
直线是最基本的图元,曲线由一系列直 线段逼近,复杂图形可看作是由无数直线 段组成的。直线生成质量影响计算机图形 设计的质量。因此,光栅化直线生成算法 必须服从四条原则:直而光滑、端点准确、 亮度均匀、速度快。 生成算法: 逐点比较法、数值微分法、 中点画线法、Bresenham画线算法等。
then steps=abs(x2-x1); /**|k|=<1 **/
else steps=abs(y2-y1); /** |k|>1 **/ dx=(x2-x1)/(float)steps; dy=(y2-y1)/(float)steps; for(i=0;i<steps;i++)
{drawpixel ( int(x+0.5sign(x)),
T Q S M M
S(xi+1,yi)
di≥0,取正右方像素(xi+1=xi+1,yi+1=yi);若再求下一 个直线上的点,得判别式增量形式: di+1=F(xi+2,yi+0.5)=a(xi+2)+b(yi+0.5)+c=di+a (3-5) 式中,d增量为a
《图形学与虚拟环境》 郑州大学信息工程学院 赵新灿 15
光栅图形学资料
为了便于硬件操作,令:
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
优点:
无乘除法(计算坐标时);
在同一坐标上不可能连续停留两次。
增量为a+b
18
6/17/2019
◎确定判断式初值:
设:画线从(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
a y0 y1 b x1 x0 c x0 y1 x1 y0
dd
dd
6/17/2019
②基本算法 假定:直线斜率0<k≤1; 只需考虑x方向每次递增1个单位,
则决定y方向每次递增0或1
B2 (xi 1, yi 1)
记直线与它垂直方向最
近的下光栅点的误差为d
23
Psn (xi , y)
B1 ( xi
,
yi
) T2
( xi
1,
yi
)
d ( y k) yi
令e=d-0.5,e0=-0.5
e<0时,取当前像素(xi,yi)的右方像素(xi+1,yi) e>0时,取当前像素(xi,yi)的右上方像素(xi+1,yi+1) e=0时,可任取上、下光栅点显示
◎当e<0,则xi+1=xi+1,ei+1=ei+k ◎当e≥0,则yi+1=yi+1,ei+1=ei+k-1
基本图形的光栅化算法
基本图形的光栅化算法如何在指定的输出设备上根据坐标描述构造基本⼆维⼏何图形(点、直线、圆、椭圆、多边形域、字符串及其相关属性等)。
图形⽣成的概念图形的⽣成:是在指定的输出设备上,根据坐标描述构造⼆维⼏何图形。
图形的扫描转换:在光栅显⽰器等数字设备上确定⼀个最佳逼近于图形的象素集的过程。
直线段的扫描转换直线的绘制要求(1)直线要直;(2)直线的端点要准确,⽆定向性⽆断裂;(3)直线的亮度、⾊泽要均匀;(4)画线的速度要快;(5)具有不同的⾊泽、亮度、线型等。
解决的问题:给定直线两端点P0(x0,y0)和P1(x1,y1),画出该直线。
逐点⽐较法:数值微分法(DDA法):增量算法直观、易实现不利于⽤硬件实现x(i+1) = x(i) + 1y(i+1) = y(i) + k中点Bresenhan算法:算法原理:根据直线的斜率确定或选择变量在x或y⽅向上每次递增⼀个单位,⽽另⼀⽅向的增量为1或0,它取决于实际直线与相邻象素点的距离,这⼀距离称为误差项。
中点Bresenham算法——算法步骤输⼊直线的两端点P0(x0,y0)和P1(x1,y1)。
计算初始值△x、△y、D=△x-2△y、x=x0、y=y0。
绘制点(x,y)。
判断D的符号。
若D<0,则(x,y)更新为(x+1,y+1),D更新为D+2△x-2△y;否则(x,y)更新为(x+1,y), D更新为D-2△y。
当直线没有画完时,重复上⼀步骤,否则结束。
改进的Bresenhan算法——算法步骤1.输⼊直线的两端点P0(x0,y0)和P1(x1,y1)。
2.计算初始值△x、△y、e=-△x、x=x0、y=y0。
3.绘制点(x,y)。
4.e更新为e+2△y,判断e的符号。
若e>0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2△x;否则(x,y)更新为(x+1,y)。
5.当直线没有画完时,重复步骤3和4。
否则结束。
圆的扫描转换解决的问题:绘出圆⼼在原点,半径为整数R的圆x2+y2=R2。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
y = yik+1
2011-3-3
信息科学与技术学院 康宝生 bskang@
9
Northwest University
计算机图形学
根据这些性质,实际上只要知道该长方形区域内任一梯形 内一点和多边形 P 的内外关系,即可确定长方形区域内所有梯 形和 P 的内外关系。 ② 扫描线的连贯性 设 e 为整数,且 y i0 ≥ e ≥ y in ,若扫描线 y = e 与多边形 P 的 边 Pi -1Pi 相交,其交点横坐标记为 xei。现设
2011-3-3 信息科学与技术学院 康宝生 bskang@ 4
Northwest University
计算机图形学
的像素之集合。如何确定一个点是否在多边形内呢?一般用累 计交点的方法。若从一点发出的射线与多边形边界的交点数目 为奇数,则该点位于多边形内,否则该点位于多边形外。 设 P = P0 P1…Pn P0 为一给定的多边形,序列 P0 P1…Pn P0 是多边形的顶点表示。设 inside(P, x, y) 是验证点 (x, y) 是否在多 边形 P 内的布尔函数。当从 (x, y) 到 (+∞, y) 的射线与 P 的交点 个数是奇数时,该函数取值 1,否则取值 0。设 PolyColor 是多 边形 P 的颜色值,BkColor 为屏幕的背景色。 运用以上的概念,逐点判断算法的程序框架如下:
1 x er = x dr + mr
其中,mr 为边 Pr -1Pr 之斜率。
(3.4.5)
于是,可利用序列 (3.4.4) 计算序列 (3.4.3),即先运用关系式 (3.4.5) 求得同扫描线 y = e 和 y = d 都相交的所有边上的交点, 再求与扫描线 y = d 不相交但与下一条扫描线 y = e 相交的所有 边 Pq -1Pq 上的交点 xeq。
2011-3-3 信息科学与技术学院 康宝生 bskang@ 7
Northwest University
yi0 , yi1 ,⋯ , yin
计算机图形学
(3.4.1) (3.4.2)
即:
yik ≥ yik +1 , 0 ≤ k ≤ n − 1
这样,当 yik > yik+1 , 0≤ k ≤ n−1 时,屏幕上位于和两条扫描线之 间的长方形区域(简记为 { yik , yik +1 } )被多边形 P 的边分割成若 干个梯形(三角形看作一底边长为 0 的梯形),它们具有以下 性质: 梯形的两底边分别在 y = y ik 和 y = y ik +1 两条扫描线上, 腰在多边形 P 的边上或在屏幕的边界上。
Pi +1 处 理 前 处 Pi Pi 后 理 Pi +1
Pi -1
2011-3-3 信息科学与技术学院 康宝生 bskang@
Pi -1
16
Northwest University ⑤ 扫描线算法的数据结构
计算机图形学
为了实现多边形 P 的扫描转换,首先对多边形 P 的顶点的 纵坐标由大到小排序,得到一递减序列:
2011-3-3 信息科学与技术学院 康宝生 bskang@ 3
Northwest University
计算机图形学
用帧缓冲器表示图形,是面着色所需要的图形表示形式。 光栅图形系统的基本问题之一就是把多边形的顶点表示转 换为点阵表示,也就是从多边形的给定边界出发,求出位于其 内部的各像素点,并给帧缓冲器内的各个对应元素设置相应的 灰度和颜色,这一转换称为多边形的扫描转换。 常用的多边形扫描转换算法有逐点判断算法、扫描线算法、 边缘填充算法和边界标志算法。 2. 逐点判断算法 实现多边形扫描转换最简单的方法就是逐点判断,即逐个 像素判断以确定它们是否在多边形内,从而给出位于多边形内
2011-3-3 信息科学与技术学院 康宝生 bskang@ 15
Northwest University
计算机图形学
实际计算时, 可在求交点以前,对多边形顶点中的非极值 点进行预处理。即若 Pi 是非极值点, 则将 Pi -1 Pi 和 Pi Pi+1 两边 中位于扫描线 y = yi 上方的那条边在 Pi 处沿纵向截取一单位长, 如下图所示。这样可保证扫描线 y = yi 只和 Pi -1Pi、Pi Pi+1 两边 中的一边相交,求得一个交点。
Northwest University
计算机图形学
第三章 二维图元 的基本光栅图形学算法(2)
Northwest University
计算机图形学
3.4 多边形的扫描转换与区域填充
在通用图形软件包中有一种称为实心或图案填充的多边形 区域的标准输出图元。也有其他种类的填充区域图元,但由于 多边形有线性边界,所以它更容易处理。 光栅图形系统中有两种基本区域填充方法:一种是通过确 定横穿区域的扫描线的覆盖间隔来填充;另一种是从给定的位 置开始填充直到指定的边界为止。扫描线方法一般主要用来填 充多边形、圆以及其他简单曲线所围的区域。从内点开始的填 充方法用在具有复杂形状边界的区域以及交互式填充系统中。
2011-3-3 信息科学与技术学院 康宝生 bskang@ 12
Northwest University
计算机图形学
当 P 的顶点坐标都是整数时,那么 xeq = xq -1 或 xeq= xq ,然 后把这两部分按递增顺序排列,即得序列 (3.4.3)。 特别,当存在某一整数 k,0 ≤ k ≤ n − 1 ,使得:
2011-3-3 信息科学与技术学院 康宝生 bskang@ 2
Northwest University
计算机图形学
3.4.1 多边形的扫描转换
1. 什么是多边形的扫描转换 在计算机图形学中,多边形的表示有两种方法:顶点表示 和点阵表示。顶点表示是用多边形的顶点序列来表示多边形。 这种方法直观、几何意义强、占用内存少、易于进行几何变换。 但由于它没有明确指出哪些像素点在多边形内,故不能直接用 于面着色。 点阵表示是用位于多边形内的像素点的集合来刻画多边形。 这种表示方法虽然失去了许多重要的几何信息,但便于运
Northwest University 3. 扫描线算法
计算机图形学
扫描线算法是多边形扫描转换的最常用的算法。与逐点判 断算法相比,扫描线算法充分利用了相邻像素之间的连贯性, 避免了对像素的逐点判断和反复求交的运算,达到了减少计算 量和提高速度的目的。 相邻像素之间的连贯性有三种形式:区域的连贯性、扫描 线的连贯性和边的连贯性。 ① 区域的连贯性 设多边形 P 的顶点 Pi = (xi, yi),i=0, 1, …, n 的纵坐标 y 的递 递增序列如下:
2011-3-3 信息科学与技术学院 康宝生 bskang@ 13
Northwest University 于是
计算机图形学
1 xeir = xdjr + (3.4.7) mr 这样,运用公式(3.4.7)可直接由序列(3.4.4)求得序列(3.3.3)。
以上性质称为边的连贯性,它是区域连贯性在相邻两扫描 线上的反映。 ④ 奇点处理
y i0 , y i1 , ⋯ , y in
取 d = yin ,容易求得扫描线 y = d 上的交点序列:
x dj1 , x dj2 , ⋯ , x djh
这一序列由位于扫描线 y = d 上的多边形 P 的顶点组成。 由上述序列开始即可根据多边形的边的连贯性和扫描线的 连贯性, 按从下到上的顺序求得各扫描线的交点序列,并确定各 扫描线上位于多边形 P 内的区段,最后将多边形 P 表示成点阵形
xdj1 , xdj2 ,⋯, xdjh
2011-3-3 信息科学与技术学院 康宝生 bskang@
(3.4.4)
11
Northwest University
计算机图形学
现考察交点序列 (3.4.4) 和 (3.4.3) 之间的关系。若多边形 P 的边 Pr -1Pr 与扫描线 y = e,y = d 都相交,那么序列 (3.4.3) 和 (3.4.4) 中对应元素 xer,xdr 满足下列关系:
2011-3-3 信息科学与技术学院 康宝生 bskang@ 8
Northwest University
计算机图形学
这些梯形可分为两类:一类位于多边形 P 的内部,另一 类位于多边形 P 的外部。 两类梯形在长方形区域 { y ik , y ik +1 } 内相间排列,即相邻的 两个梯形必有一个在 P 内,另一个在 P 外。
Northwest University
计算机图形学
交点个数可能出现奇数;同样,若将每一奇点都简单地记为两 个交点,亦会导致反常的结果。因此,奇点必须按不同的情况 区别对待。 多边形 P 的顶点可分为两类:极值点和非极值点。如果:
(yi−1 − yi )(yi+1 − yi ) <0
则称顶点 Pi (xi , yi) 为 P 的非极值点,否则称为 P 的极值点。 为了在算法中统一处理多边形三种形式的连贯性,使每一 条扫描线与 P 的边界的交点个数保持为偶数,规定当奇点为 P 的 极值点时,该点按两个交点计算,否则按一个交点计算。
yik ≥ e, d ≥ yik +1
(3.4.6)
成立时,则由区域的连贯性可知,序列(3.4.3)和(3.4.4)之 3.4.3 3.4.4 间的关系如下: 两序列元素个数相等,即: l = h; 点 (xeir , e) 与 (xdjr , d) 位于多边形 P 的同一边上,即: ir = jr
计算机图形学
逐点判断算法程序简单,但不可取,原因是速度太慢。这 主要是由于该算法割断了各像素点之间的联系,孤立地考察各 个像素与多边形 P 的内外关系,每次判断又要多次求交点。这 样将需做大量的乘法运算,因此花费很多时间。
2011-3-3 信息科学与技术学院 康宝生 bskang@ 6