2D基本图形生成算法

合集下载

基本图形生成算法-直线圆弧

基本图形生成算法-直线圆弧

1 / max( x , y )
广东工业大学机电学院图学与数字媒体工程系
计算机图形学基础:基本图形生成算法——直线及圆弧的扫描转换 直线的扫描转换——数值微分法
绘制直线时,要确定一个方向的增量为单位增量,即确定 画线的基本步进方向,另一个方向的增量由直线的斜率决
定。确定基本步进方向的依据是理想直线的斜率k。
DDA算法是一种增量算法,优点是直观、易于实现;
缺点是要做浮点运算和舍入取整,不利于硬件实现。
广东工业大学机电学院图学与数字媒体工程系
计算机图形学基础:基本图形生成算法——直线及圆弧的扫描转换 直线的扫描转换——数值微分法
斜率<=1时,以x为基本 步进方向,x方向每次步 进增量为1。
斜率>1时,以y为基 本步进方向,y方向 每次步进增量为1。
第二象限 第四象限
走笔 +Y 走笔 -Y Fk+1=Fk-|xA |
走笔 -X 走笔 +X Fk+1=Fk+|yA |
逐点比较法绘制直线.doc
广东工业大学机电学院图学与数字媒体工程系
计算机图形学基础:基本图形生成算法——直线及圆弧的扫描转换
【注】递推公式的作用: 意义:简化计算过程,提高效率。 原则:尽可能以加减法代替乘除法。 方法:用当前点的偏差推算出走笔方向,并计算出下一
Fi 1 xA yi 1 y A xi 1
即第i+1点的偏差判别式为:
xA ( yi 1) y A xi Fi x A
广东工业大学机电学院图学与数字媒体工程系
计算机图形学基础:基本图形生成算法——直线及圆弧的扫描转换 直线的扫描转换——逐点比较法
各象限的判别式

第二章 二维图形生成技术---直线和圆弧

第二章  二维图形生成技术---直线和圆弧
圆心在原点、半径R为整数的圆 为例,讨论圆的生成算法。 假设圆的方程为: 2 2 2 X + Y = R
圆弧扫描算法
• X + Y = R 2 2 Y = ±Sqrt(R - X ) 在一定范围内,每给定一 X值,可得一Y值。 当X取整数时,Y须取整。
为能确定B在A点上面或下面,令
Yi+1,r A Yi,r D B C xi Xi+1 ε(x)的几何意义
ε(xi+1)=yi+1-yir-0.5
(2)
若B在A的下面,则有ε(xi+1)<0,反 之,则ε(xi+1)>0。由图可知 yi+1,r=yir+1,若ε(xi+1)≥0 yi+1,r=yir, 若ε(xi+1)≤0 (3)
逐点比较法 数值微分法(DDA) 中点画线法 Bresenham算法。
一逐点比较法
算法: 1、偏差计算 1)一般公式
αβ
A(xA, xA)
M(xM, xM)
• 偏差 d = tg β − tg α = y M − y A
xM
xA
y M x A − y A xM = xM x A
• 偏差的判断公式为
Bresenham画线算法
程序如下: BresenhamLine(x0,y0,x1,y1,color) int x0,y0,x1,y1,color; { int x,y,dx,dy; float k,e; int e; dx = x1-x0; dy = y1-y0; k = dy/dx; e = -0.5; x=x0; y=y0; e = -dx; for( i=0; i<=dx; i++){ drawpixel(x,y,color); x++; e=e+k; e1=e-0.5; e=e+2*dy; e1= e-dx; if(e1 > 0) e = e - 1; e = e - 2*dx; if(e >=0) y++; } }

计算机地图制图原理与方法基本图形生成算法

计算机地图制图原理与方法基本图形生成算法

该程序如何改进, 提高效率?
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;
}
缺点:
}
浮点运算、取整--》废时,且不利于硬件实现。

二维图形生成原理

