第3章 基本图形生成

合集下载

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

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

基本图形生成算法
点、线、面、字符

线——图元扫描转换
直线段扫描转换 圆(椭圆)弧扫描转换
曲线(第六章)

面——多边形区域填充


字符
图形反走样
圆弧的扫描转换

圆的八对称性
只考虑第二个八分圆
y
(-x,y) (x,y)

假设圆心在原点 x2+y2=R2
(-y,x) (-y,-x) (-x,-y)
注:网格点表示象素
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;
e0=y/ x-0.5
y方向走一步
当e<0时,最接近P1(xi+1,yi)
y方向不走步
有除法,不宜硬件实现
Bresenham画线算法(5/7)
e=e×2x,不影响判断的准确性 e0=2y - x 当e≥0时,最接近P2(xi+1,yi+1) y方向走一步 P 当e<0时,最接近P1(xi+1,yi) y方向不走步
a = y0-y1=-2, b = x1-x0 = 5 d0 = 2a+b = 1, d1= 2a = - 4, d2 = 2(a+b)=6
i 1 2 3 4
xi 0 1 2 3
yi 0 0 1 1 2
d 1 -3 3 -1 5

CG第3章基本图形生成算法C课件

CG第3章基本图形生成算法C课件

int dy=yr-y1, dx=xr-x1;
int ie;
/* integer scaled error term */
x=xl; y=yl; /* start at left endpoint */
ie =dx-2 *dy; /* initialize the error term */
while (x <= xr){ /* pixel-drawing loop */
2024/2/22
16
0≤m≤1时Bresenham算法的步骤为:
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更新为
yi1
yi yi
1
(di 0) (di 0)
Pa (xi 1, yi 1)
Q
问题:算法结束了吗? 有无优化的可能?
M (xi 1, yi 1/ 2)
P(xi , yi ) Pb (xi 1, yi )
注意:计算di 的运算量并不小.
2024/2/22
12
误差项的递推 若di<0,有
di1 F ( xi 2, yi 1.5) yi 1.5 m(xi 2) b yi 1.5 m(xi 1) b m di 1 m
M (xi 2, yi 1.5)
Q
M (xi 1, yi 0.5)
P(xi , yi )
2024/2/22
di<0
13
误差项的递推 若di≥0,有
di1 F (xi 2, yi 0.5) yi 0.5 m(xi 2) b yi 0.5 m(xi 1) b m di m

计算机图形学第3章 基本图形生成算法

计算机图形学第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不 可能出现。

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

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

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

第3章基本图形的生成与计算2

第3章基本图形的生成与计算2

的中点对准直线的一端点,然后让刷子中心往直线的另
一端移动,即可“刷出”具有一定宽度的线。如下图
3.5.1所示:
2021年3月9日星期二
4
3.5 线宽的处理与字符的生成
5个象素长 的线刷子
第3章 基本图形的生成与计算
图3.5.1 用线刷子绘制的具有 5个象素宽的线
注意:在具体实现线刷子时,只要对直线扫描转换算法 的内循环稍作修改即可。例如:对于斜率在[-1,1]之 间的直线,若要生成一定象素宽的线,只需把每步迭代 所得的点的正上方和正下方半线宽之内的像素全部置成 直线颜色。
点阵字符的显示分为两步。首先从字库中将它的位图检
索出来。然后将检索到的位图复制到帧缓冲器中指定的单 元。在拷贝过程中,可以施加变换,以获得简单的变化。
例如:图3.5.11(b)~(d)列出了P字母原型的一些变化 例子。相应的变换算法是:
(a)
(b)
(c)
(d)
图3.5.11
2021年3月9日星期二
➢ 一般英文常采用的点
3F
阵大小有5X7、7 X 9、8
1111 1110
X 8、16 X 16;汉字常采 用16X16、24X24、40X40、
FE
72X72点阵字符。
2021年3月9日星期二
16
3.5 线宽的处理与字符的生成
第3章 基本图形的生成与计算
又如有图3.5.10所示:一个8X8的英文字母B
1.标题行中,形编号是1到255的整数值;字节数表 示形定义描述行中包括结束符0在内的字节数目;形名称 用大写字母才可以被调用,否则只作为形的一种解释性信 息,不存入存储器,因而不占用存储空间。
2021年3月9日星期二

第三章 图形生成图像的基本原理

第三章 图形生成图像的基本原理

(y,-x) (x,-y)
程序:
MidCircle18(int r) { int x,y; float f; x=0; y=r; f=1.25-r; //注意f为下一点(1,r-0.5)的判别式 point(x,y); while(x<=y) { if(f<0) f+=2*x+3; else { f+=2*(x-y)+5; y--;} x++; point(x,y); } }
第三章 图形生成图像的基本原理
3.1 图形图像的关系:
1)区别: 图形是用矢量表示的,是用几何学的点、线、面对客观世界建模的 结果。图形中不但包含几何信息,而且可以包含拓扑、颜色等非几何信 息。这些信息是设备无关的。 图像是用点阵表示的,其中只有各个点的颜色信息,不含拓扑关系, 也没有几何学的点、线、面。从数学上说,图像是定义域和值域都不连 续的一个函数(数字图像)。 图形和图像各有其优点,图形适合表达几何信息(建模),图像适 合表达视觉信息(照片)。 2)存储: 图形使用矢量文件,图像使用点阵文件。 3)转换关系: 图形通过光栅扫描可以转化为光栅图像;图像通过识别和处理可以 转化为矢量表示的图形形式,但通常它无法恢复图形信息。
实例:用DDA方法在点(0,0)和(5,2)之间画线
n=5 (x0,y0) = (0,0) (xn,yn) = (5,2) k=(2-0)/(5-0) = 0.4
xi 0 1 2 3 4 5
yi 0.0 0.4 0.8 1.2 1.6
int(yi+0.5) 0 1 1 2 2
动画
2)Bresenham算法 (最常用)
对于内点表示和边界表示的8连通区域的填充,只要将上述相应代码 中递归填充相邻的4个象素增加到递归填充8个象素即可。

