计算机图形学
填空题20分 选择题20个共40分,简答题5个共20分,编程题2个共20分
1.图形图像的区别
图形是矢量图、图像是位图
- 存储方式的区别:点阵文件是存储图的各个像素点的位置信息、颜色信息以及灰度信息 矢量文件是用数学方程、数学形式对图形进行描述,通常是用图形的形状参数和属性参数来表示图形 显然,位图(点阵)文件存储空间比矢量文件大
- 缩放的区别:位图(点阵图)是与分辨率有关的,即在一定面积的图像上包含有固定数量的像素 矢量图形与分辨率无关,可以将它缩放到任意大小和以任意分辨率在输出设备上打印出来,都不会影响清晰度
- 存储格式区别
- 位图(点阵图)存储格式:
- BMP
- TIFF
- GIF
- JPEG
- PNG
- 矢量图存储格式:
- DXF
- SVG
- EPS
- WMF
- EMF
- 小结
- 位图与矢量图相比更容易模仿真实感图形效果,但存储空间比矢量图大
- 在图形缩放时,矢量图不失真,特别适用于文字设计、图案设计、版式设计、标志设计、计算机辅助设计(CAD) 、工艺美术设计、插图等
- 位图图像和矢量图形没有好坏之分,只是用途不同而已
- 位图(点阵图)存储格式:
a) 图象纯指计算机内以位图(Bitmap)形式存在的灰度信息
b) 图形含有几何属性,更强调场景的几何表示,是由场景的几何模型和景物的物理属性共同组成的
c) 图形主要分为两类:一类基于线条信息表示;另一类是明暗图(Shading),也就是通常所说的真实感图形
d) 图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成
21. 消隐
消隐的概念
- 如果把可见和不可见的线都画出来,会对视觉造成多义性。
- 要消除二义性,就必须在绘制时消除被遮挡的不可见的线或面,即消除隐藏线和隐藏面,简称消隐。
消隐分类
- 按消隐对象分类
- 线消隐
- 消隐对象是物体上的边,消除的是物体上不可见的边。
- 面消隐
- 消隐对象是物体上的面,消除的是物体上不可见的面,通常做真实感图形消隐时用面消隐。
- 按消隐空间分类
- 物体空间的消隐算法
- 以场景中的物体为处理单元。假设场景中有 k 个物体,将其中一个物体与其余 k-1 个物体逐一比较,仅显示它可见表明以达到消隐的目的。
- 此类算法常用于线框图的消隐。
- Roberts 算法、光线投射法
- 图像空间的消隐算法
- 消隐算法的主流。
- Z-buffer 算法
- 扫描线算法
- Warnock 消隐算法
- 物体空间和图像空间的消隐算法
- 画家算法
Z-Buffer缓冲——深度缓冲器,帧缓冲器
a) 深度缓冲器
depth(x,y)
用深度缓存来存放每个像素的深度值
b) 帧缓冲器
intensity(x,y)
用帧缓存来存放每个像素的颜色值
3. 参数、几何连续(填空题、选择题、简答题)
曲线间连接的光滑度的度量有两种:
① 函数的可微性:组合参数曲线在连接处具有直到n阶连续导矢,即n阶连续可微,这类光滑度称之为C的n次方或n阶参数连续性
② 几何连续性:组合曲线在连接处满足不同于C的n次方的某一组约束条件,称为具有n阶几何连续性,简记为G的n次方
a) 一阶 在零阶前提下
b) 二阶 在一阶前提下
参数连续比几何连续更严苛,是充分条件不是必要条件
与参数连续区别,比几何更严
4. 走样、反走样、消阶走样
走样:用离散量表示连续量引起的失真现象称之为走样(aliasing)
反走样:用于减少或消除这种效果的技术称为反走样(antialiasing)
消除走样的方法:
- 提高分辨率
- 区域采样
- 像素的亮度与相交区域的面积成正比,而与相交区域落在像素内的位置无关,这仍然会导致锯齿效应
- 直线条上沿理想直线方向的相邻两个象素有时会有较大的灰度差
- 加权区域采样
思想:改进非加权区域采样方法的第3条性质,相交区域对象素亮度的贡献依赖于该区域与象素中心的距离
可采用离散计算方法
- 将象素分割成n个等面积的子象素,计算每个子象素对原象素的贡献,并保存在一张二维的加权表中;
- 求出所有中心落于直线段内的子象素;
- 计算所有这些子象素对原象素亮度贡献之和的值;
- 该值乘以象素的最大灰度值作为该象素的显示灰度值。
对n=9的情况:
对n=25的情况:
例子
5. 直线绘制
a) DDA A卷
每步只有整数运算
int(y+0.5)取整四舍五入 |k|<1,大于1将xy互换//xi+1=xi+k; y每次加1
void DDA(int x0,int y0,int x1,int y1){ int x; float dx,dy,y,k; dx=x1-x0,dy=y1-y0; k=dy/dx; //yi+1=yi+k; y=y0; for(x=x0;x<=x1;x++){ draw(x,int(y+0.5)); y+=k; } }
b) Bresenham B卷
有更广泛的适用范围
该算法的思想是通过各行、各列像素中心构造一组虚拟网格线,按照直线起点到终点的顺序,计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的像素。
误差项初值d0=0
d+=k;
if(d>=1) d-=1;
改进到整数运算、
e=d-0.5
e0=-0.5;
x+=1; e+=k;
if(e>=0){
y++; e-=1;
}
void ScanLine::Bresenham(int x0,int y0,int x1,int y1,QPainter *painter){ QPen mypen; mypen.setWidth(2); mypen.setColor(Qt::black); painter->setPen(mypen); bool steep = false; if (std::abs(x1 - x0) < std::abs(y1 - y0)) { std::swap(x0, y0); std::swap(x1, y1); steep = true; } if (x0 > x1) { std::swap(x0, x1); std::swap(y0, y1); } int dx = x1 - x0; int dy = y1 - y0; int deltaY = std::abs(dy << 1); int middle = dx; int y = y0; for (int x = x0; x <= x1; ++x) { if (steep) { painter->drawPoint(y,x); } else { painter->drawPoint(x,y); } deltaY += std::abs(dy << 1); if (deltaY >= middle) { y += (y1 > y0 ? 1 : -1); middle += std::abs(dx << 1); } } }
c) 中点画线
void ScanLine::MidLine(int x1,int y1,int x2,int y2,QPainter *painter){ QPen mypen; mypen.setWidth(2); mypen.setColor(Qt::black); painter->setPen(mypen); int x = x1, y = y1; //赋初始点 int dy = y1 - y2, dx = x2 - x1; int delta_x = (dx >= 0 ? 1 : (dx = -dx, -1)); //若dx>0则步长为1,否则为-1,同时dx变正 int delta_y = (dy <= 0 ? 1 : (dy = -dy, -1)); //注意这里dy<0,才是画布中y的增长方向 painter->drawPoint(x,y); //画起始点 int d, incrE, incrNE; if (-dy <= dx) // 斜率绝对值 <= 1 //这里-dy即画布中的dy { d = 2 * dy + dx; //初始化判断式d incrE = 2 * dy; //取像素E时判别式增量 incrNE = 2 * (dy + dx);//NE while(x != x2) { if (d < 0) y += delta_y, d += incrNE; else d += incrE; x += delta_x; painter->drawPoint(x,y); } } else // 斜率绝对值 > 1 // x和y情况互换 { d = 2 * dx + dy; incrE = 2 * dx; incrNE= 2 * (dy + dx); while(y != y2) { if(d < 0) //注意d变化情况 d += incrE; else x += delta_x, d += incrNE; y += delta_y; painter->drawPoint(x,y); } } }
6. 直线文字裁剪 三精度——串精度,字符精度,笔画/像素精度
a) 串精度:只保留整个字符串在裁剪框内的字符串
b) 字符精度:只保留整个字符在裁剪框内的字符
c) 像素精度(笔画精度)
7. 曲率、挠率
- 曲率是曲线的单位切矢对弧长的转动率,表示曲线弯曲程度。
- 挠率的绝对值是副法线方向对于弧长的转动率,表示曲线扭曲。挠率大于0,等于0,小于0分别表示曲线为右旋空间曲线、平面曲线和左旋空间曲线。
- 对一条平面曲线,主法向量是在平面上,与切向量垂直。次法向量等于切向量叉乘主法向量,与平面垂直。由于平面曲线的次法向量处处与平面垂直,所以平面曲线挠率处处为零。也就是发生弯曲,不扭曲。而对于三维曲线,某一点曲率,挠率都不为零,同时发生弯曲和扭曲
8. 多边形
有序边表(少的
活性边表(每一行都写
多边形的表示法
-
a) 顶点表示:用多边形的顶点序列来表示多边形。这种表示直观、几何意义强、占内存少,易于进行几何变换,但由于他没有明确指出哪些像素在多边形内,所以不能用于面着色
b) 点阵表示:用位于多边形内的像素几何来刻画多边形,这种表示丢失了许多几何信息,但便于帧缓冲器表示图形,是面着色所需要的图形表示方式
c) 光栅图形学的一个基本问题是把多边形的顶点表示转换为点阵表示,这种转换称为多边形的扫描转换
9. 三色说 (填空简答,名词解释
三色说:
- 颜色视觉及真实感图形学的生理基础,颜色科学中最基本、最重要的理论
- 颜色具有恒常性,可以根据物体的固有属性来区分不同的颜色,不受外界环境的影响,颜色之间的对比效应能使人区分不同颜色
- 颜色具有混合性,牛顿在十七世纪后期用棱镜把太阳光分散成光谱上的颜色光带,证明白光由很多颜色光混合而成
b) 用三种原色能够产生各种颜色的三色原理是当今颜色科学中最重要的原理和学说
近代三色学说:视网膜中存在着三种椎体细胞,对光刺激的兴奋程度不同,分别感受红、绿、蓝光。作用与颜色混合相同
黄光刺激眼睛的例子
d) 三色学说是真实感图形学中RGB颜色模型提出的理论基础
e) 三色学说原理说明任何一种颜色可以用红、绿、蓝三原色按照不同比例混合来得到。还有如何使三原色按某唯一比例混合复现给定颜色的问题
RGB三原色:红、绿、蓝
10. 字符描述方法 点阵\矢量
点阵字符: 每个字符由一个位图表示,该位为1表示字符的笔画经过此位,对应于此位的象素应置为字符颜色。该位为0表示字符的笔画不经过此位,对应于此位的象素应置为背景颜色
矢量字符:记录字符的笔画信息,而不是整个位图,具有存储空间小,美观、变换方便等优点。对于字符的旋转、缩放等变换,
– 点阵字符的变换需要对表示字符位图中的每一象素进行;
– 矢量字符的变换只要对其笔画端点进行变换就可以了。矢量字符的显示也分为两步。
显示:首先从字库中将它的字符信息。然后取出端点坐标,对其进行适当的几何变换,再根据各端点的标志显示出字符。
– 点阵字符:存储量大,易于显示
– 矢量字符:存储量小,美观,变换方便; 但需要光栅化后才能显示。
11. 图形输入输出设备
常用的图形输入设备:
键盘、鼠标
此外还有
跟踪球、空间球、光笔、触摸板、 图形扫描仪、数字化仪、手写输入板、语音输入、数据手套
图形输出设备:
图形显示设备和图形绘制设备
图形显示设备: 用于在屏幕上输出图形。基于阴极射线管的监视器、液晶显示器、等离子显示器
图形绘制设备: 用于把图形画在纸上,也称硬拷贝。打印机、绘图仪
12. 种子填充算法(两个选择
四联通、八联通
八联通代替四联通,用栈的递归实现
13. 参数方程的优缺点
① 可以满足几何不变性的要求 —— 表示的形状不随所取坐标系而改变
② 有更大的自由度来控制曲线、曲面的形状
③ 直接对参数方程进行几何变换 ——
非参数方程的几何变换必须对图形上每个型值点进行几何变换,而参数表示的几何变换可对其参数方程直接进行变换
④ 便于处理斜率为无穷大的情形,不会因此而中断计算
⑤ 界定曲线、曲面的范围十分简单 —— 具有规格化的参数变量 t∈[0,1]
⑥ 易于用向量和矩阵运算,简化计算
⑦便于用户将低维的图形映射到高维空间内
显式或隐式缺点
- 与坐标轴相关
- 会出现斜率无穷大
- 不便于计算机编程
14. Bezier、B样条曲线
Bezier曲线
有n个控制点、为n-1阶贝塞尔曲线
Bezier曲线和B样条曲线的优缺点区别,样条曲线和Bezier曲线相比最大的优点是什么——局部性
- 端点性质
- 对称性
- 凸包性
- 几何不变性
- 变差缩减性
- 仿射不变性
Bezier曲线或曲面有许多优越性,但有两点不足:
- ①Bezier曲线或曲面不能作局部修改
- ②Bezier曲线或曲面的拼接比较复杂
b)1972年,Gordon、Riesenfeld等人发展了1946年Schoenberg提出的样条方法 , 提出了B样条方法,在保留Bezier方法全部优点的同时,克服了Bezier方法的弱点
B样条曲线
- 局部性
- 连续性
- 凸包性
- 分段参数多项式
- 导数公式
- 变差缩减性
- 几何不变性
- 仿射不变性
- 直线保持性
- 造型的灵活性
曲线与控制多边形顶点个数没关系
阶数是次数加一
16. 中点画线Δi,求下一像素点的选择
d=2a+b;
d1=2a; d2=2a+2b;
if(d<0){
x++; y++; d+=d2;//中点在线下方,去中点上方像素点
}else{
x++: d+=d1;
}
draw(x,y);
17. 多边形裁剪
a) 知道多边形方向边,求输出顶点(选择) 同在可见\不可见
窗口边界对多边形进行裁剪
18. Cohen-Sutherland裁剪 p35
上下右左——四个编码意义
- P3|P4==0 取
- P1&P3!=0 弃
- 都不满足
- 与窗口四边界求交点,将线一分为二
- 必有
a) 若两点的code1 | code2 = 0(对四位二进制进行或运算),则两点同在内部
b) 若两点的code1 & code2 不等于0(对四位二进制进行与运算),则两点同在外部
c) 对于其他情况采取中点分割法(Cohen-SutherLand、Liang-Barskey裁剪算法_哔哩哔哩_bilibili)
19. 光照模型 公式参数意义(一个选择题,一个简答题)
a) phong光照模型——环境光+漫反射光+镜面反射光
在实际的应用中,由于Phong光照模型是一个经验模型,因此还具有以下的一些问题
- 显示出的物体象塑料,无质感变化
- 没有考虑物体间相互反射光
- 镜面反射颜色与材质无关
- 镜面反射入射角大,会产生失真现象
b) Lambert光照模型
Lambert光照模型主要是用来模拟粗糙物体表面的光照现象,那么在初中物理中我们已经学习过,对于一个粗糙的物体我们之所以能在各种角度下看到物体是依赖于物体对光线的漫反射,所谓漫反射是指光线在物体表面会向各个方向反射,因为物体的微表面是凹凸不平的。
其次Lambert光照模型属于经验模型,那我们就从漫反射的基本规律出发,来体会Lambert光照模型的构建过程。
漫反射的基本特点有两点:
- (1)反射强度与观察者的角度没有关系;
- (2)反射强度与光线的入射角度有关系。
对于暴露在环境光下的Lambert反射体,可以用以下公式表示某点处的漫发射光强:
Iad= K*Ia
其中Ia表示环境光强度,k(0<k<1)为材质对环境光的反射系数,Iad是漫发射体与环境光交互时反射的光强。
理想的环境光是无序的,但是表面光强还依赖于光线的入射方向,这种现象可以用Lambert定律进行数学上的量化。
Lambert定律:当方向光照射到理想反射体上时,漫反射光的光强与入射光方向和入射点便面法向量夹角的余弦成正比。Ild = K*Il*Cosa,其中Ild是漫反射体与方向光交互反射的光强,Il是方向光的光源强度,a是入射光线与定点法向量的夹角,k是材质的反射系数。
当入射角为零时,说明光线垂直于物体表面,漫反射光强最大;九十度时光线与物体表面平行,物体接收不到任何光线。
若N表示顶点单位法向量,L表示从顶点指向光源位置的单位向量(主意指向,不要弄反了),那么Cosa等价于N与L的点积。
即:
Ild = k*I*(N·L)
那么综合考虑环境光和方向光,Lambert光照模型可写为:
Idiff = Iad + Ild = k*Ia + k*Il*(N·L)
20. 前后向面与法向量的位置关系
a) 判断可见 知道可见求向量值
- 前向面,后向面和法向量的位置关系,如果矢向量和法向量的点积小于0,面是可见面——V·N<0 多边形为前向面
- 反之为不可见面!!!已知可见不可见,求向量值,已知向量值求可见不可见——V·N>0 多边形为后向面
21. OpenGL
glBegin和glEnd的参数
void glBegin(GLenum mode)
GLenum mode:
GL_POINTS 单个顶点集
GL_LINES 多组双顶点线段
GL_POLYGON 单个简单填充凸多边形
GL_TRIANGLE 多组独立填充三角形
GL_QUADS 多组独立填充四边形
GL_LINE_STRIP 不闭合折线
GL_LINE_LOOP 闭合折线GL_TRIANGLE_STRIP 线型连续填充三角形串
GL_TRAINGLE_FAN 扇形连续填充三角形串
GL_QUAD_STRIP 连续填充四边形串
void glEnd(void)
glBegin和glEnd函数限定了一组或多组图元的定点定义。
已知画直线或折线,判断参数是GL_LINES还是GL_LINE_STRIP
- GL_LINES:把每一个顶点作为一个独立的线段,顶点2n-1和2n之间共定义了n条线段,总共绘制N/2条线段
- 多组双顶点线段
- GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,总共绘制n-1条线段
- 不闭合折线
- GL_LINE_LOOP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶点相连,第n和n+1个顶点定义了线段n,总共绘制n条线段
- 闭合折线
Opengl坐标变换中的glTranslate(),glScale(),glRotation
glTranslate*(x,y,z)是平移操作,x,y,z指定沿着世界坐标系的x,y,z轴的平移量。
glRotation*(x,y,z)是做旋转的,第一个参量是angle,指定旋转角度,x,y,z指定沿着世界坐标系中的旋转轴向量(x,y,z),比如glRotation(30,0,1,0)就是绕着Y轴向左旋转30°
glScale*(x,y,z)是缩放操作,x,y,z指定了沿着x,y,z轴的比例因子。
例如glScalef(2,2,0),就会把绘制的图形在二维平面上放大两倍。
注:一般可以在display函数中绘制出图形后可以调用它们来进行上述操作。
注意:
1.首先,上面三个函数可以同时使用(有先后顺序地),例如:对一个物体平移的时候,顺便放大两倍。
2.运行结果:假如选择平移操作,那么在控制台界面上每点击一下鼠标,就会在当前位置的基础上进行一次平移操作,假如你在display函数最前面,不清除颜色,那么你将会看到一系列平移图形的效果(也相当于是图形平移的位置过程)
a) glFlush
a) void glFlush() :让前面的OpenGL绘制命令开始执行,这样可以保证绘制在有限短时间内完成
b) glFinish
void glFinish():强制前面的OpenGL命令开始执行,并等到绘制完成时,再返回执行下面的操作,为保证操作的同步性需要调用glFinish()函数
过多调用glFinish()会降低绘制效率
22. 中点画圆,推Δ
F(x,y)=x2+y2-R2
d0=F(x+1,y+R-0.5)
x=0,y=0时d0=1.25-R
第一象限八分之一⚪
a) Δ>0
d+=2*(x-y)+5; y--; //中点在线上,y--
b) Δ<0
d+=2*x+3;
最后都x++
draw(x,y);
23. 填空三个画线考一个
24. LB裁剪 编程
a) P=0 求q
线段平行于窗口边界
有一个q<0时,在窗口外面
任意q>0时,在窗口内
1.Δx=0,p1=p2=0,若q<0,转裁剪步骤
否则计算u最大最小
2.Δy=0,p3=p4=0,若q<0,转裁剪步骤
b) P>0 求u1
线段由内部指向外部
umax>umin,转裁剪步骤
umax<=umin,则计算终点坐标
c) P<0 求u2
线段由外部指向内部
void Cut::LYDBarskeyCut(QPainter *painter)
{
float x1,y1,x2,y2; float dx,dy,u1,u2; getXLXRYBYT(); x1=linebegin.x(); y1=linebegin.y(); x2=lineend.x(); y2=lineend.y(); u1=0;u2=1;// dx=x2-x1; dy=y2-y1; if(LYDClip(-dx,x1-XL,&u1,&u2)) if(LYDClip(dx,XR-x1,&u1,&u2)) if(LYDClip(-dy,y1-YB,&u1,&u2)) if(LYDClip(dy,YT-y1,&u1,&u2)) { painter->setPen(Qt::red); painter->drawLine(QPoint(x1+u1*dx,y1+u1*dy),QPoint(x1+u2*dx,y1+u2*dy)); painter->drawRect(rectbegin.x(),rectbegin.y(),qAbs(rectend.x()-rectbegin.x()),qAbs(rectend.y()-rectbegin.y())); } } bool Cut::LYDClip(float p, float q, float *u1, float *u2) { float r; if(p<0) { r=q/p; if(r>*u2) return false; if(r>*u1) *u1=r; } else if(p>0) { r=q/p; if(r<*u1) return false; if(r<*u2) *u2=r; } else return (q>=0); return true; }