计算机图形学第3章-基本光栅图形生成算法
基本光栅图形学算法
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、多边形的扫描转换与区域填充问题是怎样在离散的像素集上表⽰⼀个连续的⼆维图形。
3、多边形有两种重要的表⽰⽅法:(1)顶点表⽰:⽤多边形的定点序列来表⽰多边形优点:直观、⼏何意义强、占内存少、易于进⾏⼏何变换缺点:没有明确指出那些象素在多边形内,故不能直接⽤于上⾊(2)点阵表⽰:是⽤位于多边形内的象素集合来刻画多边形缺点:丢失了许多⼏何信息(eg:边界、顶点等)但是【点阵表⽰是光栅显⽰系统显⽰时所需的表现形式。
】多边形的扫描转换就是把多边形的顶点表⽰转换为点阵表⽰,即从多边形的给定边界出发,求出位于其内部的各个像素,并将帧缓冲器内的各个对应元素设置相应的灰度或颜⾊。
实际上就是多边形内的区域的着⾊过程。
4、多边形分类⼆、X扫描线算法X扫描线算法填充多边形的基本思想是按扫描线顺序,计算扫描线与多边形的相交区间,再⽤要求的颜⾊显⽰这些区间的象素,即完成填充⼯作。
区间的端点可以通过计算扫描线与多边形边界线的交点获得。
如扫描线y=3与多边形的边界相交于4点(2,3)、(4,3)、(7,3)、(9,3)这四个点定义了扫描线从x=2到x=4,从x=7到x=9两个落在多边形内的区间,该区间内像素应取填充⾊。
算法的核⼼是按x递增顺序排列交点的x坐标序列。
由此可得到扫描线算法步骤如下:算法步骤:1.确定多边形所占有的最⼤扫描线数,得到多边形定点的最⼩最⼤值(y min和y max);2.从y min到ymax每次⽤⼀条扫描线进⾏填充;3.对⼀条扫描线填充的过程分为四个步骤:a)求交点;b)把所有交点按递增顺序排序;c)交点配对(第⼀个和第⼆个,第三个和第四个);d)区间填⾊。
基本光栅图形生成技术
假设当前直线上的像素坐标 yi +1 为(xi, yi),那么下一步需要 y 在列xi+1上确定扫描线y的 值。y值要么不变,要么递 yi 增1,可通过比较d1和d2来 决定。
d2
d1 xi xi+1
图3-3 根据误差量来确定理想的像素点
根据误差项d的值来决定是否增1的过程如下:
d1 y yi (k(xi 1) b) yi
d 2 ( yi 1) y yi 1 (k(xi 1) b)
d1 d 2 2k ( xi 1 ) 2 yi 2b 1
设Δ y=y1-y0, Δ x=x1-x0,则k=Δ y/Δ x,代入上式,得:
x(d1 d2 ) 2 y xi 2 x yi c
y R2 x2
该算法每一步均包含浮点乘法和开方运算,且所绘制的像 素间间隔不一,随着x的增加,间隔越来越大。
3.2.2 圆的生成算法
一种消除不等间距的方法是使用极坐标来计算沿圆周的点, 此时,圆使用参数方程来表示:
x r cos y r sin
[0, 4]
该算法使用了三角函数和浮点运算,运算速度仍然很慢。 与直线绘制算法相似,理想的圆绘制算法也是只需作一些简 单的整数和判别运算,常见的有中点画圆法。
其中 c 2y x(2b 1) 是常量,与像素位置无关。
yi +1
y
yi xi
d2 d1
xi+1
令 ei x(d1 d2 )
则ei的计算仅包括整数运算,其符号与(d1-d2)的符号相同。 (1) 当ei < 0时,直线上理想位置与像素 (xi+1,yi)更接近,应 取右方像素; (2) 当ei > 0时,直线上理想位置与像素(xi+1,yi+1)更接近, 应取右上方像素; (3) 当ei = 0时,两个像素与直线上理想位置一样接近,可约定 取(xi+1,yi+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。
计算机图形学——圆的扫描转换(基本光栅图形算法)
计算机图形学——圆的扫描转换(基本光栅图形算法)与直线的⽣成类似,圆弧⽣成算法的好坏直接影响到绘图的效率。
本篇博客将讨论圆弧⽣成的3个主要算法,正负法、Bresenham 法和圆的多边形迫近法,在介绍算法时,只考虑圆⼼在原点,半径为R的情况。
⼀、正负法1、基本原理假设已选取Pi-1为第i-1个像素,则如果Pi-1在圆内,就要向圆外⽅向⾛⼀步;若已在圆外就要向圆内⾛⼀步。
总之,尽量贴近圆的轮廓线。
2、正负法的具体实现1)圆的表⽰:设圆的圆⼼为(0,0),半径为R,则圆的⽅程为:F(x,y)=x2+y2–R2=0当点(x,y)在圆内时,F(x,y)<0。
当点(x,y)在圆外时,F(x,y)>0。
2)实现步骤第1步:x0=0,y0=R第2步:求得Pi(x i,y i)后找点P i+1的原则为:当P i在圆内时(F(xi,yi)≤0),要向右⾛⼀步得P i+1,这是向圆外⽅向⾛去。
取x i+1= x i+1, y i+1= y i当P i在圆外时(F(xi,yi)>0),要向下⾛⼀步得P i+1,这是向圆内⽅向⾛去,取x i+1= x i, y i+1= y i-1⽤来表⽰圆弧的点均在圆弧附近且 F(xi, yi)时正时负假设已经得到点(x i, y i),则容易算出F(x i, y i),即确定了下⼀个点(x i+1, y i+1),则如何计算F(x i+1, y i+1),以确定下下个点(x i+2, y i+2)?分为两种情况:右⾛⼀步后:x i+1=x i+1,y i+1=y i,此时:F(x i+1, y i+1)=x i+12+y i2-R2=x i2+y i2-R2+2x i+1 = F(x i, y i)+2x i+1下⾛⼀步后:x i+1=x i,y i+1=y i-1, 此时:F(x i+1, y i+1)=x i2+(y i-1)2-R2= F(x i, y i)-2y i+1由此可得:确定了F(xi+1, yi+1)之后,即可决定下⼀个点(xi+2, yi+2),选择道理同上。
计算机图形学——区域填充算法(基本光栅图形算法)
计算机图形学——区域填充算法(基本光栅图形算法)⼀、区域填充概念区域:指已经表⽰成点阵形式的填充图形,是象素的集合。
区域填充:将区域内的⼀点(常称【种⼦点】)赋予给定颜⾊,然后将这种颜⾊扩展到整个区域内的过程。
区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种⼦点的颜⾊扩展到区域内的其它点。
1、区域有两种表⽰形式1)内点表⽰:枚举出区域内部的所有象素,内部所有象素着同⼀个颜⾊,边界像素着与内部象素不同的颜⾊。
2)边界表⽰:枚举出区域外部的所有象素,边界上的所有象素着同⼀个颜⾊,内部像素着与边界象素不同的颜⾊。
21)四向连通区域:从区域上⼀点出发可通过【上、下、左、右】四个⽅向移动的组合,在不越出区域的前提下,到达区域内的任意象素。
2)⼋向连通区域:从区域上⼀点出发可通过【上、下、左、右、左上、右上、左下、右下】⼋个⽅向移动的组合,在不越出区域的前提下,到达区域内的任意象素。
⼆、简单种⼦填充算法给定区域G⼀种⼦点(x, y),⾸先判断该点是否是区域内的⼀点,如果是,则将该点填充为新的颜⾊,然后将该点周围的四个点(四连通)或⼋个点(⼋连通)作为新的种⼦点进⾏同样的处理,通过这种扩散完成对整个区域的填充。
这⾥给出⼀个四连通的种⼦填充算法(区域填充递归算法),使⽤【栈结构】来实现原理算法原理如下:种⼦像素⼊栈,当【栈⾮空】时重复如下三步:这⾥给出⼋连通的种⼦填充算法的代码:void flood_fill_8(int[] pixels, int x, int y, int old_color, int new_color){if(x<w&&x>0&&y<h&&y>0){if (pixels[y*w+x]==old_color){pixels[y*w+x]== new_color);flood_fill_8(pixels, x,y+1,old_color,new_color);flood_fill_8(pixels, x,y-1,old_color,new_color);flood_fill_8(pixels, x-1,y,old_color,new_color);flood_fill_8(pixels, x+1,y,old_color,new_color);flood_fill_8(pixels, x+1,y+1,old_color,new_color);flood_fill_8(pixels, x+1,y-1,old_color,new_color);flood_fill_8(pixels, x-1,y+1,old_color,new_color);flood_fill_8(pixels, x-1,y-1,old_color,new_color);}}}简单种⼦填充算法的不⾜a)有些像素会多次⼊栈,降低算法效率,栈结构占空间b)递归执⾏,算法简单,但效率不⾼,区域内每⼀像素都要进/出栈,费时费内存c)改进算法,减少递归次数,提⾼效率三、扫描线种⼦填充算法基本思想从给定的种⼦点开始,填充当前扫描线上种⼦点所在的⼀区段,然后确定与这⼀段相邻的上下两条扫描线上位于区域内的区段(需要填充的区间),从这些区间上各取⼀个种⼦点依次把它们存起来,作为下次填充的种⼦点。
03光栅图形生成算法
点相邻但又不属于该区域的像素组成了边界,不是 内点和边界的像素是外点.
光栅系统有两种区域填充算法:
扫描线填充算法:主要用于填充 多边形、圆、椭圆以及其它简单 曲线所围成的封闭区域。
种子填充算法:适用于具有复杂 形状边界的区域填充。
扫描线填充算法
本章讨论内容
直线生成算法 圆和圆弧的程序设计 区域填充算法 字符生成 反走样技术
圆的生成算法-中点圆生成算法
以单位间隔取样并在每个步长中确 定离指定圆最近的像素位置。
x2+y2-r2=0
对于给定半径r和屏幕中心(xc,yc),
运用平移:先给出计算中心在坐标原
点(0,0)圆的像素位置的算法,然后通 过将xc加到x和yc加到y而把每个计算出 的位置(x,y)移动到其适当的屏幕位置。
直线生成算法
Bresenham直线生成算法
基本原理:沿某一计长方向上,每次变化一个单 位步长,另一方向上的变化量通过计算获得。这 种方法在计算判别式时,计算量很小,生成的直 线光滑,因而应用广泛。
假设直线的斜率在0~1之间,k=△y/ △x,x的变 化率比y的变化率大,约定每次x方向变化一个像 素单位,相应y方向的变化量为0或1个像素单位。
计算判别式: 理论直线上点Q坐标为y= k(xi+1)+b;求s和t:
s=y-yi=k(xi+1)+b-yi; t=(yi+1)-y=(yi+1)-k(xi+1)-b
s-t=2k(xi+1)-2yi+2b-1 由于k=△y/△x, △x=x2-x1,△y=y2-y1,代入上式,得到
基本光栅图形算法
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
计算机图形学基本图形生成算法
y= k· x+b
k=0.571429
b=0.428571
2 X[0]=1 y0 X[1]=2
Y[0]=1 Y[0]=1 Y[1]=kx[1]+b=1.57 Y[1]=y0+k=1.57 Y[2]=y1+k=2.14 Y[2]=kx[2]+b=2.14 Y[3]=y2+k=2.71 Y[3]=kx[3]+b=2.71 Y[4]=y3+k=3.28 Y[4]=kx[4]+b=3.28 Y[5]=y4+k=3.85 Y[5]=kx[5]+b=3.85 Y[6]=y5+k=4.4 Y[6]=kx[6]+b=4.4 Y[7]=5 Y[7]=5
第3章 基本图形生 成算法
1 直线生成算法(DDA、BRES) 2 圆生成算法(Mid) 3 多边形填充算法(扫描线、区域) 4 字符图元算法
2015/4/19
1
图元
• 图元:图形软件包中用了描述各种几何 图形元素的函数称为图形输出原语,简 称图元。 • 描述对象几何要素的输出图元一般称为 几何图元。点的定位和直线段是最简单 的几何图元。 • 在选定坐标系中指定一个图形的几何要 素后,输出图元投影到该输出设备显示 区域对于的二维平面上,并扫描转换到 帧缓存的整数像素位置。
2015/4/19
5
1 直线生成算法(DDA、BRES) 2 圆生成算法(Mid) 3 多边形填充算法(扫描线、区域) 4 字符图元算法
1 直线的DDA算法
2015/4/19
6
OpenGL画点和画线函数 1) 画点函数 glVertex*( ); (*={234}{sifd}[v]) 表示该函数有后缀,指 明空间尺寸、坐标数据类型或向量形式描述。 Ex: glBegin(GL_POINTS); glVertex2i(100,50); glEnd(); glBegin(GL_POINTS); glVertex2i(100,50); glVertex2i(75,90); glVertex2i(300,590); glEnd();
图形学—光栅化算法.ppt
P2
M (Xp+1,Yp+0.5)
P
P1
2020/3/22
Computer Graphics
9.1.2 中点画线法
若d≥0,中点M在直线上方,取正右方象素P1
P2
(Xp+1,Yp)
下一个象素的判别式为:
M
d1=F((Xp+1)+1,Yp+0.5)=a(Xp+2)+b(Yp+0.5)+c
=d+a
x round(y)
0
0
1
0
2
1
3
1
4
2
5
2
y(yi+k)
0 0.4 0.8 1.2 1.6 2.0
2020/3/22
Computer Graphics
9.1.2 中点画线法—基本原理
假定直线斜率k在0-1之间,当前象素点为(xp,yp), 则下一个象素点有两种可选择点P1(xp+1,yp)或P2 (xp+1,yp+1)。若P1与P2的中点(xp+1,yp+0.5)称为M, Q为理想直线与x=xp+1垂线的交点。当M在Q的下方时,则 取P2应为下一个象素点;当M在Q的上方时,则取P1为下
P2
e’
e P P1
P2
e
e’
P
P1
2020/3/22
Computer Graphics
9.1.3 Bresenham算法
为方便与0比较,设e=e-0.5 当e≥0时,最接近P2(xi+1,yi+1),
y方向走一步 当e<0时,最接近P1(xi+1,yi), y
计算机图形学--基本光栅图形生成算法
– 直线的正负划分性
直线上方点: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
上述处理基于从左端点到右端点, 若处理过程取反,即起始端点在右侧
第三章_基本光栅图形生成
d2
Q
d1
y0
N0
x0
x0+1
算法步骤
• |m|<1时的算法 1、输入线段的两个端点,并将左端点存储在(x0, y0) 2、画第一个点 3、计算常量
x、y、2y、2y 2x
和 p0 = 2 y x
pk +1 = pk + 2y( xk +1 xk ) 2x( yk +1 yk )
(-y,x)
(-y,-x)
(y,-x) (-x,-y) (x,-y)
方法1
• X +Y =R Y = ±Sqrt(R2- X 2) 在一定范围内,每给定一 X值,可得一Y值。 当X取整数时,Y须取整。
2 2 2
缺点:浮点运算,开方, 取整,不均匀。
方法2:采用极坐标
x = Rcosθ y = Rsinθ dx =- Rsinθdθ dy = Rcosθdθ xn+1 =x n + dx y n+1 =y n + dy xn+1 = x n + dx = x n - Rsinθdθ =x n - y ndθ y n+1 = y n + dy = y n + Rcosθdθ =y n + x ndθ 显然,确定x,y的初值及dθ值后,即可以增量方式 获得圆周上的坐标,然后取整可得象素坐标。但 要采用浮点运算、乘法运算、取整运算。
这种方法直观,但效率太低,因为每一步需要一次浮点
DDA方法思想
由 yi +1 = mxi +1 + b
= mxi + b + mx
= yi + mx 当x = 1时, yi +1 = yi + m
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章-基本光栅图形生成算法
P4
P3
多边形顶点表示
多边形点阵表示
• 多边形填充就是把多边形的顶点表示转换为点阵表示,即从 多边形的给定边界出发,求出位于其内部的各个像素,并将
多边形的填充
• 填充条件:多边形的顶点序列<Pi,i=0,1,…,n>、填充色.
• 对多边形进行填充,关键是找出多边形内的象素.
• 多边形内点的判别准则
多边形的填充—边缘填充算法
• 算法实现: • 对多边形P的每一非水平边〔i=0,1,…,n〕上的各像素做向右
求反运算即可,见下图,其中<a>为给定的多边形;<b>为对区 域赋初值;<c>,<d>,<e>和<f>表示逐边向右求反.
多边形的填充—边界标志算法
• 基本原理:首先用一种特殊的颜色在帧缓冲器中将多边形 的边界〔水平边的部分边界除外〕勾画出来.然后再把位于 多边形内的各个像素着上所需的颜色
多边形的填充—扫描线算法
•算法步骤
•根据给出的多边形顶点坐标,建立ET表; • 求出顶点坐标中最大y值ymax和最小y值ymin. •初始化AET表指针,使它为空. •使用扫描线的yj值作为循环变量,使其初值为ymin. • 对于循环变量yj的每一整数值,重复作以下事情,直到yj大于ymax,或ET 表与AET表都为空为止: •如果ET表中yj桶非空,则将yj桶中的全部记录合并到AET表中. •对AET表链中的记录按x的大小从小到大排序. •依次取出AET表各记录中的xi坐标值,两两配对填充,即将每对xi之间的 象素填上所要求的颜色. •如果AET表中某记录的ymax=yj,则删除该记录. •对于仍留在AET表中的每个记录,用xi+1/m代替xi进行修改,这就是该 记录的边线与下一条扫描线yj+1的交点. •使yj加1,以便进入下一轮循环.
计算机图形学基本光栅图形算法ppt课件
3.3.2 Bresenham 算法
假设圆心(0,0)为原点, 考虑AB弧的画法,显示一 个整圆时,只要在显示AB 上任一点(x,y)时,同时显 示在圆周上其它七个对称
点 (y,x), (y,-x),(x,-y),(x,-y),
(-y,-x),(-y,x),(-x,y)。
7个对称 点
1、基本原理
void bresenham(Graphics g, int xs, int ys, int xe, int ye)
{ int dx = xe-xs;
int dy = ye-ys; int e = 2*dy-dx; int x = xs;
改进后的 算法程序
int y = ys;
for(int i = 0;i < dx; i++) {
当 F (x i,y i) 0 当 F (x i,y i) 0
算法的程 序ቤተ መጻሕፍቲ ባይዱ现
void pnarc(Graphics g,int radius) { int x,y,f; x = 0; y = 0+radius; f = 0; while (y > 0) { g.drawLine(x, y, x, y); if (f > 0) { f = f – 2*y + 1; y--; } else { f = f + 2*x + 1; x++; } } if(y == 0) g.drawLine(x, y, x, y); }
这样用于表示圆弧的点均在理想 图3.9 对圆弧AB 圆弧附近且时正时负,因此称为 用正负法取点
正负法。由于这种方法每走完一步,都要比较当前位置的 函数值,以决定下一步的走向,因而也称为逐点比较法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 用操作系统的绘图功能 • 如Windows中Win32API中就提供了基本的绘图功能
• 在数学上,理想的直线是一条由无穷多个无限小的连续的 点组成。
• 在光栅显示平面上,我们只能用二维光栅格网上尽可能靠 近这条直线的象素点的集合来表示它。每个象素具有一定 的尺寸,是显示平面上可被访问的最小单位,它的坐标x 和y只能是整数,也就是说相邻象素的坐标值是阶跃的而不 是连续的。
������������ − ������������ = 20
第二步:在x轴方向上每次的变化量为∆������ 变化量为∆������ = ������������−������������ = 0.65
=
������������−������������ ������
=
−1,则y轴方向的
������
• DDA算法描述
• 设(xs,ys)和(xe,ye)分别为直线的起点坐标和终点坐标,则:
直线的斜率
=
∆������ ∆������
=
������������ ������������
− −
������������ ������������
• 可通过计算由x方向的增量 ∆������ 引起y的改变来生成直线。
由������������+1 = ������������ + ∆������,得到:
������������+1
=
������������
+
������ ������
×
∆������
=
������������
+
������������ ������������
− −
������������ ������������
=
������������+1
−
������������,������+ ������������,������+1 2
=
������������+1
−
������������,������
−
1 2
• 当������(������������+1) ≥ 0时,������������+1,������ = ������������,������ + 1,即选C点
第三步:循环计算点的坐标,并取整显示:
• Bresenham算法基本思想
•
令������
=
Δ������,直线方程:������
������
=
������
������
− ������������
+ ������������,其中
(������������, ������������)为起点坐标;
• DDA算法特点
算法简单,实现容易,但计算量较大,每产生一个像素 需要取整运算,此外算法还要除法运算,因此生成直线的 速度较慢。
例题1:已知起点A(16,-5)和终点B(-4,8),用DDA法在A和B之间 生成一段直线。
第一步:计算初值:������������ − ������������ = −4 − 16 = −20,������������ − ������������ = 8 − −5 = 13,由于20 > 13,所以选定x轴方向作为步进方向;������ =
• 直线生成算法
• DDA方法 • Bresenham算法
• 圆弧生成算法
• 中点圆生成算法
• 多边形的填充
• 多边形表示方法 • 多边形填充的扫描线算法 • 边缘填充算法 • 边界标志算法
• 区域填充
• 区域的基本概念 • 简单种子填充算法 • 扫描线种子填充算法
• 光栅图形的反走样算法
• 用现有绘图软件系统 • 画图\Word中的图文编辑工具\AutoCAD\Photoshop 等大型绘图软件
−
(������������,������
• 考虑0 ≤ ������ ≤ 1,则x方向增加1,y方向增加m,由起点
(xs,ys)可求得直线上的点(xi,yi), i=1,2,3,…, 其中 x1= xs, y1= ys;
• 用坐标为(xi,round(yi))的象素来表示直线上的点,其中 round(yi)表示最靠近y的整数;
• Bresenham算法基本思想
• 令yi,r=round(yi), 用坐标为(xi,yi,r)的象素来表示直线上的点, 第i+1个点只能在C和D中选取。
• 令误差项������ ������������+1
=
������������+1
−
������������
=
������������+1
−
������������+������������ 2
∆������
• 同样,可通过计算由y方向的增量∆������引起x的改变来生
成直线。由������������+1 = ������������ + ∆������,得到:
������������+1
=
������������
+
������ ������
×
∆������
=
������������
������������+2
−
������������+1,������
−
1 2
=
(������������+1+������)
−
������������=
൞
������������+1 + ������
−
������������,������
−
1 2
������������+1 + ������
• 当������(������������+1) < 0时,������������+1,������ = ������������,������,即选D点
• Bresenham算法基本思想
• ������(������������+2)的递推公式
• ������ ������������+2
=
+
������������ ������������
− −
������������ ������������
∆������
• DDA算法基本思想
选定 ������������ − ������������ 和 ������������ − ������������ 中较大者作为步进方向,在此方 向上每次增加(或者减少)一个像素,然后计算另一个方 向上增量的值,把每次计算出的值经取整后顺序输出到显 示器,则可以得到光栅化的直线。