计算机图形学Word文档格式.docx
《计算机图形学Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机图形学Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
在使用完后,SelectObject(pOldObject)恢复原来的设置
8.OnDraw成员函数由AppWizard直接生成的:
voidCTestView:
OnDraw(CDC*pDC){CTestDoc*pDoc=GetDocument();
//获取当前文档指针ASSERT_VALID(pDoc);
//检查该指针是否为空//TODO:
adddrawcodefornativedatahere//以下部分可添加自己的程序代码}
9.在OnDraw等函数中绘图时步骤:
1选择好画笔和画刷等绘图工具2确定好绘图坐标及比例尺
3根据需要选用适当的绘图函数绘出图形
10、有底层画点函数:
SetPixel(x,y,color)
11.解析几何法(直线方程直接计算)
算法的复杂度:
乘法加法(浮点数!
准确度、存放)、取整
循环体内每次进行一次乘法和取整运算,还有浮点数,效率低下
12.数值微分(DDA)法复杂度:
加法+取整
SetPixel(int(x+0.5),int(y+0.5),color);
//在指定位置画点y=y+k
特点:
DDA算法与基本算法相比,减少了浮点乘法,提高了效率。
但是x与dx、y与dy用浮点数表示,每一步要进行四舍五入后取整,不利于硬件实现,因而效率仍有待提高。
13.Bresenham算法---应用最广泛的直线扫描转换算法!
只有加法和判断!
原理:
借助于一个误差量(直线与当前实际绘制像素点的距离),来确定下一个像素点的位置。
算法的巧妙之处在于采用增量计算,使得对于每一列,只要检查误差量的符号,就可以确定该下一列的像素位置。
在起始像素(x0,y0)的第一个参数d0=e为:
e=d0=2dy-dx
this->
GetDC()->
DDA(intx_Start,inty_Start,intx_End,inty_End,COLORREFcolor)
14.圆弧基本绘制方法:
开根,三角函数运算,计算量大,不实用。
15.圆弧中点算法:
考虑对象:
第一象限的八分之一圆弧
圆弧的隐函数:
F(X,Y)=X2+Y2-R2=0切线斜率min[-1,0]
中点:
M=(Xp+1,Yp-0.5),如何取P1orP2?
当F(M)=dp<0时,M在圆内,说明P1距离圆弧更近,取P1;
当F(M)>0时,M在圆外,说明P2距离圆弧更近,取P2;
当F(M)=0时,可在P1和P2中任选1个,这里约定P2
16中点算法构造判别式dp=F(M)=F(Xp+1,Yp-0.5)=(Xp+1)2+(Yp-0.5)2-R2
(1)若dp<0,取P1,再下一个像素的判别式为:
dp+1=F(Xp+2,Yp-0.5)=dp+2Xp+3,沿正右方向,d的增量为2Xp+3;
2)若d≥0,取P2,再下一个像素的判别式为:
dp+1=F(Xp+2,Yp-1.5)=dp+(2Xp+3)+(-2Yp+2)沿右下方向,d的增量为2(Xp-Yp)+5
●d的初始值(在第一个像素(0,R)处),d0=F(1,R-0.5)=1.25-R
●算法中有浮点数,故用e=d-0.25代替,即:
d=1.25-R对应e=d-0.25=1-R;
判别式d<
0对应于e<
-0.25;
●e的初值为整数,且运算中增量也为整数,故e始终为整数,所以e<
-0.25可以用e<
0来代替。
●结论:
–if(e<
0),e+=2*x+3;
x++;
–if(e>
=0),e+=2*(x-y)+5;
x++;
y--;
中点画法代码如下:
MidpointCircle(r,color)
intr,color;
{intx,y,e;
x=0;
y=r;
e=1-r;
circlepoints(x,y,color);
while(x<
y){if(e<
0){e+=2*x+3;
x++;
}else{e+=2*(x-y)+5;
x++;
y--;
}circlepoints(x,y,color);
}}
17、显示圆弧上的八个对称点的算法:
程序只有简单加法和整数运算
voidCirclePoints(intx,inty,intcx,intcy,COLORREFcolor)//cx,cy为圆心的位置
{CDC*pDC=this->
GetDC();
pDC->
SetPixel(x+cx,y+cy,color);
SetPixel(x+cx,-y+cy,color);
SetPixel(-x+cx,y+cy,color);
SetPixel(-x+cx,-y+cy,color);
SetPixel(y+cx,x+cy,color);
SetPixel(y+cx,-x+cy,color);
SetPixel(-y+cx,x+cy,color);
SetPixel(-y+cx,-x+cy,color);
ReleaseDC(pDC);
}
18椭圆中点算法的判别式:
19区域填充算法:
区域指已经表示成点阵形式的填充图形,它是像素的集合。
区域可采用内点表示和边界表示两种表示形式。
区域可分为4向连通区域和8向连通区域。
区域填充指先将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。
区域填充算法要求区域是连通的
20种子填充法:
4连通与8连通区域的区别:
对边界的要求
区域填充(种子)的递归算法:
(1)内点表示的4连通区域的递归
voidFloodFill4(intx,inty,intoldcolor,intnewcolor){if(getpixel(x,y)==oldcolor)//属于区域内点oldcolor{drawpixel(x,y,newcolor);
FloodFill4(x,y+1,oldcolor,newcolor);
//上FloodFill4(x,y-1,oldcolor,newcolor);
//下FloodFill4(x-1,y,oldcolor,newcolor);
//左FloodFill4(x+1,y,oldcolor,newcolor);
//右}}
(2)边界表示的4连通区域的递归填充算法:
voidBoundaryFill4(intx,inty,intboundarycolor,intnewcolor){if(color!
=newcolor&
&
color!
=boundarycolor){drawpixel(x,y,newcolor);
BoundaryFill4(x,y+1,boundarycolor,newcolor);
BoundaryFill4(x,y-1,boundarycolor,newcolor);
BoundaryFill4(x-1,y,boundarycolor,newcolor);
BoundaryFill4(x+1,y,boundarycolor,newcolor);
种子(区域填充)缺点:
(1)有些像素会入栈多次,降低算法效率;
栈结构占空间。
(2)递归执行,算法简单,但效率不高,区域内每一像素都引起一次递归,进/出栈,费时费内存。
改进算法,减少递归次数,提高效率。
方法之一使用扫描线种子填充算法;
21.区域填充的扫描线算法步骤:
1首先填充种子点所在扫描线上的位于给定区域的一个区段2然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来。
3反复这个过程,直到填充结束。
22.区域填充的扫描线算法实现步骤
(1)初始化:
堆栈置空。
将种子点(x,y)入栈。
(2)出栈:
若栈空则结束。
否则取栈顶元素(x,y),以y作为当前扫描线。
(3)填充并确定种子点所在区段:
从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。
分别标记区段的左、右端点坐标为xl和xr。
(4)确定新的种子点:
在区间[xl,xr]中检查与当前扫描线y上、下相邻的两条扫描线上的像素。
若存在非边界、未填充的像素,则把每一区间的最右像素作为种子点压入堆栈,返回第
(2)步。
算法特点:
上述算法对于每一个待填充区段,只需压栈一次;
因此,扫描线填充算法提高了区域填充的效率。
区域图案填充算法(数值1用填充色写,否则用背景色写)
if(pattern(x%M,y%N))
SetPixel(x,y,color);
//color为填充前景色
23、OpenGL:
图形硬件的软件接口。
OpenGL是一种应用程序编程接口,而不是一种编程语言。
OpenGL的绘制流程和原理
OpenGL的主要功能:
绘制模型.各种变换.着色模式.光照处理.纹理映射.制作动画.深度暗示.运动模糊.雾化。
24.OpenGL生成基本图形-折线//绘制折线
glBegin(GL_LINE_STRIP);
glVertex2f(0.0f,0.6f);
glVertex2f(1.0f,0.6f);
glVertex2f(0.0f,0.4f);
glVertex2f(1.0f,0.4f);
glVertex2f(0.0f,0.2f);
glVertex2f(1.0f,0.2f);
glEnd();
//glBegin(GL_LINE_LOOP);
为闭合折线//glBegin(GL_POLYGON);
为画多边形glFrontFace(GL_CW);
为实心
25.voidglPolygonStipple(constGlubyte*mask);
该函数为填充多边形定义当前的点画模式
voidglEnable(GL_POLYGON_STIPPLE);
该函数使多边形点画模式激活
voidglDisable(GL_POLYGON_STIPPLE);
该函数使多边形点画模式失效
26.三种渲染字体的方法:
位图字体、轮廓字体、纹理映射字体
27.二维基本几何变换
平移变换P`=P+T(P点已知)
旋转变换
绕坐标原点旋转角度(逆时针为正,顺时针为负)
缩放变换:
以坐标原点为缩放参照点;
不仅改变了物体的大小和形状,也改变了它离原点的距离
28.标准齐次坐标(x,y,1)
二维基本变换的矩阵表示:
齐次平移变换
齐次旋转变换
齐次缩放变换
齐次坐标优点:
变换具有统一表示形式的优点:
便于变换合成;
便于硬件实现
组合变换:
关于任意参照点Pr(xr,yr)的旋转变换
关于任意参照点Pr(xr,yr)的缩放变换
29、三维几何变换
平移变换缩放变换
旋转变换:
绕x轴绕y轴绕z轴
30逆矩阵:
平移矩阵:
T(x,y,z)-1=T(-x,-y,-z)
缩放矩阵:
S(sx,sy,sz)-1=S(1/sx,1/sy,1/sz)
旋转矩阵:
R(α,β,γ)-1=R(-α,-β,-γ)
31、坐标变换特点:
1坐标变换是在两个坐标系之间进行;
2图形是静止的,坐标系是变动的;
3简单问题用几何变换,复杂问题用坐标变换.
32、两个坐标系之间的关系写成矩阵表示形式:
由坐标系v到坐标系u的变换矩阵为
33、齐次坐标下的坐标变换方法
三维空间中给定一个点P0和三个线性无关的矢量v1,v2,v3,则空间中任何一个点P的矩阵可以表示为:
则P的齐次坐标为:
34.两坐标系间的齐次坐标表示:
坐标系Ⅰ原点Q0坐标轴(即基)u1,u2,u3
坐标系Ⅱ:
原点P0,坐标轴(即基)v1,v2,v3
两坐标系间可以表示成如右的关系式:
矩阵表示形式为:
齐次坐标下的两坐标系的变换矩阵为:
两坐标系之间关系矩阵表示形式为
对于空间中的任一个点D,如果已知D点在坐标系II中的坐标为[d1,d2,d3,1]T
则:
D点在坐标系I中的坐标为:
M齐-1·
[d1,d2,d3,1]T
35、视区:
在屏幕上定义的一个矩形区域。
窗口:
在投影面上定义的一个矩形区域,只有在窗口内的图形才显示,而窗口外的部分则不显示。
36.窗口到视区的变换过程步骤:
(1)将窗口左下角点平移到窗口所在坐标系的原点,变换为T1(-WXL,-WYB)
(2)进行缩放变换,使窗口的大小与视区相等,变换为S(Sx,Sy)
(3)平移使窗口与视区重合,变换为T2(VXL,VYB)
37、投影分类
透视投影:
投影中心与投影平面之间的距离为有限
平行投影:
投影中心与投影平面之间的距离为无限
(根据投影方向与投影面的夹角分为两类:
正投影和斜投影)
透视投影矩阵变为平行投影矩阵变为
作用是将三维物体变换成其二维透视投影
采用视坐标系,目的是简化投影变换。
视变换---透视变换矩阵将三维图形显示在屏幕上,组合变换的矩阵为:
38、剪裁:
裁去窗口之外物体或物体部分的一种操作。
直线段裁剪目的:
判断图形元素是否落在裁剪窗口之内并找出其位于内部的部分.
39.三维裁剪:
投影之前裁剪
只对可见的物体进行投影变换
三维裁剪相对复杂
40.二维裁剪:
投影之后裁剪
二维裁剪相对容易
需要对所有的物体进行投影变换
41.在投影之前裁剪的理由:
1三维物体的表面通常被离散表示成多边形或折线,而对这类简单图元,三维裁剪同样比较简单。
2三维图形在显示过程中需要被消隐,做这个工作要有图形的深度信息,所以必须在投影之前完成。
消隐很费时,如果在此之前裁剪(或部分裁剪)掉不可见的图形,可使需要消隐的图形减至最小。
42.裁剪的目的:
判断图形元素是否落在裁剪窗口之内并找出其位于内部的部分。
裁剪的处理的基础:
1图元关于窗口内外关系的判别;
2图元与窗口的求交。
43.待裁剪线段和窗口的关系:
1线段完全可见2显然不可见3线段至少有一端点在窗口之外,但非显然不可见.
44.点剪裁:
点(x,y)在窗口内的充分必要条件是
45.Cohen_Sutherland算法步骤:
第一步判别线段两端点是否都落在窗口内,如果是,则线段完全可见;
否则进入第二步;
第二步判别线段是否为显然不可见,如果是,则裁剪结束;
否则进行第三步;
第三步求线段与窗口边延长线的交点,这个交点将线段分为两段,其中一段显然不可见,丢弃。
对余下的另一段重新进行第一步,第二步判断,直至结束。
对显然不可见线段的快速判别
C-S编码方法:
区域编码:
用窗口四边所在的直线将整个平面分成9个区域,每个区域赋于一个四位的编码CtCbCrCl
端点编码:
定义为它所在区域的编码
结论:
当线段的两个端点的编码的逻辑“与”非零时,线段为显然不可见的
46.在现有的整体光照明模型中,主要有光线跟踪和辐射度两种方法。
经过消隐得到的投影图称为物体的真实图形。
判别可见面算法的分类按照实现时所基于的坐标系分为:
物空间算法和像空间算法。
47.为什么判别可见面算法并非在物空间实现?
1判别可见面的算法离不开排序
2排序一般是基于体、面、边或点到视点的距离
3判别可见面的算法的效率很大程度上取决于排序的效率
4扫描线的方式实现像空间算法时容易利用连贯性质,使得像空间算法更具效率。
消隐:
消除二义性,必须在绘制时消除被遮挡的不可见的线或面,习惯说称为消除隐藏线和面,简称“消隐”。
48.深度测试:
在观察坐标系下判断线段与多边形的前后关系,分粗略测试和精确测试。
49.
Z缓冲器算法优点:
1算法简单、稳定。
2便于硬件加速。
3不需要整个场景的几何数据
缺点:
1需要Z缓冲器。
2计算复杂度大
需计算的像素深度值次数=多边形个数*多边形平均占据的像素个数。
50.阴影Z缓冲器算法步骤:
1.将所有景物变换到光源坐标系中,利用Z缓冲器算法按光线方向对景物进行消隐,把那些距光源最近的物体表面上点的深度值保存在阴影缓冲器中
2.利用Z缓冲器算法按视线方向对景物进行消隐,将得到的每一个可见点变换到光源坐标系中,若它在光源坐标系中的深度值比阴影缓冲器中相应单元的值小,则说明该可见点位于阴影中,否则不是。
优点:
算法简单
缺点:
每个光源需要一个阴影缓冲器
51.混淆现象:
不光滑(阶梯状)的图形边界;
图形细节失真;
狭小图形的遗失与动态图形的闪烁。
假设与现实的矛盾是导致混淆出现的原因之一
解决方法:
改变直线段模型。
实现步骤:
1、将直线段看作具有一定宽度的狭长矩形;
2、当直线段与某象素有交时,求出两者相交区域的面积;
3、根据相交区域的面积,确定该象素的亮度值
52.反混淆:
在图形显示过程中,用于减少或消除混淆现象的方法
非加权区域采样方法解决方法:
改变直线段模型