第2章 基本图形生成算法
【华科 CAD技术与应用】第2讲 计算机图形学基础-基本图形生成
![【华科 CAD技术与应用】第2讲 计算机图形学基础-基本图形生成](https://img.taocdn.com/s3/m/29028af3f18583d048645912.png)
2.3.基本图形生成算法
— 直线生成算法 — 圆弧生成算法 — 其它基本图形生成
2.4.图形裁减算法 2.5.多边形填充算法(选学) 2.6.图形反走样算法(选学) 2.7.基于OpenGL图形库生成图形(选学)
华中科技大学CAD中心
思考问题:
1)图形如何在屏幕上显示出来?? 2)CAD图形如何生成??
象素的亮度值控制电子束对荧光屏的轰 击强度,象素在帧缓存寄存器中的位置编码 控制电子束的偏转位置。
图形系统为灵活控制图形颜色变化,往 往不直接将帧缓冲器中的数值作为显示的亮 度值,而是先经过颜色查找表(称调色板) 产生变换值来控制光点亮度。其工作方式:
显存中某位值 度
颜色表地址
华中科技大学CAD中心
为叙述方便,仅考虑圆心在原点的圆(其它位置圆可平移到原点位置)。
不妨设函数:
F (x, y) = x2 + y 2 - r 2
显然有: F(x,y)< 0,则(x,y)位于圆边界内 F(x,y)= 0,则(x,y)位于圆边界上 F(x,y)> 0,则(x,y)位于圆边界外
考虑到圆的八对称 性,不妨以第二个 八分圆进行分析, 其它八分圆则可通 过镜像实现。
华中科技大学CAD中心
刷新频率
(仅CRT)
每秒钟重绘屏幕的次数, CRT产生稳定图像所需要的最小刷新频率: = 1秒 / 荧光物质的持续发光时间 (Hz)
注:液晶显示器原理不同于CRT,不受刷新频率影响。但液晶显示 有拖尾现象,是因液晶偏转延迟所致,延时越长,拖尾越重。
帧扫描
与电视工作原理类 似,CRT电子束从上 到下、从左到右扫描 进行,每扫描一遍称 为一帧。
1-03基本图形生成算法
![1-03基本图形生成算法](https://img.taocdn.com/s3/m/12971607e87101f69e3195d6.png)
3基本图形生成算法由于绘图机传动机构的限制,绘图时绘图笔只能作四个基本方向及组合的运动(共8个方向)。
每送一个信号就会驱使绘图笔沿8个方向之一移动一个步距,经过多次移动(形成阶梯状折线),即可给出人们需要的由折线逼近的复杂图形。
在显示器中绘制图形时,由于图形显示器像元的点阵分布,只能在显示器所给定的有限个像素组成的矩阵中,确定最佳逼近于该图形的一组像素。
绘图机的移动步距及显示器的像素决定着绘图的精度。
3.1直线的生成3.1.1数值微分法直线的斜率:x y k ∆∆=/。
其中,),(),(,,11000101y x y x y y y x x x 和-=∆-=∆分别是直线的端点坐标。
然后,从直线的起点开始,确定最佳逼近于直线的y 坐标。
假定端点坐标均为整数,让x 从起点到终点变化,每步递增1,计算对应的y 坐标,y=kx+B ,并取像素(x ,round(y))。
用这种方法既直观,又可行,然而效率较低。
这因为每步运算都需要一个浮点乘法与一个舍入运算。
注意到 xk y xk B kx Bx x k Bkx y i i i i i ∆+=∆++=+∆+=+=++)(11因此,当1=∆x 时,又k y y i i +=+1,既当x 每递增1时,y 递增k (即直线斜率)。
一开始,直线起点(x 0,y 0注意上述分析和算法仅适用于|k|<=1的情形。
在这种情况下,x 每增加1,y 最多增加1,故在迭代过程的每一步,只要确定一个像素。
而当直线斜率k 的绝对值超过1时,必须把x,y 的地位交换,y 每增加1,x 相应增加1/k 。
数值微分法的本质,是用数值方法解微分方程,通过同时对x,y 各增加一个小增量,计算下一步的x,y 值。
在一个迭代算法中,如果每一步的x,y 值是用前一步的值加上个增量来获得的,那么,这种算法就成为增量算法。
在这个算法中,y 和k 必须用浮点数表示,而且每一步运算都必须对y 进行舍入取整。
计算机地图制图原理与方法基本图形生成算法PPT课件
![计算机地图制图原理与方法基本图形生成算法PPT课件](https://img.taocdn.com/s3/m/b43153410029bd64793e2cc3.png)
a=y0-y1; b=x1-x0;d=2*a+b; d1=2*a;d2=2* (a+b); x=x0;y=y0; while (x<=x1) { SetPixel (x, y, color); if (d<0) {x++;y++; d+=d2; } else {x++; d+=d1;} } /* while */ } /* midPointLine */
第13页/共34页
程序改进
void Bresenhamline (int x0,int y0,int x1, int y1,int color)
{ dx = x1-x0,;dy = y1- y0,;e=-dx;
x=x0; y=y0; for (i=0; i<=dx; i++)
从速度考虑,还 有那些可以改进?
第9页/共34页
3.2.3 生成直线的Bresenham算法
Yi+1 Yi
D
B A
C
xi
Xi+1
第10页/共34页
原理:
d
d
dd
假定直线斜率,0<k<1, 起点坐标为(x,y);
下一个点亮象素可能是:(x+1,y) 或 (x+1,y+1)。这可通过d值的大小来确定:
d = d+k, 当d>1 时 d=d-1 ;
d = F(xp + 2, yp - 0.5)
ch3基本图形的生成与计算
![ch3基本图形的生成与计算](https://img.taocdn.com/s3/m/ddd88903581b6bd97f19ea38.png)
Bresenham画线算法改进
上述bresenham算法在计算直线斜率与误差 项时用到小数与除法。可以改用整数以避免 除法。由于算法中只用到误差项的符号,因 此可作如下替换:
改进的Bresenham画线算法程序:
void InterBresenhamline (int x0,int y0,int x1, int y1,int color) { dx = x1-x0, dy = y1- y0, e=-dx; x=x0, y=y0; for (i=0; idx; -e+) { drawpixel (x, y, color); x++;e=e+2*dy;
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
由于只用d 的符号作判断,为了只包含整数运算, 可以用2d代替d来摆脱小数,提高效率。
设偏差计算公式为:
Fk
= tg - tg=
Yk X A - YA X k X A Xk
A
K2 K1
O
’
偏差计算
可以简化为
Fk Yk X A - YA X k
根据 Fk 计算出偏差,然后确定下一步的走向。
初始: X 0 0; Y0 0; 则 F0 =0;
第一步: X 1 X 0 1 1; Y1 0;
在直线生成的算法中Bresenham算法是最有 效的算法之一。令 k=Δy/Δx,就 0≤k≤1的情况来说明Bresenham算法。 由DDA算法可知: yi+1=yi+k (1) 由于k不一定是整数,由此式求出的yi也 不一定是整数,因此要用坐标为(xi,yir) 的象素来表示直线上的点,其中yir表示 最靠近yi的整数。
电脑图形教程基本图形生成算法
![电脑图形教程基本图形生成算法](https://img.taocdn.com/s3/m/90229e4903020740be1e650e52ea551810a6c918.png)
P2
e’
e P P1
y方向不走步
P2
e
e’
P
P1
Bresenham画线算法(6/7)
下一步误差的计算
当e≥0时,y方向走一步
e’=2y/ x - 1 =e + y/ x - 1 e’=e + 2y - 2x
当e<0时,y方向不走步
e’=2y/ x=e + y/ x e’=e + 2y
P2
光栅图形中点的表示
Address(x,y) = (xmax-xmin) * (y-ymin) + (x-xmin) + 基地址 = k1 + k2y + x
对像素连续寻址时,如何减少计算量?
Address(x±1,y) = k1 + k2y + (x±1) = Address(x,y) ± 1 Address(x,y±1) = k1 + k2(y ±1) + x = Address(x,y) ± k2 Address(x±1,y±1) = k1 + k2(y ±1) + (x±1)
实区域填充 字符 图形反走样
光栅图形中点的表示
…
地址线性表 1D表示
(x,y)坐标
显示屏幕 2D表示
像素由其左下角坐标表示
光栅图形中点的表示
y ymax
ymin xmin
x xmax
地址 = (xmax-xmin) * (y-ymin) + (x-xmin) + 基地址
每行像素点数
行数
行中位置
P2
M (Xp+1,Yp+0.5)
P
计算机图形学ppt课件 第二章基本图形的生成与计算
![计算机图形学ppt课件 第二章基本图形的生成与计算](https://img.taocdn.com/s3/m/961acf46b84ae45c3b358c33.png)
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
第2章基本图形生成算法
![第2章基本图形生成算法](https://img.taocdn.com/s3/m/ce100247b6360b4c2e3f5727a5e9856a5712266f.png)
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) , 则直线方程可表示为 :
第2章 基本图形的生成与技术(2.6)
![第2章 基本图形的生成与技术(2.6)](https://img.taocdn.com/s3/m/5f303fc56137ee06eff91847.png)
2.6图形的剪裁内容提要(1)计算机是如何将几何图形显示到屏幕上的?(2)了解各种坐标系的定义及其作用;(3)熟悉二维观察流程;(4)掌握2维坐标变换的基本方法;(5)掌握常用的二维裁剪算法,并会编程实现。
在计算机图形显示的过程中,往往需要确定图形的哪些部分(包括点、线段、文字、多边形等)落在显示区域(即:视口或视区)之内,哪些部分落在显示区域之外,以便只显示位于显示区域内的那部分图形。
裁剪的实质就是决定图形中哪些部分位于指定的区域内。
这需要进行几何处理,以便去除落在指定区域之外的部分,保留位于指定区域以内的部分。
这个过程称为裁剪。
最直观的裁剪方法是把各种几何图素通过扫描转换等技术离散成为点的集合,再逐点判断其是否位于指定的区域内。
那样虽然简单,但是效率太低,一般不可取。
1、线段的裁剪对于一条给定的线段,其裁剪过程一般包括以下几个部分:首先测试和判断它是否完全落在裁剪区之内?如果不是,再判断它是否完全落在裁剪区之外?然后,对于既不能确定完全落在裁剪区之内又不能确定完全落在裁剪区之外的线段,要计算它与一个或多个裁剪边界的交点。
最后,对线段的端点进行测试,对于两个端点都落在裁剪区域内的线段就存储起来,否则就予以去除,即裁剪之。
一、C o h e n-S u t h e r l a n d裁剪算法这个算法的特点是:通过初始测试来快速判断线段与视区的关系,以便减少线段求交的次数,从而提高裁剪算法的速度。
C o h e n-S u t h e r L a n d裁剪算法的基本思想:对每条线段P1P2:1)判断端点在裁剪区域内、外:P1P2完全在视区内,保存之;P1P2完全在视区外,舍弃之;2)上述两条件均不满足,则计算图形与裁剪边界的交点,将该线段分为分别位于裁剪区域内、外的两段,再重复1)。
在分段时,依据端点的区域码分别计算线段与各条裁剪边界的交点,如图3.10所示,对P1就需要分别计算交点P3和P4;即只要按顺序检测端点区域码的每一位,当某位不为0时,才把线段与对应的裁剪边界进行求交。
计算机基本图形生成算法
![计算机基本图形生成算法](https://img.taocdn.com/s3/m/066e055730b765ce0508763231126edb6f1a76fc.png)
x2 y2 R2
构造函数F(x,y)=x2+y2-R2。 对于圆上的点,有F(x,y)=0; 对于圆外的点,F(x,y)>0; 而对于圆内的点,F(x,y)<0。
31
y
Pu
PM
Pd
x
图5.13 中点Bresenham画圆的原理
中点Bresenham画圆
y
yi
k
19
改进的Bresenham算法
kd
k d
kd
k kd
图5.10 改进的Brensemham算法绘制直线的原理
改进的Bresenham算法——原理
xi1 yi1
xi
yi yi
1
1
(d 0.5) (d 0.5)
误差项的计算
d初=0, 每走一步:d=d+k
一旦y方向上走了一步,d=d-1
中点Bresenham画圆
判别式的初始值
d0 F ( x0 1, y0 0.5) F (1, R 0.5) 1 (R 0.5)2 R2 1.25 R
36
改进:用d-0.25代替d 此时有:
d d 2xi 3
d 0.25
d d 2(xi yi ) 5 d 0.25
yi-2
(xi 2)2 ( yi 0.5)2 R2
xi xi+1 xi+2
d2 ( xi 1 1)2 ( yi 0.5)2 R2 图5.14 d≤0的情况
( xi 1)2 2xi 3 ( yi 0.5)2 R2
d1 2xi 3
误差项的递推(d>0)
yi
P
yi-1
构造判别式:
第二章二维基本图形的生成与二维区域的填充课件
![第二章二维基本图形的生成与二维区域的填充课件](https://img.taocdn.com/s3/m/dd4bd871c5da50e2524d7f88.png)
2019y/12i+/41)作为下一个象素点。
23
2.1.2 生成直线的Bresenham算法
• 因此只要利用(d1-d2)的符号就可以决定下 一个象素点的选择。为此,我们进一步定义一 个新的判别式:
• pi=△x×(d1-d2)=2△y·xi-2△x·yi+c (2-11) 式(2-11)中的△x=(x2-x1)>0,因此pi与(d1-
三、直线Bresenham算法思想之二
•
由于象素坐标的整数性,数学点(xi,yi)与所
取象素点(xi,yir)间会引起误差(εi),当xi列上已用
象素坐标(xi,yir)表示直线上的点(xi,yi),下一直
线点B(xi+1,yi+1),是取象素点C(xi+1,yir ),还是
2019D/12(/4xi+1,y(i+1)r)呢?
(2-12)
将式(2-12)减去(2-11),并利用xi+1=xi+1,
可得:
• pi+1= pi+2△y-2△x·(yi+1-yi) (2-13)
• 再假设直线的初始端点恰好是其象素点的 坐标,即满足:
• y1=mx1+b
(2-14)
2019/12/4
25
2.1.2 生成直线的Bresenham算法
我们知道,一幅图是由点、直线、曲线、多 边形填充区域以及字符串等组成。下面将讨论这 些基本图元的生成技术和算法。
2019/12/4
4
2.1 直线的扫描转换
一、数学直线 在数学上,理想的直线是一条由无穷多个无
限小的连续的点组成。
数学直线
2019/12/4
《计算机图形学》02 基本图形生成
![《计算机图形学》02 基本图形生成](https://img.taocdn.com/s3/m/9402e35d5022aaea988f0f36.png)
直线裁剪的情况:
D
C A B
端点编码的9种结果:
1010
1000
0110
0100
0101
直线编码裁剪算法处理步骤:
若两个端点的编码均为0,则两个端点均位于窗口内,线段全显 示,结束;
将两个端点的编码的编码按位与,若结果不为0,则线段必然位 于某条边线之外,线段全不显示,结束;
(这时,某个端点必然存在为1的位,且另一个端点相应的位为0, 线段将部分显示或全不显示)则,对任一个存在1位的端点,用1 位所对应的边,将直线段分割为两段,舍弃位于边线外的段,对 边线内的段再按本规则进行处理。
作业: 用窗口(5,10,25,30),对直线(0,40)-(30,15)进行裁剪,写出处理过 程及结果。
例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
5
6
7
8
9 10
例4 (2,3)-(8,7)直线的点阵
数值微分法计算步骤:
对给定的两个直线端点(x1, y1),(x2, y2), 有:x2≥x1,|x2-x1|>|y2-y1|。 (1)求得两点连线的斜率:k=(y2-y1)/ (x2-x1) (2) px1=x1,py1=y1,得直线上的点(px1, py1);令i=1; (3)若pxi=x2,则计算结束;否则,继续; (4)pxi+1=pxi+1, pyi+1=pyi+k, 得直线上的点( pxi+1, int(pyi+1+0.5) ); (5)令i=i+1,转到(3)。
第二章基本图形
![第二章基本图形](https://img.taocdn.com/s3/m/34bf719a9ec3d5bbfc0a7412.png)
判断式为 di=F(xm,ym)= F(xi+1,yi+0.5)=F(xi+1,yi-0.5)
图2.4 y的位置
圆的生成算法
圆的Bresenham算法(续)
当di<0时, di+1=F(xi+2,yi-0.5)=di+2xi+3
当di>=0时, di+1 =F(xi+2,yi-1.5) =di+2xi-2yi+5
实现。
直线Bresenham算法
▪ 讨论:
• 以上讨论的是 0<△y<△x 的情况,对于适用所有8个 • 方向的直线(图2.1)的生成算法,则要考虑以判断条件
|dx|>|dy| • 为分支,并分别将2a、3a象限的直线和3b、4b象限的直
线变换到 • 1a、4a和2b、1b象限方向去,以实现程序处理的简洁。
指出组成多边形的边序列;
• 一般采用顶点序列来表示多边形
图2.5 扫描线与多边形相交
图2.6 光栅化后直线变成离散点
多边形填色首要的问题——
判断一个像素是在多边形内还是多边形外。
内-外测试:给定的像素点是在多边形 区域的内部/外部
方法一:
“扫描交点的奇偶数判断法”(奇-偶 测试规则)
任意点P,以P为起点作射线,若一该 射线相交的多边形的数目为奇数, 则为内部点;否则,为外部点。
二维填充图元的生成
一般步骤 • 确定那些像素位于填充图元的内部; • 确定以什么颜色填充这些像素;
凸多边形与凹多边形
定义: • 如果在多边形内任意选取两点相连,所得线段上的
所有点均在该多边形内,称为凸多边形; • 不满足凸多边形条件的多边形称为凹多边形 ;
第2章基本图形的生成与计算--直线、圆、椭圆的生成
![第2章基本图形的生成与计算--直线、圆、椭圆的生成](https://img.taocdn.com/s3/m/81a47ab3172ded630b1cb6b9.png)
2a true -1 m
4a true
1 -m
2b false -1/m 1
4b true 1/m -1
数值微分(DDA)法
• 二个规律 (1) |dx| > |dy| 时, |Dx|=1, |Dy|=m |dx|≤|dy| 时, |Dx|=1/m, |Dy|=1 (2) Dx、Dy的符号与dx、dy的符号相同
即求得 Pi+1=Pi+2dy-2(yi+1-yi)dx • 求初值
Pi中代入x1和y1,得初值 P1=2dy-dx
Bresenham画线算法
y=m(xi+1)+b
d1=y-yi
yi+1
D
d2 B
d1
d2=yi+1-y 如果d1-d2>0, yi+1取D(yi+1),否则取C(yi)。
yi
A
C 因此算法的关键在于求出d1-d2的符号。
xi
xi+1 d1-d2=(y-yi)-(yi+1-y)=2y-2yi-1
=2dy/dx(xi+1)-2yi+2b-1
Bresenham画线算法
• 由DDA算法可知:yi+1=yi+m。由于m不一定 是整数,由此式求出的yi也不一定是整 数
• 本算法于1965年由Bresenham提出 • 在直线生成的算法中,Bresenham算法是
最有效的算法之一 • 令 m=Δy/Δx,就0≤m≤1的情况来说明
Bresenham算法
数值微分(DDA)法
void dda_line(int xa,int ya,int xb,int yb,int c) {
基本图形生成算法(基于VC++6.0实现)
![基本图形生成算法(基于VC++6.0实现)](https://img.taocdn.com/s3/m/4e18642b0a4c2e3f5727a5e9856a561252d32174.png)
基本图形生成算法(基于VC++6.0实现)仲恺农业工程学院实验报告纸计算科学学院(院、系)信计082 班计算机图形学课学号:200811314211 姓名:孙青海实验日期:2011/5/20 教师评定实验一基本图形生成算法一、实验目的与要求:1. 掌握中点Bresenhanm绘制直线的原理2. 设计中点Bresenhanm算法3. 掌握八分法中点Bresenhanm算法绘制圆的原理4. 设计八分法绘制圆的中点Bresenhanm算法5. 掌握绘制1/4椭圆弧的上半部分和下半部分的中点Bresenhanm算法原理6. 掌握下半部分椭圆偏差判别式的初始值计算方法7.设计顺时针四分法绘制椭圆的中点Bresenhanm算法二、实验描述:1. 使用中点Bresenhanm算法绘制斜率为01≤≤的直线。
k2. 使用中点Bresenhanm算法绘制圆心位于屏幕客户区中心的圆。
3. 使用中点Bresenhanm算法绘制圆心位于屏幕中心的椭圆。
三、实验结果:1.打开VC++6.0程序;2.创建一个MFC工程,命名为exper1;选择单文档和作为静态的DLL,然后完成创建MFC工程;3.在ResourceView工作区窗口插入三个Dialog,第一个对话框作为画直线时用户输入起点坐标和终点坐标使用,第二个对话框作为画圆时用户输入所要画圆的半径使用,第三个对话框作为画椭圆时用户输入所要画椭圆的长半径和短半径使用;4.通过右键点击对话框选择建立类向导,因为本对话框是新建对话框还没有建立类向导,在此要新建一个line类,如下图所示,按照此方法将其他的两个对话框建立类向导分别为画圆建立Round类,画椭圆,建立Ellips类;5.完成类得建立后,对该对话框中的输入框进行添加变量与其关联,具体步骤如下图所示,按照此方法将所有的对话框中的输入框进行变量添加;6.打开Menu菜单中的选项,新建一个画图菜单,在画图菜单中新建直线、圆与椭圆子菜单,新建方法点击空白方框处右键选择属性,添加标明即可;7.点击子菜单,这里以直线为例,点击右键选择“建立类向导”,因为此时的直线的ID为“ID_1”,所以我们选择ID_1,类名选择刚刚建立的line类,按照下图中的方法,点击OK后向导既建立完成,建立完成后的图如下所示;。
计算机图形学第二章基本图形的生成与计算ppt课件
![计算机图形学第二章基本图形的生成与计算ppt课件](https://img.taocdn.com/s3/m/1ca5ad13f61fb7360a4c654c.png)
P2 Q
P=(xp,yp) P1
• 问题:如何判断M与Q点的关系?
直线中点画线法
假设直线方程为:ax+by+c=0 其中a=y0-y1, b=x1-x0, c=x0y1-x1y0 由常识知:
Fx, y0 Fx, y0 Fx, y0
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
直线中点画线法
画线从(x0, y0)开场,d的初值
d0=F(x0+1, y0+0.5)= a(x0 +1)+b(y0 +0.5)+c
a+0.5b
= F(x0, y0)+a+0.5b =
由于只用d 的符号作判断,为了只包含整数运 算,
可以用2d代替d来摆脱小数,提高效率。
直线中点画线法
void Midpoint Line (int x0,int y0,int x1, int y1,int color)
否则
|Dx|=1/m ,|Dy|=1
2、Dx,Dy的符号与dx,dy的符号相同
依据上述规律可以生成直线,每生成一条直线 做两次除法,画线中的每点做两次加法,所以 DDA算法生成直线的速度还是很快的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
提出问题:判别式d是否有增量。
中点画线法
(1) 若d0, 取正右方像素点P1(xp+1,yp) 此时再下一个象素的判别式为:
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
算法特点: • 使用最广泛 • 与中点画线法的思想类似 • 由误差项符号决定下一个象素取正右方
像素还是右上方像素
Bresenham画线算法
基本原理: (k在0~1之间的情况,且保证起点坐标小于终点坐标 ) 给定直线的起点(x1, y1),终点(x2, y2)。 设当前已确定像素点Pk (xk, yk) ,沿扫描方向,x每次 增加一个单元格,即下一个像素点Pk+1 横坐标为xk+1, 而终坐标y或保持yk不变,或为yk+1 。
k=(2-0)/(5-0)=0.4
x
y
int(y+0.5)
Line: P0(0, 0)-- P1(5, 2)
0
0
0
3
1
0.4
0
22Leabharlann 0.813
1.2
1
1
4
1.6
2
5
2.0
2
0 12 3 4 5
中点画线法
• 基本原理
只考虑斜率k(0<k<1)且保证起点坐标小于终点坐标
设当前像素点为P(Xp,Yp ), 则下一个与直线最接近的像 素只能是P1点或P2点。设M 为中点,Q为交点。 提出问题:如何确定下一个 象素点。
数值微分(DDA)法
基本原理:
已知直线段的起点、终点分别为:P0 (x0,y0), P1(x1,y1),且坐标值都为整数。 直线的微分方程为:
dy y y1 y0 k dx x x1 x0
设|k|≤1, 则有
yi+1=kxi+1+b=k(xi+Δx)+b=yi+kΔx 若Δx=1, 则当x每递增1时, y递增k 。
其中a=y0-y1, b=x1-x0, c=x0y1-x1y0
Fx, y 0 Fx, y 0 Fx, y 0
点在直线上面 点在直线上方 点在直线下方
欲判断M点与Q点关系,只需把 M(xp+1,yp+0.5)代入F(x,y),并检查它的符号。
中点画线法
构造判别式: d=F(M)=F(xp+1,yp+0.5) =a(xp+1)+b(yp+0.5)+c
2.1.1 直线的扫描转换算法
三个常用算法 – 数值微分(DDA)法 – 中点画线法 – Bresenham画线法
数值微分(DDA)法
DDA算法: 根据直线的微分方程来计算Δx或Δy生成 直线的扫描转换算法。
过程描述: 在水平坐标轴上以单位间隔对线段取样, 以 决定垂直坐标轴方向上最靠近理想线段的 整数值。
增量为a
P2
Q
P=(xp,yp) P1
中点画线法
(2) 若d<0, 取右上方像素点P2(xp+1,yp+1) 此时再下一个象素的判别式为:
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
中点画线法
例:用中点画线法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 3
2 1 0 -3 2
32 1 3
1
4 3 1 -1
54 2 5
0 12 3 4 5
65 2
Bresenham画线算法
第2章 基本图形生成算法
2.1 图形的扫描转换 – 直线的扫描转换 – 圆弧的扫描转换 – 椭圆弧的扫描转换
2.2 区域填充 2.3 图形裁剪
2.1.1 直线的扫描转换算法
基本原理 (1)确定最佳逼近于该直线的一组象素 (2)按扫描线顺序,对这些象素进行写操作
图5-1 用一系列的象素点来逼近直线
优点:
– 只有整数运算,不含乘除法 – 可用硬件实现
中点画线法
void MidpointLine (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); } } /* 中点画线法程序 */
中点画线法
➢M在Q的下方-> P2离直线更近更近->取P2 ➢M在Q的上方-> P1离直线更近更近->取P1 ➢M与Q重合-> P1、P2任取一点->约定取P1
P2 Q
P=(xp,yp) P1
提出问题:如何判断M点与Q点的位置关系?
中点画线法
已知直线段的起点P0 (x0,y0), 终点P1(x1,y1)。 直线方程为:F(x,y)=ax+by+c=0
P2
Q
P=(xp,yp) P1
中点画线法
画线从直线起点P0(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
由于只用d 的符号作判断,为了只包含整数运算, 可以用2d代替d来摆脱小数,提高效率。
y=y+k ; // DDA算法描述
数值微分(DDA)法
算法特点: • DDA算法就是一个增量算法
增量算法:在一个迭代算法中,如果每 一步的x、y值是用前一步的值加上一个 增量来获得,则称为增量算法。 • 直观,易实现 • 不利于用硬件实现
数值微分(DDA)法
例:画直线段P0(0,0)--P1(5,2)
数值微分(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 ; x<=x1; x++) drawpixel (x, int(y+0.5), color) ;