基本图形元素的生成算法

基本图形元素的生成算法

(x,y)
画点
(0,0)
(1,0.5)
(0,0)
(1,1)
(2,1)
(3,1.5) (4,2) (5,2.5)
(2,1)
(3,2) (4,2) (5,3) (6,3) (7,4) (8,4)
计 算 机 图 形 学
(6,3) (7,3.5) (8,4)
第三章 基本图形元素的生成算法
例:(0,0)到(-8,-4)画直线 dx=-8;dy=-4;k=-4/(-8)=1/2;
计 算 机 图 形 学
(3,3)
(4,4) (5,5)
(3,3)
(4,4) (5,5)
第三章 基本图形元素的生成算法
例: (0,0)到(8,4)画直线
dx=8,dy=4,k=4/8=1/2<1 x=x+1,y=y+k=y+1/2 for(x=x1;x<=x2;x++) {putpixel(x,round(y+0.5);y=y+k);}
x
(x1,y1)
y
图3.1 屏幕点的表示 计 算 机 图 形 学 显示器的分辨率,常用H•V表示。 H—水平方向分辨率,如320、640、1024等,取8的倍数。 V—垂直分辨率。
第三章 基本图形元素的生成算法
如果屏幕坐标为(x1,y1)位置要显示一个像素发亮,就 要在显示缓冲区的对应地址处,写入一个灰度级别或色 彩值。假设显示缓冲区的位面为字节编址,其首地址为S, 像素数据的每一位分散存放在各个位平面的相同位置处。 像素在屏幕上的位置与像素在位面上的地址成一定的映 像关系。
x i 1 x i x y i 1 y i y
计 算 机 图 形 学

第3章基本图形的生成与计算