二维图形生成原理
对应多边形覆盖每一条扫描线。 (2) 将每条边的信息链入与该边最小 y 坐标( ymin )相对 应的桶处。也就是说,若某边的较低端点为 ymin ,则 该边就放在相应的扫描线桶中。
改进的有效(活性)边表算法-数据结构
(3)每条边的数据形成一个结点,内
容包括:该扫描线与该边的初始 以及该边的最大y值ymax。
按扫描顺序,计算每 条扫描线与多边形的 相交区间,再用要求 的颜色显示这些区间
的像素,即完成填充
工作。
区间的端点可以通过
计算扫描线与多边形 边界线的交点获得。
图5-23 x-扫描线算法填充多边形 *算法的核心:须按 x递增顺序 排列交点的x坐标序列
扫描线算法-算法步骤:
(1)确定多边形所占有的最大扫描线数:得到多边形顶 点的最小和最大y值(ymin和ymax)。
有效边求交
• 利用多边形边的连贯性 *,
如图:若y=yi,x=xi,则当
12 11 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11 12 x
图5-23 x-扫描线算法填充多边形 xi+1 ,y i+1
y=yi+1=yi+1,xi+1=xi+1/k
1 xi,yi 1/k
1
1 1 0 2 2
图5-25 与扫描线相交的多边形顶点的交点数
1 0 2
解决顶点交点计为1时的情形*:
扫描线y+1 扫描线y 扫描线y-1
(a)原图
(b)缩短ymax的边
(c)缩短Leabharlann min的边图5-28 将多边形的某些边缩短以分离那些应 计为1个交点的顶点
改进的有效(活性)边表算法

基本图形生成算法

基本图形生成算法

Si (r 1, q)
(xi1, yi1)
y x dy dx
假设直线从 (x1, y1) 到 (x2 , y2 ) , 经变换后可表示为从 (0, 0) 到 (dx, dy) 其中 dx x2 x1 ,dy y2 y1 此时直线方程可简化为:
y dy x dx
(3 4)
将每一下标加1,即以i+1 代 i,则得:
di1 2xi dy 2 yidx 2dy dx
从 di1中减去 d i 得到:
di1 di 2dy(xi xi1) 2dx( yi yi1)
因为 xi xi1 1 ,重写上式得:
则令
dt 2m 所以
xinc dx 2m 1
yinc

dy
2m
1
即在x和y两个方向上,步长均小于1。若用硬件来实现对 称DDA法,则应用2套寄存器和加法器,将xinc和yinc分别加 到x和y的小数部分,哪个方向有整数溢出,就驱动该方向 走步。
数值微分法(DDA法)——特点
这种算法只需判断d的正负,其值的大小并不重要。 对于第一象限,因为分母 xM xA永远为正,所以只需 判断分子项的正负即可。我们得到偏差的判断公式 为:
FM yM xA yA xM
递推公式
用上式来计算偏差时,每次都要计算两次乘法,一 次减法,计算工作量还是很大的。如果我们设法用 前一点的偏差来推算走步方向以及走步以后的偏差, 则偏差计算就可以大大简化,也更适于计算机实现。 现在仍以第一象限为例,简述这种递推过程。
1
第五章 基本图形生成算法
图形生成的概念 直线段的扫描转换 圆的扫描转换 多边形的扫描转换与区域填充

计算机基本图形生成算法

计算机基本图形生成算法
给定圆心在原点,半径为整数R的圆,其方程为
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
构造判别式:

二维图形生成技术

二维图形生成技术
{ putpixel (x,y,pixelcolor) x=x+1 if (e<0) e=e+k
else { y=y+1; e=e+k-1 } }
10
讨论: 斜率不同时:
以上讨论的是 0≤ k ≤ 1 的情况,即 0<△y<△x 的情况; 若是 0<△x<△y 的情况,则需将 x 和 y 的位置交换。 方向不同时:
xi
Xi+18
设 e (xi+1)=yi+1-yi′-0.5
(2)
若b在a的下面,则有 e (xi+1)<0
若b在a的上面,则有 e (xi+1)>0
由图中可知:当e (xi+1)≥0时 y′i+1=yi′+1

