计算机图形学——基本图形生成算法
广工数媒计算机图形学之5基本图形生成算法-多边形扫描转换及区域填充
计算机图形学基础:基本图形生成算法——多边形扫描转换及区域填充 多边形扫描转换——x-扫描线算法 x-扫描线算法填充多边形基本思路:
扫描线与x轴平行。按照扫描顺序,计算每一条扫描线与多边 形的相交区间,用指定颜色显示区间内的像素。区间的端点 可以通过计算扫描线与多边形边界线的交点获得。 x-扫描线算法可以填充凸、凹多边形,也可填充中间有空的 多边形。
广东工业大学机电学院图学与数字媒体工程系
计算机图形学基础:基本图形生成算法——多边形扫描转换及区域填充
多边形扫描转换——x-扫描线算法
x-扫描线算法涉及的问题: 一、扫描线与多边形边界交点的 有效性判别; 扫描线y=5与AB边有无效交点k, 在做求交运算之前,判断该扫 描线的y坐标不在点A和点B的y 坐标之间,不做求交运算。
广东工业大学机电学院图学与数字媒体工程系
计算机图形学基础:基本图形生成算法——多边形扫描转换及区域填充
区域填充——边界填充算法
栈结构实现4-连通边界填充算法步骤: (1)种子像素入栈; (2)栈顶象素出栈; (3)将出栈象素置成填充色; (4)检查出栈象素的4-邻接点,若其中某个象素点不是边 界色且未置成多边形色,则把该象素入栈。 (5)检查栈是否为空,若非空,则执行步骤(2),若为 空,则结束。 4-连通边界填充.SWF
广东工业大学机电学院图学与数字媒体工程系
计算机图形学基础:基本图形生成算法——多边形扫描转换及区域填充 填充算法——边缘填充算法
“边缘填充算法的过程.SWF”演示了边缘填充算法的实现过 程。 该算法的优点是简单,缺点是对于复杂图形,每一像素可 能要访问多次,效率降低。
广东工业大学机电学院图学与数字媒体工程系
计算机图形学第3章 基本图形生成算法
例题:有点P0(4,3);P1(6,5);P2(10,
6 );P3(12,4),用以上4点构造2次B样条曲线。
2.1.7 非均匀有理B样条
非均匀有理B样条NURBS(Non Uniform Rational BSpline);
3.2.2
Bresenham画圆法
该算法是最有效的算法之一。
不失一般性,假设圆心(xc,yc) ,圆上的点(x′,y′),则:
x' x xc
y ' y yc
圆心为原点,半径为R的位于第一象限1/8圆弧的画法,即(0, R)~( R , R )。
2 2
yi ), 思想:每一步都选择一个距离理想圆周最近的点P( xi , 使其误差项最小。
画其他曲线。
3.3
自由曲线的生成
正弦函数曲线
指数函数曲线
多项式函数曲线
自 由 曲 线
概率分布曲线及样条函数曲线
3.3.1 曲线的基本理论
基本概念
2.1.4
规则曲线:可用数学方程式表示出来的,如抛物 线等。
自由曲线:很难用一个数学方程式描述的,如高
速公路等。可通过曲线拟合(插值、逼近)的方法来
例题: 利用Bresenham算法生成P (0,0)到Q(6,5)的直 线所经过的像素点。要求先 列出计算式算出各点的坐标 值,然后在方格中标出各点。
(1,1)
3.1.5 双步画线法 原理
模式1:当右像素位于右下角时,中间像素位于底线 模式4:当右边像素位右上角时,中间像素位于中线 模式2和模式3:当右像素位于中线时,中间像素可能位于底线 上,也可能位于中线上,分别对应于模式2和模式3,需进一步 判断。 当0≤k≤1/2时,模式4不可能出现,当1/2≤k≤1时,模式1不 可能出现。
计算机图形学基本图形生成法算法原理课件资料
区域填充的过程(2W)、扫描线填充的基本过程,两个问 题、两个连贯性、有序边(表)、活化边(表)、边的结 构、判断顺序.
二、种子填充算法
❖多边形表示方法
✓顶点表示 ✓点阵表示
顶点表示:用多边形顶点的序列来刻划多边形 特点:直观、几何意义强、占内存少;不能直接用于面
ee20
45 432/4 5-/14 ∧
e2
5 43/4 5/4 ∧
活化边表的建立 有序边表
8^ 7^ 6^ 5^ 4^ 3^ 2^
1^
0^
e5
10 7 -5/3
e3
11 12 0 ∧
e4
11 7 5/4 ∧
10 2 0 ∧
e6 e0
4 5 -1
e2
5 7 5/4 ∧
活化边表
Y=4
10
Y=5
10
e6
(3)按从下到上的顺序对纵坐标值为y的扫描线(当前扫描 线)执行下列步骤,直到有序边表ET和活化边表AEL都 变成空为止.
a)如有序边表ET中的第y类元素非空,则将属于该类的所有 边从ET中取出并插入第y类扫描线的活化边表中,AEL中 的各边按照x值(当x值相等时,按Δx值)递增方向排序. 边的增加和排序
着色;广泛应用于各种几何造型系统; 点阵表示:用位于多边形内的象素的集合来刻划多边形 特点:失去了许多重要的几何信息(边界、顶点等);
易于面着色;光栅显示系统显示时所需的表示形式;
❖光栅系统中两种基本的区域填充算法
✓针对采用顶点表示的多边形
通过确定横越区域的扫描线的覆盖间隔来填充 的多边形扫描转换区域填充算法,主要填充简单多 边形、圆、椭圆以及其它简单的曲线. ——扫描线填充算法 ✓针对采用点阵表示的多边形
计算机图形学ppt课件 第二章基本图形的生成与计算
for (x=x0; xx1, x++) drawpixel (x, int(y+0.5), color); y=y+k;
例:画直线段P0(0,0)--P1(5,2)
int(y+0.5) 0 0 1 1 2 2 y+0.5 0+0.5 0.4+0.5 0.8+0.5 1.2+0.5 1.6+0.5 2.0+0.5
角度DDA法
显然,确定x,y的初值及d值后,即可以增量方 式获得圆周上的坐标,然后取整可得象素坐标。 但要采用浮点运算、乘法运算、取整运算。
中点画圆法
利用圆的对称性,只须讨论1/8圆。第二个8分 圆 P(Xp ,Yp )
P1
M P2
P为当前点亮象素,那么,下一个点亮的象素可 能是P1(Xp+1,Yp)或P2(Xp +1,Yp +1)。
pi 2 xi dy 2 yi dx 2dy (2b 1)dx
(2.4)
在1a象限内,dx总大于0,所以pi可以判断d1d2的符号。Pi+1为
pi 1 2 xi 1dy (2 yi 1 2 yi 2 yi )dx 2dy (2b 1)dx
2( xi 1)dy (2 yi 1 2 yi 2 yi )dx 2dy (2b 1)dx
本算法是Bresenham在1965年提出。
设直线起点(x1,y1)终点(x2,y2),直 线可表示为 y mx b
y2 y1 dy b y1 m x1 , m x2 x1 dx
此处讨论先将直线方向限于1a象限,当
xi 1 xi 1
计算机地图制图原理与方法基本图形生成算法
该程序如何改进, 提高效率?
while(x<y){
setpixel(x,y);
if(d<0){
d+ = 2*x+3; x++
}
else{
d+ = 2*(x-y) + 5;
x++;y--;
}
}
}
整理课件
28
Bresenham画圆算法
讨论、圆的中点算法与Bresenham算法是否一致?
整理课件
29
椭圆的生成算法
内存 插槽
D/A转换:图形显示
整理课件
2
整理课件
3
基本图形的生成
几何图形G={Pi | Pi 最接近图形的象素 } 基本图形的生成算法任务之一就是找出所有的Pi .
点表示为象素(Pixel),对应于显存地址单元 读写某一象素是硬件设备提供的最基本功能 一维图形,由一个象素宽的直线或曲线表示 二维图形由确定区域的象素表示 线图元的扫描转换是基本图形生算法的基础;
整理课件
6
画直线的DDA算法
8
从起点开始朝终点方向
7
画点(x, y)
6
前未 5
四4
舍 五
3
入2
1 起点0
在x轴或y轴上走一个单位
终 点
长(沿x轴还是y轴取决于
直线的倾斜角)
由直线的倾斜程度(斜率 或斜率的倒数)决定另一 坐标的增量,获得下一点 的座标
将x或y四舍五入,得(x, y)
0 1 2 3 4 5 6 7 8 9 若(x, y)不是终点则继续
y=y+k;
}
缺点:
}
浮点运算、取整--》废时,且不利于硬件实现。
计算机图形学中的基本图形生成算法--文献综述
本文中研究的一维图形的算法主要包括直线段、圆与椭圆。
在使用计算机处理相应图形信息时经常会遇到计算机内部储存比较大的图形,以至于屏幕显示图形只是部分图形,不能完整显示。这个时候确定图形中哪些部分在显示区域中显示,而哪些不在显示区域内显示则对计算机的选择处理过程提出了要求,遇到这种情况就要运用裁剪操作,从线段裁剪到多边形裁剪有许多方法,其中主要的方法有:Cohen-Sutherland裁剪算法、中点分割算法、参数化方法和Reentrant Polygon Clipping算法。在王慧玲、冯雪花发表于《伊犁师范学院学报(自然科学版)》2008年第4期上的《对Cohen-Sutherland线段裁剪算法的分析及改进》一文中则针对上述方法中的Cohen-Sutherland线段裁剪算法提出了重点分析,首先,作者对Cohen-Sutherland线段裁剪算法提出了详细的解析:该算法运用编码的方法实现了对在显示区域内和显示区域外的判断来决定是否显示在在显示区域内显示,与此同时,这篇文章中除了研究和分析Cohen-Sutherland线段裁剪算法,还针对Cohen-Sutherland线段裁剪算法对判断所有的完全位于裁剪窗口之外的线段不能有效地情况下提出了可以通过添加判断条件,使之能完全判断出来,这使得减少了求交的次数,也提高得该算法的运算效率。关于中点分割法和参数化方法孙家广等在《计算机图形学(第3版)》一书中进行了阐述,中点分割法与Cohen-Sutherland线段裁剪算法相同点是利用对线段的端点编码,与之不同的是对于跨窗口边界的线段中点分割法将其等分为两段,直到最后的分割点与线段的端点距离达到分辨率的精度为止。多边形的裁剪与线段的裁剪不一样,如若把多边形分解成边界线段逐段进行裁剪会使得原来封闭的图形变得不封闭或者成为一些离散的线段。Suther-land和Hodgeman发明的逐次多边形裁剪(Reentrant Polygon Clipping)算法则解决了上面这个问题,该方法的基本思想是一次用裁剪窗口的一条边对多边形进行裁剪。上面对线段和多边形的裁剪的基本算法进行了一些介绍,在上面一些算法的基础上,韩俊卿,葛永慧和张东升在《太原理工大学学报》2005年第36卷第2期上面发表的《多边形窗口的矢量图形裁剪算法》一文则讨论了对于改进后的多边形窗口中的点、线、面等目标的裁剪算法,在这些算法之中,点目标的裁剪算法采用的是射线交叉法,线目标的裁剪算法采用的是通过对计算被裁剪线段和多边形的各个边真实交点之间的各个线段中点来判断是否对它们裁剪,在点和线的裁剪基础上实现面目标的裁剪。
基本图形生成算法
的A、B、C 处就会发现错判现象。
例如,在 A处,扫描线通过一点 后以为进入多边形,其实此时已出 多边形。结果是在A点之后的扫描线段上全都错误地填上 色。在B和C处,因为光栅化后,使得扫描线通过交点的 个数发生变化而同样导致填色错误。
区域填充算法:
因此,原始的奇偶判断方法需要加以周密地改善, 才能成为计算机中实用的填色算法。
填色算法分为两大类:
(1)扫描线填色(Scan-Line Filling)算法。
对应的像素集,并有指定的属性或图案显示之,即区域
填充。 光栅化和扫描转换是光栅图形学的基本问题,其算 法的好坏对系统的效率有直接关系。
直线的生成算法
在数学上,理想的直线是没有宽度的、由无数
个点构成的集合。
当对直线进行光栅化时,人们只能在显示器所
给定的有限个象素组成的矩阵中,确定最佳逼近于
该直线的一组象素,并且按扫描线顺序,用当前写
对于直线斜率k在0~1之间的情况,从给定线段的
左端点P0(x0,y0)开始,逐步处理每个后续列x位置,并
在扫描线y值最接近线段的像素上绘出一点。 假设当前直线上的像素已确定,其坐标为(x,y), 那么下一步需要在列xi+1上确定扫描线y的值。y值要 么不变,要么递增1,可通过比较d1和d2来确定。
直线的生成算法
d2=(yi+1)-y =yi+1-(k(xi+1)+b) 那么:d1- d2 = 2k(xi+1)-2yi + 2b-1 设Δ y=y1-y0 和Δ x=x1-x0 ,则 k=Δ y/Δ x,代人上式, 得:Δ x(d1- d2)= 2·Δ y·xi- 2·Δ x· yi + c
其中, c是常量,c= 2Δ y +Δ x(2b-1),与像素位置无关。
计算机图形学_基本算法
应不同的设备。
12
返回
2
Ø曲线也可由直线段逼近生成 Ø解决的问题:给定直线两端点P0(x0,y0)
和P1(x1,y1),画出该直线。 主要步骤可以表示如下:
13
初值
偏差判别
移动绘图 偏差计算
终点 判断
N
Y 结束
图2-2 一般线段绘制过程的主要步骤示意图
• 偏差判别:根据当前绘图点位置与理想位置的偏差情况,确定
在不考虑线宽时,一维图形的扫描转 换主要是确定一维的像素序列,二维图 形的扫描转换是确定平面区域所对应的 像素集(称为区域填充)。
5
Ø 一般微机系统板上都配有图形显示缓冲区,
为了快速、及时地控制图形的输出,系统在基
本内存中开辟了从
A0000H ~ CFFFFH的256K字节
甚至到FFFFFH的512K字节
29
返回
因递推公式: Xi+1=Xi+1 yi+1 = kxi+1+b= k1xi+b+k∆x= yi+k∆x
所以:当 ∆x =1; yi+1 = yi+k。 即当x每递增1,y递增k(即直线斜率)
y
yi+1
计算机图形学基本图形生成算法
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();
计算机图形学第3章
第3章 基本图形生成算法
3.1 生成直线的常用算法
均假定所画直线的斜率k∈[0,1]。
3.1.1 DDA画线算法
DDA(Digital Differential Analyzer)画线 算法也称数值微分法,是一种增量算法。它的算 法实质是用数值方法解微分方程,通过同时对x和 y各增加一个小增量,计算下一步的x、y值。
边界表示的四连通区域种子填充算法 内点表示的四连通区域种子填充算法 边界表示的八连通区域种子填充算法 内点表示的八连通区域种子填充算法
第3章 基本图形生成算法
1.边界表示的四连通区域种子填充算法
基本思想:从多边形内部任一点(像素)出发,依“左 上右下”顺序判断相邻像素,若其不是边界像素且没有被填 充过,对其填充,并重复上述过程,直到所有像素填充完毕。 可以使用栈结构来实现该算法,算法的执行步骤如下: 种子像素入栈,当栈非空时,重复执行如下三步操作: (1)栈顶像素出栈; (2)将出栈像素置成多边形填充的颜色; (3)按左、上、右、下的顺序检查与出栈像素相邻的 四个像素,若其中某个像素不在边界上且未置成多边形色, 则把该像素入栈。
过各行各列像素中心构造一组虚拟网格线,按直 线从起点到终点的顺序计算直线与各垂直网格线的交 点,然后确定该列像素中与此交点最近的像素。 由图3-5不难看出:若s<t, 则Si比较靠近理想直线,应 选Si;若s≥t,则Ti比较靠近 理想直线,应选Ti。
第3章 基本图形生成算法
令dx=x2-x1,dy=y2-y1 递推公式 :di 1 di 2dy 2dx( yi yi 1 ) di的初值: d1 2dy dx 当di≥0时,选Ti,
第3章 基本图形生成算法
计算机图形学-基本图形生成算法-图形的扫描转换
v 当i>0时,D在圆外,③④
Pi(xi,yi) H (xi+1,yi
)
v v
情形③,选mv ,mD d’=mD - mV =|(xi+1)2+(yi-1)2-R2
中最小者 ④ V③ | - |xi2+(yi-1)2-R2|(xi,yi-1)
D
(xi+1,yi-1)
=(xi+1)2+(yi-1)2-R2 + xi2+(yi-1)2-R2
v 构造一个行列式值为1的矩阵
v 对应的圆方程递推关系为 xn+1 = xn + єyn yn+1 = -єxn +(1-є2)yn= yn- єxn+1
DDA画圆法(3/3)
v 针对不同象限及顺逆时针画圆,赋给є适当的 符号
v є不同,圆形状不同, є大近似椭圆
Bresenham画圆算法(1/7)
v 三个常用算法:
1数值微分法(DDA) 2中点画线法 3Bresenham算法。
数值微分(DDA)法(1/5)
v 已知线段端点:P0(x0,y0), P1(x1,y1) v 直线方程
y=kx+b {(xi, yi)}, i=0,….n. v 浮点数取整 : yi=round(yi)=(int)(yi+0.5)
Bresenham画线算法(3/11)
v最大位移方向每次走一步
k<1时,x为最大位移方向
vy方向走步与否
P2
e’
取决于误差e值的大小
v误差计算
e P P1
v初值:e0= y/ x
v当e≥0.5时,最接近P2(xi+1,yi+1)
计算机图形学教案第5章基本图形生成算法
曲面生成算法
参数曲面
通过参数方程表示曲面的几何形状,通过迭 代或数值方法计算出曲面上的点,然后连接 这些点形成曲面。
网格曲面
将曲面分割成网格形式,利用离散的点表示网格顶 点,然后连接这些顶点形成曲面。
隐式曲面
通过一系列方程定义曲面的几何形状,求解 这些方程得到曲面上的一系列点,然后连接 这些点形成曲面。
对于复杂的多边形或不规则形状,可能会出现填充不准确或过度填充的情况。
05
其他基本图形生成算法
椭圆生成算法
参数方程法
通过参数方程表示椭圆的几何形状,通过迭代或数值方法计算出椭 圆上的点,然后连接这些点形成椭圆。
中心点法
以椭圆中心为中心,根据椭圆的长短轴半径和旋转角度,计算出椭 圆上的一系列点,然后连接这些点形成椭圆。
THANK YOU
感谢聆听
03
圆生成算法
圆生成算法的原理
圆上取点
通过在圆周上等距离取点,并将这些点连接起来形成 多边形,最终将多边形平滑过渡成圆形。
参数方程法
利用圆的参数方程,通过计算角度和半径来获取圆上 的点。
中点圆算法
利用中点坐标和半径计算圆上的点,通过迭代的方式 逐步逼近圆周。
圆生成算法的实现
使用数学库
利用数学库中的函数来计算圆的参数方程, 获取圆上的点。
两点式方程
给定直线上的两个点,可以推导出直线的两点式方程 。
直线生成算法的实现
参数化方程
将直线上任意点的坐标示为 参数方程的形式。
参数值计算
根据起点和终点坐标,计算参 数值。
绘制点
根据参数值,在屏幕上绘制对 应的点。
直线生成算法的优缺点
优点
简单易实现,适用于各种类型的直线 。
《计算机图形学》02 基本图形生成
例2 (1,1)-(9,6)直线的点阵
10 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 10
例3 (1,1)-(6,9)直线的点阵
10 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 3)-(8,7)直线的点阵
-4
-3
-2
-1
0
1
2
3
4
5
作业: 作业: (1)对圆心为原点,半径为7的圆,生成其1/8圆弧段上的点。 (2)写出完整的Bresenham画圆算法计算步骤(圆心为(x0,y0),半径 为r,生成圆周上的全部点) (3)对圆心为(2,5),半径为6的圆,生成全部圆周点。 (4)写出Bresenham算法完整的画圆程序: DrawCricle(int x0,int y0,int r)
(2,2)-(5,7)直线的点阵
10 9 8 7 6 5 4 3 2 1 0
0
1
2
3
4
5
6
7
8
9
10
作业: 作业: (1)用Bresenham算法生成 4),(8, 8)之间的直线。写出计算过 用 算法生成(2, , 之间的直线。 算法生成 之间的直线 程并画出点阵图。 程并画出点阵图。 (2)用Bresenham算法生成 2),(7, 8)之间的直线。写出计算过 用 算法生成(3, , 之间的直线。 算法生成 之间的直线 程并画出点阵图。 程并画出点阵图。 (3)写出陡峭向上的 写出陡峭向上的Bresenham画线函数 画线函数void DrawLine2(…)。 写出陡峭向上的 画线函数 。 (4)写出陡峭向下的 写出陡峭向下的Bresenham画线算法的计算步骤。 画线算法的计算步骤。 写出陡峭向下的 画线算法的计算步骤
计算机图形学 第二章基本图形的生成与计算
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
3
2 1 0 -3 32 1 3 4 3 1 -1
54 2 5
2 1
0 12 3 4 5
整理课件
直线的Bresenham算法
本算法是Bresenham在1965年提出。 设直线起点(x1,y1)终点(x2,y2),直 线可表示为 ymxb
整理课件
图形的扫描转换(光栅化):确定一个像素集合, 用于显示一个图形的过程。步骤如下: 1、确定有关像素 2、用图形的颜色或其它属性,对像素进行写操 作。 对一维图形,不考虑线宽,则用一个像素宽的直 线来显示图形。二维图形的光栅化,即区域的填 充:确定像素集,填色或图案。 任何图形的光栅化,必须显示在一个窗口内,否 则不予显示。即确定一个图形的哪些部分在窗口 内,哪些在窗口外,即裁剪。
Dy
1a True 1b False 2a Ture 2b False
1
m
1/m 1
-1
m
-1/m 1
3a True 3b False 4a Ture 4b False
-1
-m
-1/m -1
1
-m
1/m -1
表2.1
整理课件
研究表2.1的数据,可以得到如下规律:
1、当|dx|>|dy|时
|Dx|=1 ,|Dy|=m
by1mx1,my x2 2 xy1 1d dy x
此处讨论先将直线方向限于1a象限,当
整理课件
xi1 xi 1
而y的相应增加值应当小于1。为了光栅化,y i1 只能选择图2.2中两种位置之一
基本图形生成算法原理
基本图形生成算法原理现在的计算机能够生成各种复杂的图形,但无论其多么复杂,它都是由一些基本图形组合而成的。
因此,学习基本图形的生成算法是掌握计算机图形的基础。
本章就主要讨论一些基本图形的生成原理,如点、直线、椭圆生成。
如前面所述,目前我们使用的主要图形输出设备显示器(一般为光栅图形显示器)和打印机(喷墨、激光打印机)本质上是一种画点设备,是由一定数量的网络状细小光点(即像素)组成,使某些像素亮(将帧缓存中对应位置的值为1)和某些像素不亮(将帧缓存中对应位置的值为0)来显示图形。
因此,基本图形生成的原理是指在点阵输出设备的情况下,如何尽可能地输出最接近于原图形(理想图形)的直线或曲线图形,即以最快的速度确定最佳逼近于图形的像素集。
确定图形的像素集合并显示的过程常称之为图形的扫描转换或光栅化。
这一过程使用的计算方法称之为图形生成算法。
1 点2 直线段的生成直线是点的集合,几何学中的一条直线是由两点决定,直线在数学上可以有多种表示方法,而在计算机图形学里,直线是由离散的像素点逼近理想直线段的点的集合。
数学上的直线是没有宽度的,而计算机图形学中显示出的直线的宽度与像素点的大小有关,一个像素宽的直线的线粗为像素的边长。
由计算机生成的图形中有大量的直线段,而且曲线也是由一系列短直线段逼近生成的。
因此,研究直线生成的方法是计算机图形学的基本问题之一。
对计算机生成直线的一般要求是:线段端点的位置要准确;构成线段的像素点的集合应尽可能分布均匀,其密度应该与线段的方向及长度无关;线段生成的速度要快。
生成直线的算法有多种,这里仅介绍两种方法,即DDA 算法和Bresenham 算法。
2.1 直线DDA 算法该直线生成算法称为数值微分算法(Digital Differential Analyzer 简称DDA )。
它是一种根据直线的微分方程来产生直线的方法。
设直线的起点坐标为),(s s y x ,终点坐标为),(e e y x ,则=dx dy k xy x x y y s e s e =∆∆=-- (3-1)k 是直线的斜率。
第2章基本图形生成算法
if (Flag) { //X方向单位增量
for (n=0; n<= Length; n++) {//X方向插补过程
WritePixel(ix, Round(y), value); ix+=idx; y+=dy; } //End of for } //End of if else { //Y方向斜率增量
第 2 章 基本图形生成算法(Ⅰ)
1) Bresenham的基本原理
假定直线斜率 k在 0~1之间 。 此时 , 只需考
虑 x方向每次递增 1个单位 , 决定 y方向每次 递增 0或 1。
设直线的
当前点为 (xi,y) 当前光栅点为 (xi,yi)
下一个
直线的点应为 (xi+1,y+k) 直线的光栅点
y
y 2
y1
k
x x2 x1
第 2 章 基本图形生成算法(Ⅰ)
1)David F. Rogers 描述描述
如果已知第 i点的坐标 , 可用步长 StepX 和 StepY得到
第 i+1点的坐标为 : – xi+1=xi+ StepX – yi+1=yi+ StepY 或 yi+1=yi+ k * StepX
Bresenham算法
– 基本原理 – Bresenham算法 – 整数 Bresenham算法 – 一般整数 Bresenham算法
第 2 章 基本图形生成算法(Ⅰ)
2.1.1 DDA算法算法
1)David F. Rogers 描述描述
直线的基本微分方程是 :
dy dx = 常数 (k)
设直线通过点 P1(x1,y1)和P2(x2,y2) , 则直线方程可表示为 :
基本图形生成算法
2019/2/12
22
改进2:用2e△x来替换e e初=-△x, 每走一步有e=e+2△y。 if (e>0) then e=e-2△x
2019/2/12
图5-1
2019/2/12
用一系列的象素点来逼近直线
2
5.1 直线的扫描转换
直线的绘制要求:
1.直线要直 2.直线的端点要准确,即无定向性和断裂情况 3.直线的亮度、色泽要均匀 4.画线的速度要快 5.要求直线具有不同的色泽、亮度、线型等
2019/2/12
3
解决的问题:
给定直线两端点P0(x0,y0)和P1(x1,y1),画出该直线。
2019/2/12 16
改进:用2d△x代替d
1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。 2.计算初始值△x、△y、d=△x-2△y、x=x0、y=y0。 3.绘制点(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。 4.当直线没有画完时,重复步骤3。否则结束。 程序
x 0, R
2 2 i 1
2
(5 - 7)
29
yi1 round( R x )
2019/2/12
圆的极坐标方程为:
x R cos y R sin
i1 i (为一固定角度步长 ) xi 1 round( R cos i1 ) yi1 round( R sin i 1 )
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
23
算法步骤:
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)。
xi
xi+1 xi+2
(a) d<=0的情况
( xi 1) ( yi 0.5) R 2 xi 3 d 2 xi 3
2013-7-17 34
d>0:
yi
P
yi-1 yi-2
d F ( xi 2, yi 1.5) ( xi 2) ( yi 1.5) R
第5章 基本图形生成算法
• 提出问题
如何在指定的输出设备上根据坐标描述构造基
本二维几何图形(点、直线、圆、椭圆、多边
形域、字符串及其相关属性等)。
2013-7-17
1
图形的生成:是在指定的输出设备上,根据坐标描述
构造二维几何图形。
图形的扫描转换:在光栅显示器等数字设备上确定一
个最佳逼近于图形的象素集的过程。
2013-7-17
15
0≤k≤1时Bresenham算法的算法步骤为:
1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。
2.计算初始值△x、△y、d=0.5-k、x=x0、y=y0;
3.绘制点(x,y)。判断d的符号; 若d<0,则(x,y)更新为(x+1,y+1),d更新为d+1-k; 否则(x,y)更新为(x+1,y),d更新为d-k。 4.当直线没有画完时,重复步骤3。否则结束。
该直线方程将平面分为三个区域: • 对于直线上的点,F(x,y)=0;
• 对于直线上方的点,F(x,y)>0;
• 对于直线下方的点,F(x,y)<0。
2013-7-17 9
y F(x,y)=0 F(x,y)>0 x F(x,y)<0 F(x,y)=0
y
F(x,y)>0
F(x,y)<0
x
图5-4 直线将平面分为三个区域
5.当直线没有画完时,重复步骤3和4。否则结束。
2013-7-17 24
程序 几种画线算法的比较
2013-7-17
25
5.2 圆的扫描转换
解决的问题:
绘出圆心在原点,半径为整数R的圆x2+y2==R2
5.2.1 八分法画圆
八分法画圆
2013-7-17
26
y y=-x
(-y,x)
(y,x)
y=x
2013-7-17 32
M的坐标为:M(xi +1,yi-0.5)
•当F(xM,yM)<0时,取Pu(xi +1,yi) •当F(xM,yM)>0时,取Pd(xi +1,yi-1) •当F(xM,yM)=0时,约定取Pu。 构造判别式:
d F ( xM , yM ) F ( xi 1, yi 0.5) ( xi 1)2 ( yi 0.5)2 R2
(xi+2,yi+0.5) (xi+1,yi+0.5) (xi,yi) d>=0
yi 0.5 k ( xi 1) b k d k
2013-7-17
14
初始值d的计算
d 0 F ( x0 1, y0 0.5) y0 0.5 k ( x0 1) b y0 kx0 b k 0.5 0.5 k
2013-7-17 38
5.3 椭圆的扫描转换
d F ( xi 2, yi 1.5) yi 1.5 k ( xi 2) b
yi 1.5 k ( xi 1) b k d 1 k
2013-7-17
13
误差项的递推
d≥0:
d F ( xi 2, yi 0.5) yi 0.5 k ( xi 2) b
5.当x<y时,重复步骤3和4。否则结束。
2013-7-17 37
改进:用d-0.25代替d
算法步骤:
1.输入圆的半径R。
2.计算初始值d=1-R、x=0、y=R。
3.绘制点(x,y)及其在八分圆中的另外七个对称点。
4.判断d的符号。若d≤0,则先将d更新为d+2x+3, 再将(x,y)更新为(x+1,y);否则先将d更新为d+2(xy)+5,再将(x,y)更新为(x+1,y-1)。 5.当x<y时,重复步骤3和4。否则结束。程序
(-x,y) (-x,-y)
(x,y)
(x,-y)
(-y,-x)
2013-7-17
(y,-x)
27
解决问题:
y y=x R
x
图5-10 1/8圆弧
2013-7-17 28
5.2.2 简单方程产生圆弧
算法原理:利用其函数方程,直接离散计算
圆的函数方程为:
x y R
2 2
2
xi1 xi 1
ε=1/max(|△x|,|△y|)
2013-7-17 5
(5 - 2)
max(|△x|,|△y|)=|△x|,即|k|≤1的情况:
xi 1 yi 1 1 xi x xi x xi 1 x 1 yi y yi y yi k x
(xi+1 ,round(y i+k ))
图5-3 DDA算法生成直线段
程序 注意: round(x)=(int)(x+0.5)
2013-7-17 7
特点: 增量算法 直观、易实现
不利于用硬件实现
2013-7-17
8
5.1.2 中点Bresenham算法
直线的方程
y y1 y0 F ( x, y) y kx b 0 , 其中k x x1 x0
x 0, R
2 2 i 1
2
(5 - 7)
29
yi1 round( R x )
2013-7-17
圆的极坐标方程为:
x R cos y R sin
i1 i (为一固定角度步长 ) xi 1 round( R cos i1 ) yi1 round( R sin i 1 )
max(|△x|,|△y|)=|△y|,此时|k|≥1:xi 1ຫໍສະໝຸດ yi 12013-7-17
1 1 xi x xi x xi y k 1 yi y yi y yi 1 y
6
(round(x i+1/k ),yi+1 ) (xi,yi)
2 2
2013-7-17
36
算法步骤:
1.输入圆的半径R。
2.计算初始值d=1.25-R、x=0、y=R。
3.绘制点(x,y)及其在八分圆中的另外七个对称点。
4.判断d的符号。若d≤0,则先将d更新为d+2x+3,再
将(x,y)更新为(x+1,y);否则先将d更新为d+2(x-y)+5,
再将(x,y)更新为(x+1,y-1)。
图5-1
2013-7-17
用一系列的象素点来逼近直线
2
5.1 直线的扫描转换
直线的绘制要求:
1.直线要直 2.直线的端点要准确,即无定向性和断裂情况 3.直线的亮度、色泽要均匀 4.画线的速度要快 5.要求直线具有不同的色泽、亮度、线型等
2013-7-17
3
解决的问题:
给定直线两端点P0(x0,y0)和P1(x1,y1),画出该直线。
2013-7-17 17
5.1.3 改进的Bresenham算法
假定直线段的0≤k≤1 基本原理:
k k k k k d d d d
图5-8 改进的Brensemham算法绘制直线的原理
2013-7-17 18
xi 1 xi 1 y yi 1 (d 0.5) i 1 yi (d 0.5)
2013-7-17
10
基本原理: 假定0≤k≤1,x是最大位移方向
Pu(xi+1,y i+1) Q M(x i+1,y i+1/2) P(x i,yi) Pd(xi+1,y i)
图5-5 Brensemham算法生成直线的原理
2013-7-17 11
判别式:
d F ( xM , yM ) F ( xi 1, yi 0.5) yi 0.5 k ( xi 1) b (5 - 6)
为(x+1,y+1),同时将e更新为e-1;否则(x,y)更新 为(x+1,y)。 5.当直线没有画完时,重复步骤3和4。否则结束。
2013-7-17
22
改进2:用2e△x来替换e e初=-△x, 每走一步有e=e+2△y。 if (e>0) then e=e-2△x
2013-7-17
• e初=-0.5, • 每走一步有e=e+k。 • if (e>0) then e=e-1
2013-7-17
21
算法步骤为:
1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。
2.计算初始值△x、△y、e=-0.5、x=x0、y=y0。
3.绘制点(x,y)。