第3章基本图形的生成与计算
1.数值微分法(DDA法)
2.中点画线算法
3.直线的Bresenham算法
2021年3月4日星期四
14
3.2 直线段的生成算法
第3章 基本图形的生成与计算
画一条从(x1,y1)到(x2,y2)的直线,实质上是确定 最佳逼近直线的像素序列,并填入色彩数据的过程。
当我们对直线进行光栅化时,只能在显示器所给定的 有限个象素组成的矩阵中,确定最佳逼近于该直线的一 组象素,并且按扫描线顺序,对这些象素进行写操作, 这就是通常所说的用显示器绘制直线或直线的扫描转换。
2021年3月4日星期四
10
3.1 基本绘图元素
第3章 基本图形的生成与计算
✓ 1.在几何学中,一个点即没有大小,也没有维数,点只是 表示坐标系统中的一个位置。
✓ 2.在计算机图形学中,点是用数值坐标来表示的。在直角 坐标系中点由(x,y)两个数值组成的坐标表示,在三维坐 标系中点由(x,y,z)三个数值组成的坐标表示,如下图:
此时 |K|<1
本算法的基本思想:从直线的起点开始,选定 x2 x1 和
y2 y1 中较大者为步进方向,不妨假设 x2 x1 较大,即让 x从起点到终点变化,每步递增1(即一个像素单位),然
后利用递推式 yi1 yi kx 计算相应的y值,取像素
点 ( xi 1, round ( yi1) )作为当前点坐标输出到显示器上, 则得到光栅化的直线。
第3章 基本图形的生成与计算
Loading …………
欢迎进入
第 3章
第3章 基本图形的生成与计算
本章概述:主要介绍了基本图形的生成与计
算,包括:基本绘图元素,直线段、圆与椭圆的 生成算法,区域填充算法,字符的生成,图

第三讲基本图形生成

第三讲基本图形生成
`

两种定义方法: 1)像素理想化为点
2)像素有一定面积
`
2013年8月13日11时54分

倘若已知直线段两端点的坐标(x0,y0)(x1,y1), 如何求得屏幕上显示的各点的坐标?
2013年8月13日11时54分
根据直线方程表达式: y=m×x+b 其中:m是直线的斜率, b是y方向的截距。
2013年8月13日11时54分
(x,y)坐标

地址线性表 1D表示 显示屏幕 2D表示
像素由其左下角坐标表示
y ymax ymin x
xmin
xmax
地址 = (xmax-xmin) * (y-ymin) + (x-xmin) + 基地址
每行像素点数
行数
行中位置
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)
直线Bresenham算法描述
由图中可以知道:在x=xi+1处,直线上点的y值是y=m(xi+1)+b,该 点离象素点(xi+1,yi)和象素点(xi+1,yi+1)的距离分别是d1和d2: d1=y-yi=m(xi+1)+b-yi d2=(yi+1)-y=(yi+1)-m(xi+1)-b 两个距离差是 d1-d2=2m(xi+1)-2yi+2b-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章基本图形的生成

y=y+k;
//计算y的值
}
4 分析:
本算法中k值需要使用浮点,每一步都要进行取整运算, 不利于硬件实现。可以用中点画线法解决。
3.2.2 中点画线法: 一 原理:
P2 Q
M
P5
ax+by+c=0
M2
P4 M1
P
P1
P3
中点画线法示意图
1 有直线F(x,y)=ax+by+c=0,假定其斜率在0,1之间. 2 直线在x方向增加一个单位,则在y方向上的增量只能在0与1之间。 3 当前点为P(xp,yp),下一点有两种选择:P1(xp+1,yp)或P2(xp+1,yp+1). 4 Q点是直线与垂直线x=xp+1的交点。M(xp+1,yp+0.5)为 P1与P2的中点。
(1) 绘图函数具有局限性: 在实际工作中遇到画线的工作时,可以方便地调用程序设计 语言中提供的绘图函数,不需要自己编写画线的程序。 但它由局限性,不能满足用户特殊绘图要求,需要开发出满 足需求的绘图程序。
(2) 学习目的: 掌握将数学的、模拟的、线形的图形变成数字的离散的图形 的过程中的设计思想和方法,这些思想能够在科学研究和产 品开发中发挥作用。
例: 要在屏幕上显示一条直线时,只能确定出逼近直线的 一组像素, 并按扫描线顺序对这些像素进行写操作,即进行扫描转换。
结果: 使所画的直线转换成为逼近理想直线的由无数个点构成的集合 。
画图形:可使用同样的方法,即进行图形的扫描转换.
使所画的图形转换成为逼近理想图形的由 无数个点构成的集合 。
二 扫描转换(光栅化):
对每一个象素计算判别式d,根据它的符号判定下一个象素。 d是xp,yp的线形函数,可以采用增量计算来提高运算效率。