e (xi+1) < 0时 y′i+1=yi'
递推:
由(2)、(3)式可得:
e (xi+2)=yi+2-y′i+1-0.5=yi+1+k-y′i+1-0.5
这个方法称之为数字微分分析法,简称DDA。
3
算法描述如下:
int x1,y1,x2,y2; int x; float dx,dy,k,y; dx=x2 - x1 ; dy=y2 - y1 ; k=dy/dx ; x=x1 ; y=y1 ; for (x=x1;x<=x2;x++)
{ putpixel (x,(int)y,pixelcolor ) ; y=y+k ;
Cx =
a
b
c
d
T x
则: x(t) = T • Cx
且: x'(t) = 3t2 2t 1 0 • Cx
26
Hermite曲线是给定曲线段的两个端点坐标P0 、 P1以及两端 点处的切线矢量R0 、 R1来描述曲线的。即:

计算机图形学 第4章 二维图形生成和变换技术

计算机图形学 第4章 二维图形生成和变换技术
22
设置初始值
x =x 1; y =y 1;
for(i = l; i<=length; i + + ) { Putpixel(round(x), round(y), l); x = x + increx y = y + increy 求下一 } 点坐标 }
终点控制
将x和y取 整后画点
23
三、 Bresenham法
2)递推公式 由公式可以看出,由于每次要计算两次乘法和一次减法, 所以计算工作量大, 为了简化计算,可设法用前一点的偏 差来推算后一点的走步方向以及走步后的偏差,这种方法 称为递推法。递推公式很容易用计算机实现。
13
递推公式可根据下图用偏差函数判断笔进方向的图例得出 设笔当前位置为 M1(X1,Y1),此时 F1=Y1XA- YAX1<0,应走+Y一步到M2 即X2=X1,Y2=Y1+1,+1表示走一步 M2处的偏差为:F2=Y2XA-YAX2=F1+XA( 用X2=X1,Y2=Y1+1代入得到) 若F2≥0,应走+X一步到M3, 则X3=X2+1,Y3=Y2, M3处的偏差为: F3=Y3XA-YAX3=Y2XA-YAX2-YA=F2-YA
Y
Y
X
X
Z
4
图 4.2 点在二维、三维坐标系统中的表示
二、直线
一条直线是指所有在它上面的点的集合 , 在图形学 中研究的对象是直线段。
已知线段的起点坐标(Xs,Ys)。终点坐标(Xe,Ye )这两点就确定了这条线段,并用线段xe x xs y ye y ys
3)任意象限偏差计算 对于第二、三、四象限的直线,也可类似推出。当直 线段处于第二、三、四象限时,偏差值的计算及走步 方向下表 直线段位 走步方向 偏差值 走步方向 偏差值FK< 置 FK≥0 0 第一象限 +X +Y FK+1= FK+1= 第二象限 -X +Y FK-YA FK+XA
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

面——多边形区域填充 字符 图形反走样
圆弧的扫描转换

圆的八对称性
只考虑第二个八分圆
y

假设圆心在原点 x2+y2=R2 (y,x) (-y,-x)
(-x,y)
(x,y)
R o
(y,x) x
(y,-x) (x,-y)
(-x,-y)
圆弧扫描算法
2 2 2

X
+
Y
2
=
R
2
Y = Sqrt(R - X )
假设
像素间均匀网格,整型坐标系,直线段斜率0<m<1 对m>1,x、y互换
直线的扫描转换
直线的绘制要求:
1.直线要直 2.直线的端点要准确,即无定向性和断裂情况 3.直线的亮度、色泽要均匀 4.画线的速度要快 5.要求直线具有不同的色泽、亮度、线型等
直线段的扫描转换算法

直线的扫描转换
Bresenham画线算法(1/7)
使用最广泛 与中点画线法的思想类似 由误差项符号决定下一个象素取正右方像素
还是右上方像素
Bresenham画线算法(2/7)
基本思想
过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交 点,然后根据误差项的符号确定该列象素中与此交点最近的象素。
(x,y) y y=-x y=x

选择像素的原则
使其与实际圆弧的距离平方达到最小
y
Pu P M Pd
M的坐标为:M(xi +1,yi-0.5)
当F(xM,yM)<0时,取Pu(xi +1,yi)
当F(xM,yM)=0时,约定取Pu。
当F(xM,yM)>0时,取Pd(xi +1,yi-1)
构造判别式:


中点画线法(1/4)

问题:判断距离理想直线最近的下一个象素点 已知:线段两端点(x0,y0),(x1,y1) 直线方程:F(x,y)=ax+by+c=0
a=y0-y1 b=x1-x0 如何判断M点在Q点上方还是在Q点下方?
c=x0y1-x1y0
P2
M
Q
P=(xp,yp) P1
中点画线法(2/4)
y方向走一步
当e<0时,最接近P1(xi+1,yi)
y方向不走步
有除法,不宜硬件实现
Bresenham画线算法(5/7)

e=e×2x,不影响判断的准确性
e0=2y
- x
P
P2
e’
e
当e≥0时,最接近P2(xi+1,yi+1)
y方向走一步
P1
当e<0时,最接近P1(xi+1,yi)
x
图5-11 中点Bresenham画圆的原理
d F ( xM , yM ) F ( xi 1, yi 0.5) ( xi 1)2 ( yi 0.5)2 R2
当d≤0时,下一点取Pu(xi +1,yi); 当d>0时,下一点取Pd(xi +1,yi-1)。
误差项的递推
误差计算
初值:d0=
P
P1
y/ x
P2
当d≥0.5时,最接近P2(xi+1,yi+1)
y方向走一步
当d<0.5时,最接近P1(xi+1,yi)
d P
P1
d’
y方向不走步
Bresenham画线算法(4/7)
为方便与0比较,设e=d-0.5,则
e0=y/ x-0.5
当e≥0时,最接近P2(xi+1,yi+1)

