工程计算机图形学第三章二维基本图形生成算法
计算机图形学第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不 可能出现。
计算机图形学_ 二维图形变换_53 二维图形变换原理及齐次坐标_
为什么要采用齐次坐标?
在笛卡儿坐标系内,向量(x,y)是位于z=0的平面上的点 ;而向量(x,y,1)是位于z=1的等高平面上的点
对于图形来说,没有实质性的差别,但是却给后面矩阵运 算提供了可行性和方便性
假如变换前的点坐标为(x,y),变换后的点坐标为(x*,y* ),这个变换过程可以写成如下矩阵形式:
x*, y*x,
x* a1x b 1 y c1
y•M
x*, y*x
a1
y
1
b 1
c1
a2 b2 c2
上两式是完全等价的。对于向量(x,y,1),可以在几何意义 上理解为是在第三维为常数的平面上的一个二维向量。
这种用三维向量表示二维向量,或者一般而言,用一个n+1维 的向量表示一个n维向量的方法称为齐次坐标表示法
n维向量的变换是在n+1维的空间进行的,变换后的n维结果 是被反投回到感兴趣的特定的维空间内而得到的。
如n维向量(p1,p2,...,pn)表示为(hp1,hp2,...,hpn,h), 其中h称为哑坐标。 普通坐标与齐次坐标的关系为“一对多”:
变换图形就是要变换图形的几何关系,即改变顶点的坐 标;同时,保持图形的原拓扑关系不变
仿射变换(Affine Transformation或 Affine Map)是一 种二维坐标到二维坐标之间的线性变换 (1)“平直性”。即:直线经过变换之后依然是直线
(2)“平行性”。即:平行线依然是平行线,且直线上 点的位置顺序不变)
采用了齐次坐标表示法,就可以统一地把二维线形变换表示 如下式所示的规格化形式:
二维图形生成原理
改进的有效(活性)边表算法-数据结构
(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个交点的顶点
改进的有效(活性)边表算法
计算机图形技术
矢量图形与图象的区别:
➢ 矢量图形可以容易缩放而不影响图形的输出 质量
图像
放大前
Autocad图形文件
放大后
放大前
放大后
二、图形生成技术与算法
1.基本图形元素的生成 (1)线段的生成 (2)圆弧的生成 (3)区域填充 2.自由曲线和曲面生成
dy y dx x
(1)线段的生成
一、窗口区及视图区的坐标变换
❖ 窗口区 ❖ 视图区 ❖ 窗口区与视图区的变换
窗口区
24
窗口区:用户选定的观察区域,图形中的
某一部分 。
视图区
视图区:显示窗口图 屏幕
形,小于或等于屏幕 范围的区域。
(v2,v4) (v1,v3)
3.窗、视变换
➢ 窗口中的点(XW,YW )对应屏幕视图区中 的点(XV,YV ),其变换公式为
➢ 通过离散数据采用插值法或曲线拟合法加以构造 ① 拟合:完全通过或比较贴近给定点来构造曲线或曲面的方法 ② 插值:求在曲线或曲面上给定点之间的点 ③ 拼接、分解、过渡、光顺、整体修改和局部修改等。
AUTOCAD 的B样条命令
三、图形的编辑修改技术
图形裁剪 窗口、视区变换 二、三维图形几何变换 三维图形投影变换
窗口区 (W2,W4) (XW,YW)
(W1,W3)
(V1,V3)
视图区 (V2,V4) (XV,YV)
XV
(XW
W1 )(V2 W2 W1
V1 ) V1
YV
(YW
W3 )(V4 W4 W3
V3
)
V3
➢ 变换规律
➢ 视图区大小不变,窗口区缩小或放大时,所显 示的图形会相反地放大或缩小;
计算机基本图形生成算法
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
构造判别式:
二维图形生成技术
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来描述曲线的。即:
计算机图形学基本图形生成算法
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();
计算机图形学二维图形的生成
#include <math.h>
setbkcolor(9);
#define PI 3.1415926
setcolor(4);
main()
for(a=0;a<=2*PI;a+=PI/n)
{
{
int x,y,rl,rs,n;
x=rl*cos(a)+320;
double a;
y=rl*sin(a)+240;
line(480,120,480,360); lineto(480,120);
line(480,360,160,360); lineto(480,360);
line(160,360,160,120); lineto(160,360);
getch();
lineto(160,120);
closegraph();
cleardevice();
}
用C语言图形函数绘制图形
题目:将圆周等分成n等份,然后用直线将各等分点两 两相连。
要求:等份点数n在23-31之间,半径在100-200之间, 能接受用户输入,并使圆心位于屏幕的中心位置。
用C语言图形函数绘制图形
题目:画出如图所示的图形。 要求:图形的大小位置如图所示。等分数n在15-20之
该函数只对部分函数有效。
绘图函数—点
void putpixel(int x,int y,int color)
在屏幕指定位置(x,y)处,用color指定的颜色画一点。
void moveto(int x,int y)
将当前光标位置移到(x,y)处
void moverel(int deltax,int deltay)
颜色信息
计算机图形学第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)
第三讲:二维图形生成算法
圆的扫描变换
利用对称性可以 加速画圆过程; 只需计算45°弧 段,通过对称变换 可完成整圆.
圆的扫描变换(中点算法)
思路:当前显示点P=(Xp,Yp),取第 二八分圆
圆方程为x2+y2=R2 ,因此 令:F(x,y)=x2+y2 -R2
中间点M=(Xp+1,Yp-(1/2))
令: d=F(M)
判断: d=0 中点在圆上; 点亮可取E 或 SE d<0 中点在圆内; 点亮可取E d>0 中点在圆外;点亮可取SE
y2=y1+dy=y1+(x2-x0)dA
其中角度的增量dA很小,用弧度表示,A是圆弧的张角。
基本增量算法
• 考虑基本增量算法是否是最优的! 1.运算符的快速性 采用增量思想的DDA算法,每计算一个象素, 只需计算一个加法。加法已经是最快的算法 了(加减乘除开方三角函数等) 2.参数运算的快速性 DDA算法的计算中含有浮点数运算。把浮点 运算的加法变成整数加法,因为整数的加法 比浮点的加法要快很多
二维图形生成算法
•二维图形生成算法
•线段的扫描变换
•基本增量算法 •中点线算法 •Bresenham画线算法
•圆与椭圆的扫描变换
线段的扫描变换
线段的扫描变换
• 象素,中心位于均衡栅格上的离散圆点 。 • 直线扫描变换算法就是获得一系列象素 的坐标,使这些象素落在所要近似的理 想直线上或位于该直线的附近。原则上 讲,象素序列应尽可能逼近理想的直线, 而且尽可能直一些。
基本增量算法
直线方程:y=mx+b ,0<m<1, m= △y/ △x= △y ; x=1,xi+1=xi+ 1,yi+1=yi+m
计算机图形学第3章二维基本图(4)
二、扫描线种子填充算法实现
借助于堆栈,上述算法实现步骤如下:
1、初始化堆栈。 2、种子压入堆栈。 3、while(堆栈非空) { (1)从堆栈弹出种子象素。 (2)如果种子象素尚未填充,则:
a.求出种子区段:xleft、xright; b.填充整个区段。 c.检查相邻的上扫描线的xleft≤x≤xright区间内, 是否存在需要填充的新区段,如果存在的话, 则把每个新区段在xleft≤x≤xright范围内的最 右边的象素,作为新的种子象素依次压入堆栈。 d.检查相邻的下扫描线的xleft≤x≤xright区间内, 是否存在需要填充的新区段,如果存在的话, 则把每个新区段在 xleft≤x≤xright范围内的 最右边的象素,作为新的种子象素依次压入堆 栈。 }
扫描线种子填充算法步骤 (1)种子象素入栈。 (2)栈非空时象素出栈,否则结束。 (3)对出栈象素及左、右两边象素填充,直到遇边界XL、XR。 (4)在(XL ,XR) 内查相临的上、下两条扫描线是否为边界或已填充, 如不是,则将每区间的最右边的象素入栈。回到(2)。
练习: 用扫描线种子填充算法,写出图中顺序进栈的种子坐标及 所需最大栈空间
2、国标码 我国除了采用ASCII码外,还制定了汉字编 码的国家标准字符集:中华人民共和国国家标准 信息交换编码,代号为“GB2312-80”。该字符 集共收录常用汉字6763个,图形符号682个。 它规定所有汉字和图形符号组成一个94×94 的矩阵,在此方阵中,每一行称为“区”,用区 码来标识;每一列称为“位”,用位码来标识, 一个符号由一个区码和一个位码共同标识。 区码和位码分别需要7个二进制位,同样, 为了方便,各采用一个字节表示。所以在计算机 中,汉字(符号)国标码占用两个字节。
第3章 二维图元生成技术 计算机图形学
两个距离的差
d 1 d 2 2k ( xi 1) 2 yi 2b 1
若此差值为正,则d1>d2,下一个像素点应取 P2 (xi +1, yi+1);若此差值为负,d1<d2,下一个像素点应 取P1 (xi+1, yi);若此差值为零,则d l=d2,下一 个像素点可取两个像素点中的任意一个.
dy=abs(y2-y1);
if(dx<dy){iTag=1;Swap(x1, y1);Swap(x2, y2);Swap(dx, dy);} tx=(x2-x1)>0?1:-1;ty=(y2-y1)>0?1:-1; curx=x1;cury=y1; inc1=2*dy;inc2=2*(dy-dx);d=inc1-dx;
k
y1 y 0 y x1 x0 x
d i 1 d i 2y xi 1 2x yi 1 2y xi 2x yi
d 当di≥0时,yi+1=yi+1, i 1 di (2y 2x) 当di≤0时,yi+1=yi d i 1 d i 2y 初始判别量d0
5 4
29
3.1.3 Bresenham算法
已经确定的像素为P(xi yi),下一个可选 择的像素点为P1(xi+1, yi)和P2(xi+1, yi +1) )两者中的一个
3.1.3 Bresenham算法
在x=xi+1处直线上点y=k(xi+1)+b,该点到P1 (xi+ 1, yi)和P2 (xi+1, yi+1)的距离分别令为d1和d2:
计算机图形学第3章-基本光栅图形生成算法
P4
P3
多边形顶点表示
多边形点阵表示
• 多边形填充就是把多边形的顶点表示转换为点阵表示,即从 多边形的给定边界出发,求出位于其内部的各个像素,并将
多边形的填充
• 填充条件:多边形的顶点序列<Pi,i=0,1,…,n>、填充色.
• 对多边形进行填充,关键是找出多边形内的象素.
• 多边形内点的判别准则
多边形的填充—边缘填充算法
• 算法实现: • 对多边形P的每一非水平边〔i=0,1,…,n〕上的各像素做向右
求反运算即可,见下图,其中<a>为给定的多边形;<b>为对区 域赋初值;<c>,<d>,<e>和<f>表示逐边向右求反.
多边形的填充—边界标志算法
• 基本原理:首先用一种特殊的颜色在帧缓冲器中将多边形 的边界〔水平边的部分边界除外〕勾画出来.然后再把位于 多边形内的各个像素着上所需的颜色
多边形的填充—扫描线算法
•算法步骤
•根据给出的多边形顶点坐标,建立ET表; • 求出顶点坐标中最大y值ymax和最小y值ymin. •初始化AET表指针,使它为空. •使用扫描线的yj值作为循环变量,使其初值为ymin. • 对于循环变量yj的每一整数值,重复作以下事情,直到yj大于ymax,或ET 表与AET表都为空为止: •如果ET表中yj桶非空,则将yj桶中的全部记录合并到AET表中. •对AET表链中的记录按x的大小从小到大排序. •依次取出AET表各记录中的xi坐标值,两两配对填充,即将每对xi之间的 象素填上所要求的颜色. •如果AET表中某记录的ymax=yj,则删除该记录. •对于仍留在AET表中的每个记录,用xi+1/m代替xi进行修改,这就是该 记录的边线与下一条扫描线yj+1的交点. •使yj加1,以便进入下一轮循环.
基本图形生成算法原理
基本图形生成算法原理现在的计算机能够生成各种复杂的图形,但无论其多么复杂,它都是由一些基本图形组合而成的。
因此,学习基本图形的生成算法是掌握计算机图形的基础。
本章就主要讨论一些基本图形的生成原理,如点、直线、椭圆生成。
如前面所述,目前我们使用的主要图形输出设备显示器(一般为光栅图形显示器)和打印机(喷墨、激光打印机)本质上是一种画点设备,是由一定数量的网络状细小光点(即像素)组成,使某些像素亮(将帧缓存中对应位置的值为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 是直线的斜率。
第3章-2D基本图形生成算法
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;} } }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
工程及计算机图形学
工程及计算机图形学
10.1.3 OpenGL成为目前三维图形开发标准
没有一种三维工具软件包在交互式三维图形建模能力 、外部设备管理以及编程方便程度上能够OpenGL相比拟。 OpenGL作为一个三维图形软件包,它提供了建模、变 换、颜色模式设置、光照和材质设置、双缓存动画、纹理映 射、位图显示和图像增强七大功能。 OpenGL在硬件、窗口、操作系统方面是相互独立的。 OpenGL是网络透明的,在客户—服务器(Client-Server) 体系结构中,OpenGL允许本地和远程绘图。 OpenGL应用程序具有广泛的移植性。因此,OpenGL 已成为目前的三维图形开发标准,是从事三维图形开发 工作的技术人员所必须掌握的开发工具。
工程计算机图形学
第三章 二维基本图形生成算法
浙江大学工程及计算机图学所
SHU Graphics & Image Group
主要内容
• 10.1 OpenGL概述 • 10.2 OpenGL编程基础
工程及计算机图形学
10.1 OpenGL概述
10.1.1 OpenGL使人们进入三维图形世界 10.1.2 OpenGL提供直观的三维图形开发环境
工程及计算机图形学 工程及计算机图形学
10.2.3 OpenGL基本语法与程序结构
3. OpenGL程序的基本结构
初始化:主要是设置一些OpenGL的状态开关。 设置观察坐标系下的取景模式和取景框位置及大小 使用OpenGL的库函数构造几何物体对象的数学描 述,包括点线面的位置和拓扑关系,几何变换,光 照处理等等。 (结合例子分析)
工程及计算机图形学
Hale Waihona Puke 工程及计算机图形学10.2 OpenGL编程基础
10.2.1 OpenGL基本概念 10.2.2 OpenGL工作流程
10.2.3 OpenGL基本语法与程序结构
工程及计算机图形学
工程及计算机图形学
10.2.1 OpenGL基本概念
OpenGL中的模型绘制过程就多种多样,对三维 物体的绘制方式主要提供了以下几种: 1).网格线绘图方式(wireframe) 2).深度优先网格线绘图方式(depth_cued) 3).反走样网格线绘图方式(antialiased) 4).平面消隐绘图方式(flat_shade) 5).光滑消隐绘图方式(smooth_shade) 6).加阴影和纹理的绘图方式(shadows、textures) 7).运动模糊的绘图方式(motion-blured) 8).大气环境效果(atmosphere-effects) 9).深度域效果(depth-of-effects)
实际上,从三维空间到二维平面,就如同用相机拍照一样 ,通常都要经历以下几个步骤 ① 将相机置于三角架上,让它对准三维景物(视点变换 ,Viewing Transformation); ② 将三维物体放在适当的位置(模型变换,Modeling Transformation ); ③ 选择相机镜头并调焦,使三维物体投影在二维胶片上 (投影变换,Projection Transformation ) ④ 决定二维像片的大小(视口变换,Viewport Transformation )。
工程及计算机图形学
工程及计算机图形学
10.2.3 OpenGL基本语法与程序结构
OpenGL变换 (1)相机模拟
图10-2-2
工程及计算机图形学 工程及计算机图形学
10.2.3 OpenGL基本语法与程序结构
图10-2-3
工程及计算机图形学
工程及计算机图形学
10.2.3 OpenGL基本语法与程序结构
工程及计算机图形学
工程及计算机图形学
10.1.1 OpenGL使人们进入三维图形世界
人们对计算机可视化技术的研究已经历了一个很长的历程,而且 形成了许多可视化工具,其中SGI公司推出的GL三维图形库表现突出 ,易于使用而且功能强大。GL已经进一步发展成为OpenGL,OpenGL 已被认为是高性能图形和交互式视景处理的标准,目前包括ATT公司 UNIX软件实验室、IBM公司、DEC公司、SUN公司、HP公司、 Microsoft公司和SGI公司在内的几家在计算机市场占领导地位的大公 司都采用了OpenGL图形标准。
工程及计算机图形学
工程及计算机图形学
10.2.3 OpenGL基本语法与程序结构
图10-2-4
(1)模型变换—视图变换 (两者合称几何变换) glMatrixMode (GL_MODELVIEW ) glTranslate (); //模型、视图变换 glRotate (); //模型、视图变换
glScale ();
//模型变换
gluLookAt(); // 视图变换
工程及计算机图形学 工程及计算机图形学
10.2.3 OpenGL基本语法与程序结构
(2)投影变换
图10-2-5 正投影:void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far)
OpenGL函数按以下格式命名: <库前缀><根命令><可选定参数个数><可选参数类型> 例如glColor4f(…),gluSphere(…);
工程及计算机图形学
工程及计算机图形学
10.2.3 OpenGL基本语法与程序结构
2. 状态机制
OpenGL的工作方式是一种状态机,它可进行各种状态或模式设置, 这些状态或模式在重新改变它们之前一直有效 例:LSX中void CGLView::OnInitialUpdate() { // glEnable(GL_LINE_SMOOTH); // glEnable(GL_BLEND); // 去掉注释观看效果 } void CMannequinView::ShowAllLinesAndPts() { glDisable(GL_LIGHTING); glEnable(GL_LIGHTING); // 加上注释观看效果 }
工程及计算机图形学
工程及计算机图形学
10.2.3 OpenGL基本语法与程序结构
例: 圆柱相交程序分析
1.头文件
2. 主体程序
3.主要函数简介
4.实例
工程及计算机图形学
工程及计算机图形学
10.2.3 OpenGL基本语法与程序结构
1. 头文件
#include <windows.h> #include <gl/gl.h> #include <gl/glu.h> #include <gl/glut.h> #include <math.h> //数学运算库 这些头文件包含了程序所用的函数原型。所有Windows 应用程序都需要windows.h头文件,它包含大多数 WIN32函数原型。其实GULT的WIN32版本的glut.h中 包含了windows.h。 接下来的几个头文件定义OpenGL的gl、glu、glut函数库的 函数原型。math.h则定义了数学运算库的函数原型。
10.1.3 OpenGL成为目前三维图形开发标准
工程及计算机图形学
工程及计算机图形学
10.1.1 OpenGL使人们进入三维图形世界
最近几年计算机图形学的发展使得三维表现技术得以形成,这些 三维表现技术使我们能够再现三维世界中的物体,能够用三维形体来 表示复杂的信息,这种技术就是可视化 ( Visualization ) 技术。 可视化技术赋予人们一种仿真的、三维的并且具有实时交互的能 力,这样人们可以在三维图形世界中用以前不可想象的手段来获取信 息或发挥自己创造性的思维。机械工程师可以从二维平面图中得以解 放直接进入三维世界,从而很快得到自己设计的三维机械零件模型。 医生可以从病人的三维扫描图象分析病人的病灶。军事指挥员可以面 对用三维图形技术生成的战场地形,指挥具有真实感的三维飞机、军 舰、坦克向目标开进并分析战斗方案的效果。
工程及计算机图形学
10.1.2 OpenGL提供直观的三维图形开发环境
OpenGL实际上它是图形软件和硬件的接口,有115个 核心函数,可以在任何OPENGL平台上使用, 函数以gl开 头;实用库41个,比上面这115个函数高一级,提供高级调 用,函数以glu开头;辅助库31个,函数以aux开头; Windows专用库函数6个,以wgl开头;Win32API函数5个 ,函数前无专门前缀。 . OpenGL提供一系列的三维图形单元供开发者调用 . OpenGL提供一系列的图形变换函数 . OpenGL提供一系列的外部设备访问函数,使开发者 可以方便地访问鼠标、键盘、空间球、数据手套等这种直 观的三维图形开发环境体现了OpenGL的技术优势,这也是 许多三维图形开发者热衷于OpenGL的缘由所在。
图10-2-6 透视投影 void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);
工程及计算机图形学 工程及计算机图形学
10.2.3 OpenGL基本语法与程序结构
工程及计算机图形学 工程及计算机图形学
10.2.3 OpenGL基本语法与程序结构
2.主体程序
int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutCreateWindow("两圆柱相交"); SetupRC(); glutReshapeFunc(ChangeSize); glutSpecialFunc(SpecialKeys); glutKeyboardFunc(KeyBoardHandler); glutDisplayFunc(RenderScene); cylinder= gluNewQuadric(); glutMainLoop(); return 0; }