第3章 基本图形元素生成算法

第3章 基本图形元素生成算法

中点画线法的伪C算法描述如下:
void MidPoint-Line(x0, y0, x1, y1, color) int x0, y0, x1, y1, color;
{ int a, b, delta1, delta2, d, x, y;
a=y0-y1; b=x1-x0; d=2*a+b delta1=2*a;
x
1
2
3
4
5
6
y
1
1
2
2
3
3
第 3 章 基本图形元素生成算法
第 3 章 基本图形元素生成算法
让y每次增加1 1/k=5/2=2.5 y1=y0+1=1+1=2 x1=x0+1/k=1+2.5=3.5 Round(3.5)=4 y2=y1+1=2+1=3 x2=x1+1/k=3.5+2.5=6
y x
第 3 章 基本图形元素生成算法
3.1 直线的扫描转换 3.2 圆和椭圆的扫描转换
直线的扫描变换(用显示器绘制直线): 在显示器所给定的有限个象素集合组成的矩阵中,确定 最佳逼近于该直线的一组象素.
第 3 章 基本图形元素生成算法

画点
在给定位置显示一个点将指令中的坐标值 (x,y)转换成偏转电压偏转电压定位电子束撞 击屏幕的位置。
//画点函数,color :颜色值。
} }
第 3 章 基本图形元素生成算法
例1: 设p0(x0=1, y0=1),p1(x1=6,y1=3),由p0到p1画一直线. 解: dy=y1-y0=3-1=2 dx=x1-x0=6-1=5 k= y/ x=2/5=0.4 (ROUND(k)<1)

第3章基本图形生成算法

第3章基本图形生成算法

P1,p2两点到圆心的距离的平方与圆弧上一点到圆 心的距离的平方之差分别为:
D(p1)=(x+1)2+y2-R2 D(p2)=(x+1)2+(y-1)2-R2 如果|D(p1)|≥|D(p2)|则点p2比点p1更接近实际 的圆弧;反之,则应选择点p1。 若定义: d =|D(p1)|-|D(p2)| 若d≥0 选p2,若d<0选p1。
❖ 当di<0时d,i1选Sdii, 2dy
❖ 由于只包含加、减法和左移(乘2)的 运算,而且下一个像素点的选择只需检查di
❖ 3.1.4 直线属性 ❖ 1.线型 ❖ 2.线宽 ❖ 3.线色
v3.2.1 3圆.2的特生性成圆弧的常用算法
v 圆心位于原点的圆有四条对称轴:x=0, y=0,x=y和x=-y直线。若已知圆弧上一点 (x,y),可以得到其关于四条对称轴的其它 7个点,这种性质称为八对称性,如下图所 示。
图形系统的任务之一就是将在连续空间中定义的几何元 素转化为图像空间中的像素表示。这一转化任务称为扫 描转换或光栅化。
扫描转换
矢量图形
光栅图形
3.1 生成直线的常用算法

均假定所画直线的斜率k∈[0,1]。
❖ 3.1.1 DDA画线算法