直线上方点: F(x,y)>0 0
直线下M)=F(Xp+1,Yp+0.5) 由d>0,d<0可判定下一个象素
P2 M (Xp+1,Yp+0.5)
P
P1

分两种情形考虑再一下个象素的判定:
d = F(M)=F(Xp+1,Yp+0.5) = a(Xp+1)+b(Yp+0.5)+c
x=x0, y=y0;
for (i=0; idx; i++) { drawpixel (x, y, color); // x=x+1 , e = e+k; x=x+1,e = e+2*dy; if (e0)
基本图形生成算法
点、线、面、字符
线——图元扫描转换
直线段扫描转换 圆(椭圆)弧扫描转换 曲线(第六章)
P2 M P1
d2 = d+a+b
中点画线法(4/4)

d的初始值
d0=F(X0+1,Y0+0.5) =F(X0,Y0)+a+0.5 =a+0.5b 用2d代替d后,d0=2a+b d的增量都是整数
因(X0,Y0)在直线上, 所以F(X0,Y0)=0

优点:
只有整数运算,不含乘除法 可用硬件实现
例:用中点画线法P0(0,0) P1(5,2)
y方向不走步
P2
e P
P1
e’
Bresenham画线算法(6/7)
下一步误差的计算 当e≥0时,y方向走一步
e’=2y/ x - 1 =e + y/ x - 1 e’=e + 2y - 2x
P2
e’
e
当e<0时,y方向不走步
e’=2y/ x=e + y/ x e’=e + 2y
d F ( xM , yM ) F ( xi 1, yi 0.5) ( xi 1)2 ( yi 0.5)2 R2
yi
P
yi-1
d≤0:
d F ( xi 2, yi 0.5) ( xi 2) 2 ( yi 0.5) 2 R 2 ( xi 1) 2 ( yi 0.5) 2 R 2 2 xi 3 d 2 xi 3
图5-1
用一系列的象素点来逼近直线
基本图形生成算法
点、线、面、字符
线——图元扫描转换
直线段扫描转换 圆(椭圆)弧扫描转换 曲线(第六章)
面——多边形区域填充 字符 图形反走样
光栅图形中点的表示

地址线性表 1D表示
(x,y)坐 标
显示屏幕 2D表示
像素由其左下角坐标表示
直线段扫描转换

yi=round(yi)=(int)(yi+0.5)
池州学院
数值微分(DDA)法

增量算法
yi+1 = kxi+1+b = k(xi+1)+b = yi+k
(xi,yi)→(xi+1,yi+k)

缺点:
有浮点数取整运算
不利于硬件实现 效率低
仅适用于k ≤1的情形:x每增加1,y最多增加1。当 k 1时,必须把x,y互换。
P
P1
P2
e P
P1
e’
Bresenham画线算法(7/7)

优点
整数运算,速度快 精度高
乘2运算可用移位实现,适于硬件实现
void Bresenhamline (int x0,int y0,int x1, int y1,int color) { int x, y, dx, dy; float // int e; dx = x1-x0, dy = y1- y0; k=dy/dx, e=-0.5; = 2*dy – dx; // e k, e;
M(xM,yM) α β o
9
计算机图形学
① Fi+1 = Fi – yA Fi+1 = Fi +xA
Fi >=0 Fi <0
数值微分(DDA)法
已知线段端点:P0(x0,y0),
P1(x1,y1)
直线方程
y=kx+b {(xi, yi)},
浮点数取整
i=0,….n.
:
用到浮点数的乘法、加法和取整运算
为方便计算,令e=d-0.5, e的初值为-0.5,增量为k。
当e≥0时,取当前象素(xi,yi)的右上方象素(xi+1,yi+1); 当e<0时,更接近于右方象素(xi+1,yi)。
Bresenham画线算法(3/7)
最大位移方向每次走一步
k<1时,x为最大位移方向
y方向走步与否
P2
d’
d
取决于误差d值的大小
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; xx1, x++)
drawpixel (x, int(y+0.5), color); y=y+k;
例 : 画 直 线 段 P0(0,0)-P1(5,2)
x 0 1 2 0 0 1 int(y+0.5) 0 0.4+0.5 0.8+0.5
1 0 1
Line: P0(0, 0)-- P1(5, 2)
y+0.5 3
2
3
4 5
1
2 2
1.2+0.5
1.6+0.5 2.0+0.5
2
3
4
5
注:网格点表示象素
{
相关文档
最新文档