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

计算机图形学基本图形生成算法

计算机图形学基本图形生成算法

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();

4、二维图形生成li

4、二维图形生成li
④ ② ③ ① 5
6

第一种情况,x1-x0>y1-y0>0。DDA的思路是:x方向增加 1,则y方向增加m= (y1-y0) / (x1-x0) ,这里假定x1>x0,否 则交换起、终点。
m
1
DDA直线生成方法(3)



从起点开始,用递推加法确定直线在格网点上的精确位置 xi+1=xi+1;yi+1=yi+m 对y四舍五入取整数,因为像素坐标都是整数。 用函数画选定的像素: SetPixel(xi+1,int( yi+1+0.5 ), color); 这样画出的直线为8-连通线。
DDA直线生成方法(8)

第四种情况要求y0-y1 > x1-x0>0。也可利 用第一种情况解决。
A C’ A’ B’
C
B
DDA直线生成方法(9)



直线段AB(x0,y0)-(x1,y1)属于第四类直线,对 AB先做关于y=0直线的对称变换,再做关于直线 y=x的对称变换得到A’B’(-y0, x0)-(-y1, x1)。 直线段A’B’ 属于第一类直线,可以用第一种情况 的程序求出每一个直线上的像素C’(x,y)。 需要的是像素C,由C’为(x,y)可知像素C为(y, -x)。 第四类直线(x0,y0)-(x1,y1)的绘制方法总结如 下:用第一种方法对直线(-y0, x0)-( -y1, x1)求 出所有中间像素(x,y),绘制像素(y, -x)。