DDA(Digital Differential Analyzer)
❖ 令a=y0-y1,b=x1-x0,c=x0y1-x1y0。 ❖ 构造判别式:
❖ d=a(xp+1)+b(yp+0.5)+c ❖ d的初始值d0 = a+0.5b ❖ 在d≥0的情况下,取正右方像素P1, ❖ d1=a(xp+2)+b(yp+0.5)+c =d+a ❖ 在d<0的情况下,取右上方像素P2, ❖ d2=a(xp+2)+b(yp+1.5) = d+a+b

第3章 基本图形元素生成算法

第3章 基本图形元素生成算法

void MidPoint
int r, clor; { int x, y, e;
-Circle(r, color)
x=0; y=r; e=1-r ; putpixel(x, y, clolor);
while (x<y)
{ if (e<0) { e+=2*x+3; x++;
} else { e+=2*(x-y)+5; x++; y--; } putpixel(x, y, clolor); } }
故在d<0的情况下, d的增量为a+b。
再讨论d的初始值。 第一个像素应取左端点(x0,y0),
相应的判别式为 d0=F(x0+1, y0+0.5)=a(x0+1)+b(y0+0.5)+c =ax0+by0+c+a+0.5b =F(x0, y0)+a+0.5b
d的初始值为:a+0.5b
中点画线法的伪C算法描述如下:
图 3.2 Bresenham算法误差项d的几何意义
算法的伪C描述如下:
void Bresenham -Line(x0, y0, x1, y1, color) int x0, y0, x1, y1, 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; i<=dy; i++)
{ putpixel(x, y, color); x=x+1; e=e+k; if(e>=0){ y=y+1;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

当|k|>1时, △x < △y 时 可以让y从起点到终点变 可以让 从起点到终点变 (xi+1, (int)(yi+0.5)) 每步递增(或递减 或递减)1, 化 , 每步递增 或递减 , (xi, yi) 即△y=±1,用(3–3)式计算 ± 用 式计算 (xi+1, yi) 对 应 的 x 增 量 , 即 (xi,(int)(yi+0.5)) △x=±1/k。 ± 。 图3.1 数值微分法示意图 若前一次的直线上像素点坐标为(x 若前一次的直线上像素点坐标为 i , yi),这一 , , 次的直线上像素点坐标为 (xi+1, yi+1),则 yi+1 = yi ±1 , xi+1=xi±1/k。随后用 。随后用putpixel 函数输出 该像素的颜色值即可。 该像素的颜色值即可。
Visual C++的CDC图形程序库已提供了画线、 图形程序库已提供了画线、 的 图形程序库已提供了画线 画圆和椭圆、填充等基本图形的绘制函数, 画圆和椭圆、填充等基本图形的绘制函数,它们实 质上是按计算机图形标准并以C++的语法约定提供 质上是按计算机图形标准并以 的语法约定提供 给用户使用的标准图形生成算法。因此, 给用户使用的标准图形生成算法。因此,从实用的 角度出发,用户只需完全按照C++的语法约定使用 角度出发,用户只需完全按照 的语法约定使用 这些图形程序库, 这些图形程序库,就没有必要学习基本图形的生成 原理及算法。 原理及算法。 但是,基于下面的二个理由, 但是,基于下面的二个理由,我们认为学习本 章介绍的基本图形生成原理及算法是非常有必要的。 章介绍的基本图形生成原理及算法是非常有必要的。
的增量为a+ 。 故d的增量为 +b。 的增量为 再看d的初始值 。 再看 的初始值。 直线的第一个像素为左端点 的初始值 (x1, y1) ,所以相应的判别式值为 d0 = F(x1+1, y1+0.5)=a(x1+1)+b(y1+0.5)+c = (ax1+by1+c)+a+0.5b = F(x1,y1)+a+0.5b 由于(x1, y1)在直线上,故F (x1, y1) = 0。因此,d 在直线上, 由于 在直线上 。因此, 的初始值为d 的初始值为 0 = a+0.5b。 + 。 由于我们使用的只是d的符号,而且d的增量都 由于我们使用的只是 的符号,而且 的增量都 的符号 是整数,只是其初始值包含小数。因此, 是整数,只是其初始值包含小数。因此,我们可以 代替d, 用2d代替 ,就可以写出仅包含整数运算的中点画 代替 线算法(斜率在 斜率在0~ : 线算法 斜率在 ~l):
P2 Q
M
直线方程为: 直线方程为: P=(xp,yp) P1 F (x, y)= ax + by + c =0 假设直线的起点和终点分别为( 则上述参数: 假设直线的起点和终点分别为(x1,y1)和(x2,y2),则上述参数: a = y1 - y2,b = x2 - x1,c = x1y2 - x2y1。
在计算机上画线一般都是给定两个坐标点(x1, 在计算机上画线一般都是给定两个坐标点 y1)和(x2, y2),要求画出它们的直线。当要在屏幕 和 ,要求画出它们的直线。 上显示一条直线时,只能在显示器所给定的有限个 上显示一条直线时, 像素矩阵中,确定最佳逼近于该直线的一组像素, 像素矩阵中,确定最佳逼近于该直线的一组像素, 对这些像素进行写操作。 对这些像素进行写操作。这就是通常所说的在显示 器上绘制直线,或直线的扫描转换。 器上绘制直线,或直线的扫描转换。 直线的斜率截距方程为: 直线的斜率截距方程为: y = k·x + b 其中, 表示斜率 表示斜率, 是 轴截距 轴截距。 其中,k表示斜率,b是y轴截距。
对于直线上的点, ( , ) ; 对于直线上的点,F(x,y)= 0; 对于直线上方的点: ( , ) ; 对于直线上方的点:F(x,y)>0; 对于直线下方的点, , 对于直线下方的点,F(x,y)<0。 。 因此,欲判断前述Q在 的上方还是下方 的上方还是下方, 因此,欲判断前述 在M的上方还是下方,只要把 M代 代 入 F(x,y),并判断它的符号。 ( , ) 并判断它的符号。 构造判别式 d=F(M)=F(xp+1, yp+0.5)=a(xp+1)+b(yp+0.5)+c 在直线上方( 的上方), 当 d>0时,M在直线上方(即在 的上方),故应取 时 在直线上方 即在Q的上方),故应取 右方的P 作为下一个像素。而当d<0,则应取右上方的 2。 右方的 1作为下一个像素。而当 ,则应取右上方的P 当d = 0时,约定取右方 1。 时 约定取右方P 对每一个像素计算判别式d,根据它的符号确定下一像素。 对每一个像素计算判别式 ,根据它的符号确定下一像素。
3.1.2 中点画线法
这里先讨论直线斜率在0~ 之间 如图3 所示 之间。 所示, 这里先讨论直线斜率在 ~l之间。如图3.2所示, 若直线在x方向上增加一个单位 则在y方向上的增 方向上增加一个单位, 若直线在 方向上增加一个单位,则在 方向上的增 量只能在0~ 之间 之间。 量只能在 ~1之间。假设直线上当前已确定的一个 用实心小圆表示。 像素点坐标为( 像素点坐标为(xp,yp),用实心小圆表示。 那么,下一个与直 那么, 线最近的像素只能是正 右方的P 右方的 1(xp+1、yp)或 右上方的P 右上方的 2(xp+1、yp+1) 两者之一, 两者之一,用空心小圆 表示。 表示。
由于d是 的线性函数,可采用增量计算, 由于 是xp和yp的线性函数,可采用增量计算, 以便提高运算效率。 以便提高运算效率。 的情况下, 在d≥0的情况下,取正右方像素 1(xp+1,yp)欲判 的情况下 取正右方像素P 欲判 再下一个像素应取那个 应取那个, 断再下一个像素应取那个,应计算 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 的增量为a。 故d的增量为 。 的增量为 在d<0时,取右上方像素 2(xp+1,yp+1)。要判 时 取右上方像素P 断再下一个像素 下一个像素, 断再下一个像素,应计算 d2 = F(xp+2, yp+l.5)=a(xp+2)+b(yp+1.5)+c = (a(xp+1)+b(yp+0.5)+c)+a+b = d + a + b
3.1.1 数值微分法
对直线上任何给定的x的增量 △ 和 的增量 的增量△ , 对直线上任何给定的 的增量△ x和 y的增量 △ y, 的增量 有下列计算公式: 有下列计算公式: △y = k·△x △ (3–2) (3–3) 或 △x = △y / k 当斜率绝对值|k|<1时: △x > △y 时 当斜率绝对值 可以让x从起点到终点变化 每步递增(或递减) , 从起点到终点变化, 可以让 从起点到终点变化,每步递增(或递减)1, 即令△x =±1,则△y =±k。若前一次的直线上像 即令△ ± , ± 。 , 素点坐标为 (xi,yi),这一次的直线上像素点坐标为 (xi+1,yi+1),则xi+1 = xi±1,yi+1 = yi±k。随后用 , , 。 putpixel 函数输出该像素的颜色值即可。见图 。 函数输出该像素的颜色值即可。见图3.1。
众所周知, 众所周知,目前我们使用的主要图形输出设备 显示器和打印机本质上是一种画点设备, 显示器和打印机本质上是一种画点设备,是由一定 数量的网格状细小光点,使其某些像素亮, 数量的网格状细小光点,使其某些像素亮,某些像 素不亮来显示图形或文字的。 素不亮来显示图形或文字的。 所谓的基本图形生成原理是指在点阵输出设备 的情况下, 的情况下,如何对一条斜的直线或弯曲的曲线尽可 能快地输出其最接近理想的直线或曲线。 能快地输出其最接近理想的直线或曲线。
第一, 第一,基本图形生成原理及算法是计算机图形 学的基本原理,如果不学习这些基本原理, 学的基本原理,如果不学习这些基本原理,那么以 后还要涉及的其他计算机图形学原理就无从谈起; 后还要涉及的其他计算机图形学原理就无从谈起; 第二, 虽然提供了许多绘图函数, 第二,Visual C++虽然提供了许多绘图函数, 虽然提供了许多绘图函数 但总有满足不了用户特殊绘图要求的时候。 但总有满足不了用户特殊绘图要求的时候。如果 仅仅学会使用Visual C++的绘图函数,不掌握基本 仅仅学会使用 的绘图函数, 的绘图函数 图形生成原理及算法, 图形生成原理及算法,那么你就永远无法超越 Visual C++的限制。 的限制。 的限制
第3章 基本图形生成
现在的计算机能够生成非常复杂的图形, 现在的计算机能够生成非常复杂的图形 , 但 图形无论多么复杂, 图形无论多么复杂 , 它都是由基本图形组合而成 因此, 的 。 因此 , 学习基本图形的生成算法是掌握计算 机图形学的基础。 机图形学的基础。 本章主要讨论一些基本图形的生成原理, 本章主要讨论一些基本图形的生成原理,如 直线、 椭圆的生成问题,二维封闭图形( 直线、圆、椭圆的生成问题,二维封闭图形(多 边形、 椭圆)的填充问题(包括颜色填充、 边形、圆、椭圆)的填充问题(包括颜色填充、 影线填充和图案填充)以及线型和线宽的处理。 影线填充和图案填充)以及线分算法 简称DDA)。以下是用数 (Digital Differential Analyzer简称 简称 。 值微分算法(DDA)生成直线 斜率在 ~l)的C语言描述。 生成直线(斜率在 语言描述。 值微分算法 生成直线 斜率在0~ 的 语言描述 void DDALine (int x1, int y1, int x2, int y2, int color) { int x; float k,dx,dy,y =y1 ; dx =x2-x1;dy =y2-y1;k=dy/dx; for (x = x1;x <=x2;x++) { putpixel (x, (int)(y+0.5), color); y=y+k; } }
相关文档
最新文档