{ {
比较
DDA方法有一次浮点除法,循环体中有浮 点加法、四舍五入函数 中点方法全部是整型数的加减法和乘2运算

练习:写出“生成直线段的中点算法”的初始条件、 递推公式和终止条件,并用该算法标记出下图A(0,0)、 B(9,3)之间的直线段像素。

第5章基本图形生成算法共118页文档

第5章基本图形生成算法共118页文档

2019/9/21
华中理工大学计算机学院 陆枫
6
99-7
(round(xi+1/k),yi+1)
(xi,yi)
(xi+1,round(yi+k))
图5-3 DDA算法生成直线段
程序 注意:
round(x)=(int)(x+0.5)
2019/9/21
华中理工大学计算机学院 陆枫
7
99-7
特点: 增量算法 直观、易实现 不利于用硬件实现
新为(x+1,y+1),同时将e更新为e-2△x;否则(x,y) 更新为(x+1,y)。 5.当直线没有画完时,重复步骤3和4。否则结束。
2019/9/21
华中理工大学计算机学院 陆枫
24
99-7
程序 几种画线算法的比较
2019/9/21
华中理工大学计算机学院 陆枫
25
99-7
5.2 圆的扫描转换
2019/9/21
华中理工大学计算机学院 陆枫
18
99-7
yi1

xi1 xi yyii 1
1 (d (d
0.5) 0.5)
误差项的计算 • d初=0, • 每走一步:d=d+k • 一旦y方向上走了一步,d=d-1
2019/9/21
华中理工大学计算机学院 陆枫
14
99-7
初始值d的计算
d0 F(x0 1, y0 0.5) y0 0.5 k(x0 1) b y0 kx0 b k 0.5 0.5 k
2019/9/21
华中理工大学计算机学院 陆枫
15
99-7

二维图形生成技术

二维图形生成技术

计算机图形学实验二课程名称:计算机图形学实验名称:二维图形生成技术实验日期:2011-12-07班级:数媒0902班姓名:沈玉婷学号:0305090206一、实验目的和要求1、掌握二维基本图元直线段生成的DDA算法,中点算法、Bresenham算法;2、掌握二维基本图元圆的扫描算法;3、掌握二维图元填充的种子填充算法;4、掌握二维图元填充的多边形扫描线算法。

二、实验内容1、编程实现利用交互形式确定直线的两端点,并实现DDA、中点算法和Bresenham算法生成直线2、推导1/4圆的中点画圆算法,并编程实现。

3、构造任意一个边界表示的多边形,假定该多边形内部是四连通的。

要求:用递归算法实现对多边形内部的填充,要求内部颜色和边界不一致。

三、实验步骤假设已知P(xi,yi),则可能的下一个像素只能是P1(xi+1,yi)或者P2(xi+1,yi+1),构造圆函数为F(x,y)=x²+y²-R²圆上的点(x,y),有F(x,y)=0;圆外的点(x,y),有F(x,y)>0;圆内的点(x,y),有F(x,y)<0。

构造原函数:F(x,y)= x2+y2-R2..构造判别式:di=F(Mi)=F(xi+1,yi-0.5)=(xi+1)2+(yi-0.5)2-R21.di<0,则应取P1(xi+1,yi)为下一像素:di+1=F(xi+2,yi-0.5)=(xi+2)2+(yi-0.5)2-R2=di+2xi+32.di>=0,则应取P2(xi+1,yi-1)为下一像素:di+1=F(xi+2,yi-1.5)=(xi+2)2+(yi-1.5)2-R2= di+2(xi-yi)+5若按顺时针方向生成1/4圆,则第一个像素是(0,R),则判别式的初值:d0=1.25-R,进一步整理可令:d0=1-R;程序中令:xx=0,yy=r;dtx=3,dty=2-2*r;d=1-r;画四分之一圆,令yy>=0即可;其中按照di的正负确定下一像素的位置,逐渐画出四分之一的圆。

第3章-2D基本图形生成算法

第3章-2D基本图形生成算法
漫水算法扫描线种子填充法多边形的扫描转换主要是通过确定穿越区域的扫描线的覆盖区间来填充活性边表法内点表示枚举处区域内部的所有像素内部的所有像素着同一个颜色边界像素着与内部像素不同的颜色边界表示枚举出边界上所有的像素边界上的所有像素着同一颜色内部像素着与边界像素不同的颜色55种子填充法区域填充对区域重新着色的过程将指定的颜色从种子点扩展到整个区域的过程区域填充算法要求区域是连通的连通性4连通8连通8连通例子
Bresenham画线算法(1/7)

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

优点
整数运算,速度快 精度高 乘2运算可用移位实现,适于硬件实现
void Bresenhamline (int x0,int y0,int x1, int y1,int color) { int x, y, dx, dy; float k, e; // int e; dx = x1-x0, dy = y1- y0; k=dy/dx, e=-0.5; // e = 2*dy – dx; 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) { y++, e = e-1;} // { y++, e = e-2*dx;} } }

第二章 二维图形生成技术

第二章 二维图形生成技术

x 0 1 2 3 4
Line: P0(0, 0)-- P1(5, 2) 3 2 1 0 1 2 3 4 5
中点画线法(5/6)
d的初始值 Nhomakorabead0=F(X0+1,Y0+0.5) =F(X0,Y0)+a+0.5 =a+0.5b 用2d代替d后,d0=2a+b d的增量都是整数 只有整数运算,不含乘除法 可用硬件实现
float dx,dy,x,y,steps; int x1=0,y1=0,x2=200,y2=100,i; if(abs(x2-x1)>abs(y2-y1)) steps=(float)abs(x2-x1); else steps=(float)abs(y2-y1); dx=(x2-x1)/steps; dy=(y2-y1)/steps; x=(float)x1; y=(float)y1; for(i=1;i<=steps;i++) { pDC->SetPixel((int)(x+0.5),(int)(y+0.5),RGB(0,0,255)); x=x+dx; y=y+dy; }
因(X0,Y0)在直线上, 所以F(X0,Y0)=0

优点:


/* 算法2.2*/
中点画线法(6/6)
void Midpoint Line (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); } /* while */ } /* mid PointLine */

2D简单图形相关算法罗列

2D简单图形相关算法罗列

2D简单图形相关算法罗列因为平常在Qt开发过程中经常会与⼀些简单的2D⼏何图形打交道,因此学习和掌握⼀些基本的2D⼏何计算还是很有必要的,在这⾥罗列⼀些常⽤的基本情况,之后会适时补充。

[1] 两点之间距离,根据两个点的差值算出对应的向量,然后算出这个向量的斜边开放即这两点的距离。

qreal distance(const QPointF &pt1, const QPointF &pt2){QPointF offset = pt1 - pt2;return sqrt(offset.x() * offset.x() + offset.y() * offset.y());}[2] 计算两条直线的交点QPointF intersection(const QPointF &pt1, const QPointF &pt2, const QPointF &pt3, const QPointF &pt4){// ⾸先根据两点式 (y - y1) / (y2 - y1) = (x - x1) / (x2 - x1)// 得出 y = (y2 - y1) / (x2 - x1)(x - x1) + y1// 其中(y2 - y1) / (x2 - x1)为斜率k// 即 y = k(x - x1) + y1// 两线平⾏即k1 == k2// ⼀线平⾏y即 p1.x == p2.xint state -- 标志位⽤来进⾏简单的情况判断if (pt1.x() != pt2.x()){a = (p2.y() - p1.y()) / (p2.x() - p1.x());state |= 1; // 1即01}if (pt3.x() != pt4.x()){b = (p4.y() - p3.y()) / (p4.x() - p3.x());state |= 2; // 2即10}switch(sate){case0: // 既不是01也不是10,即两线同时平⾏于Yreturn QPointF();case1: // 第⼀条直线斜线,第⼆条直线平⾏于Yfloat x = p3.x();float y = a * x - a * p1.x() + p1.y();return QPointF(x, y);case2: // 第⼆条直线斜线,第⼀条直线平⾏于Yfloat x = p1.x();float y = b * x - a * p3.x() + p3.y();return QPointF(x, y);case3: // 两条直线都存在斜率if (a == b)return QPointF();float x = (a * p1.x() - b * p3.x() - p1.y() + p3.y()) / (a - b);float y = a * x - a * p1.x() + p1.y();return QPointF(x, y);}}[3] 返回⼀点到直线的垂直交点的坐标QPointF Formula::verticalCrossPoint(const QPointF &pt1, const QPointF &pt2, const QPointF &pt3){if((fabs(pt1.x() - pt2.x()) < 1e-6)) // 判断是否平⾏于Y轴{return QPointF(pt1.x(), pt3.y());}// 直线 y = ax + b, 垂线则为 -ay = x - m// 直线斜率为k,垂线斜率为-1/kqreal a = (pt1.y()- pt2.y()) / (pt1.x()- pt2.x());qreal b = (pt1.y()- a * pt1.x());qreal m = pt3.x() + a * pt3.y();// 硬解求出交点QPointF ptCross;ptCross.setX((m - a * b) / (a * a + 1));ptCross.setY(a * ptCross.x() + b);return ptCross}[4] 判断点是否在直线上,需要注意的是,浮点数与0的⽐较通常为 < 1e-6。

2D基本算法

2D基本算法

結束
第八章 2D基本算法
結束
第八章 2D基本算法

假设背景长宽是一张640X480的图,而我 们屏幕的画框长宽也是640X480,如下图:
結束
第八章 2D基本算法

如果我们的背景图要从屏幕左方往屏幕右方 移入的话,就必须去抓取会显示在屏幕中的 部份背景图,如下图所示:
結束
第八章 2D基本算法
第八章 2D基本算法
组织图块

斜角视觉与直角视觉都有一个本质的区别,
就是用于拼接地图的图块都是有高度的, 而我们可以通过这一个属性来方便实现遮 掩算法。
結束
第八章 2D基本算法
結束
第八章 2D基本算法
地图单元格式
bit 15 bit 14 地图链接标志 人物标志
bit 13
bit 12 bit 8~11 bit 0~7
游戏则可以很容易被玩家们所接受。
結束
第八章 2D基本算法
XY坐标系统

以数学的角度而言,X坐标代表象限中的横 向坐标轴;而Y坐标代表象限中的纵向坐标 轴,如下图所示
結束
第八章 2D基本算法

在屏幕坐标系统中,它的Y坐标值是向下
递增的:
結束
第八章 2D基本算法
基本贴图

要在一张纸上画出一个矩形的几何图形,只 要知道这个矩形在纸上的左上角坐标,及矩 形的长与宽,就能画出一个矩形来,如下图:
月下夜想曲」。
結束
第八章 2D基本算法
循环贴图

横向滚动条最简单的作法就是将背景画成一张 大型的图形,再依据我们显示模式的大小来抓 取欲显示的部份
結束
第八章 2D基本算法

要看到公交车的右半部,我们势必要移动 公交车的图才行
  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
注:网格点表示象素
{
相关文档
最新文档