图形学复习
名词解释
- C2连接:两条相邻曲线段在相交点处,有相同的一阶导和二阶导。
- C1连接:两条相邻曲线段在相交点处,有相同的一阶导。
- 捕捉技术 :利用外部设备捕捉计算机能够理解的数据。
- 消隐:在绘制图形时,消除被遮挡的不可见的线或者面。
- 引力场技术:物体延伸到空间中对另一物体的产生的吸引效应的技术。
- 灭点:立体空间各边延伸至同一相同点。
- 实体:同时具有几何要素和视觉要素的对象。
- 型值点:位于最终得到的自由直线上的点。
- 控制点:没有位于最终得到的自由直线上的点。
- 反走样:减少或消除图形因锯齿而失真的技术。
- 法向量插值法:保留双向性插值,并对顶点采用法向量插值,其中顶点的法向矢量由该点相邻的多边形面片的法向矢量值取平均值取得。
- 连通:同一像素在上、下、左、右四个方向上连通。
- 投影分为平行投影和透视投影。平行投影:由一组平行光照射产生的图形;透视投影:从某一投射中心,把物体投射到单一投影面。
- 简单光照模型:由反射光决定的简单模型 反射光=漫反射光+环境光+镜面反射光
- 多边形裁剪:将超出的定义裁剪面的多边形的视图窗口删除,如果线,点在多边形外部,则全部删除;如果只有部分在内部,则部分删除。
- 深度缓存算法:依次比较两个像素的深度值,将最小深度值存入深度缓存数组,最小深度值对应的颜色值存入帧缓存数组。
- 分形:研究不规则几何的图形形状,也称为大自然几何学,通过各种变换算法来研究不规则图形,具有零散,破碎的图形。
- 正则形体:空间中点符合正则集的形体称为正则形体,正则集符合正则运算规则,结果包含内部点集和报批边界。
- L算法:L-算法系统的本质是一个重写系统,通过对植物对象生长过程的经验式概括和抽象,初始状态与描述规则,进行有限次迭代,生成字符发展序列以表现植物的拓扑结构,并对产生的字符串进行几何解释,就能生成非常复杂的分形图形。
- 扭矢:曲面四个顶点的混合偏导数。
- 图形和图像:通常把参数法描述的图形叫做图形(Graphics)。把点阵法描述的图形叫做图象(Image)。
- 图形的要素(图素):几何要素和非几何要素。
- 光点:一般是指电子束打在显示器的荧光屏上,显示器能够显示的最小发光点。
- 象素:指图形显示在屏幕的时候,按当前的图形显示分辨率所能提供的最小元素点。
- 扫描转换:象素信息从应用程序转换并放入帧缓冲区的过程
- CRT:阴极射线管。
- DPU:分散处理单元。
- 存储分辨率:指帧缓冲区的大小。
- 显示分辨率:计算机显示器所能够提供的显示模式分辨率,水平和垂直方向上像素点的乘积。
- 屏幕分辨率:通常用水平方向上的光点数与垂直方向上的光点数的乘积来表示。
- 颜色位面法:帧缓存被分成若干独立的存储区域,每一个区域称为一个位面),每个位面控制一种颜色或者灰度,每一个图形象素点在每个位面中占一位,通过几个位面中的同一位组合成一个象素。
- 组合象素法:一个图形象素点的全部信息被编码成一个数据字节,按照一定方式存储到帧缓存中,编码字节的长度与点的属性(如颜色、灰度等)有关。
- 图形交互技术:是人和计算机进行图形数据双向通讯的技术。
- 用户接口:用户接口是人与计算机交互作用的界面,基本交互任务包括:定位、选择、文字输入、数值输入。
- LCD:液晶显示器件。
简答题
-
图像和图形的区别:图形是无中生有,由计算机软件绘制出来的,它是面向对象的,同时具有几何属性和视觉属性。而图像是由计算机外部设备捕捉得到的,并面向计算机内传输的信息。
-
字符的两种表示方式:点阵字符和矢量字符。
-
实体的表示方法:边界表示、分解表示、构造实体几何表示、扫描表示和元球表示。
-
光栅扫描:逐行扫描和隔行扫描。
-
图素:几何元素和非几何元素。
-
图形输入控制方法:请求,取样,事件,组合。
-
客观存在的三维形体具有这样一些性质:(1)刚性(2)维数的一致性(3)占据有限的空间(4)边界的确定性(5)封闭性
-
图形与图像的区别与关系:图形是无中生有,是通过过计算机软件绘制出来的点线面的集合,而图像是外部设备捕捉计算机可以识别的数据。
-
简述图形是如何从图形数据呈现到屏幕上的原理、方法和过程。
显示缓冲区是与屏幕像素一一对应的二维矩阵,每一个存储单元对应着屏幕上的像素,其位置可由二维坐标来表示。当电子束扫描到屏幕上的像素时,显示器中的显示处理器会从缓冲区中取出像素值,找到颜色的地址,得到彩色表和基色分量。
-
用户接口:是人与计算机交互作用的界面。
-
基本交互任务包括:定位、选择、文字输入、数值输入。
①实现定位的交互技术有:一是把屏幕上的光标移到要确定的点,再按一下键,再就是用键盘键入那个点的坐标。
②选择适合可变集的选择技术有指名和拾取,适合固定集的选择技术有指名技术、功能键、菜单技术、模式识别。
③文字输入。
④数值输入a、由键盘输入数值b、调节电位器的阻值产生相应的数值c、手写数的识别或语音识别d、用上下翻转数字的计数。
画直线和圆
DDA算法
先求 d x = x 1 − x 0 , d y = y 1 − y 0 dx=x_1-x_0,dy=y_1-y_0 dx=x1−x0,dy=y1−y0 ;
再求 e = ( ∣ d x ∣ > ∣ d y ∣ ) ? ∣ d x ∣ : ∣ d y ∣ e = (|dx|>|dy|)?|dx|:|dy| e=(∣dx∣>∣dy∣)?∣dx∣:∣dy∣ ;
令 d x = e / d x , d y = e / d y dx = e/dx,dy = e/dy dx=e/dx,dy=e/dy ;
后续点的产生: x = x + d x , y = y + d y x = x+dx,y = y+dy x=x+dx,y=y+dy .
void DDALine(int x0,int y0,int x1,int y1){
double dx = x1-x0;
double dy = y1-y0;
double e = fabs(dx)>fabs(dy)?fabs(dx):fabs(dy);
dx /= e;
dy /= e;
double x = x0;
double y = y0;
for(int i=0;i<e;i++){
printf("x=%d,y=%d\n",(int)(x+0.5),(int)(y+0.5));
x += dx;
y += dy;
}
}
中点画线算法
先求 a = y 0 − y 1 , b = x 1 − x 0 a=y0-y_1,b=x_1-x_0 a=y0−y1,b=x1−x0 ;
再求 d = 2 a + b d = 2a+b d=2a+b ;
令 Δ 1 = 2 a , Δ 2 = 2 ( a + b ) \Delta_{1} = 2a,\Delta_{2} = 2(a+b) Δ1=2a,Δ2=2(a+b) ;
b后续点的产生:如果 d > 0 d>0 d>0, x = x + 1 , y = y x=x+1,y=y x=x+1,y=y,并且更新 d = d + Δ 1 d=d+\Delta_{1} d=d+Δ1,否则, x = x + 1 , y = y x=x+1,y=y x=x+1,y=y,并且更新 d = d + Δ 2 d=d+\Delta_{2} d=d+Δ2 .
void MidpointLine(int x0,int y0,int x1,int y1){
int x0=0,x1=5,y0=0,y1=2;
int a,b,delta1,delta2,d,x,y;
a = y0-y1;
b = x1-x0;
d = 2*a + b;
delta1 = 2*a;
delta2 = 2*(a+b);
x = x0;
y = y0;
printf("x=%d,y=%d\n",x,y);
while(x<x1){
x++;
if(d<0){
y++;
d+=delta2;
}else {
d+=delta1;
}
printf("x=%d,y=%d\n",x,y);
}
}
Bresenham直线算法
先求dx,dy;
再求 p = 2 d y − d x p=2dy-dx p=2dy−dx ;
后续的点:如果p>=0, y = y + 1 y=y+1 y=y+1,且让 p = p + 2 ( d y − d x ) p=p+2(dy-dx) p=p+2(dy−dx),否则, p = p + 2 d y p=p+2dy p=p+2dy .
void BresenhamLine(int x0,int y0,int x1,int y1){
int p,x,y,dx,dy;
x=x0;
y=y0;
dx = x1-x0;
dy = y1-y0;
p = 2*dy-dx;
while(x<=x1){
printf("x=%d,y=%d\n",x,y);
if(p>=0){
y++;
p+=2*(dy-dx);
}else{
p+=2*dy;
}
x++;
}
}
中点画圆法
初始 d = 1.25 − R d=1.25-R d=1.25−R .
每次判断 d < 0 d<0 d<0 ,取 x = x + 1 , y = y − 1 x=x+1,y=y-1 x=x+1,y=y−1 , d = d + 2 x + 3 d = d+2x+3 d=d+2x+3 ;否则取 x = x + 1 x=x+1 x=x+1 , d = d + 2 ( x − y ) + 5 d=d+2(x-y)+5 d=d+2(x−y)+5 .
如果是整数版本的,初值 d = 1 − R d = 1-R d=1−R。
递增版本:初值 Δ x = 3 , Δ y = 2 − R − R \Delta_{x} = 3,\Delta_{y}=2-R-R Δx=3,Δy=2−R−R , d = d + Δ x + Δ y d=d+\Delta_{x}+\Delta_{y} d=d+Δx+Δy, Δ x = Δ x + 2 , Δ y = Δ y + 2 \Delta_{x}=\Delta_{x}+2,\Delta_{y}=\Delta_{y}+2 Δx=Δx+2,Δy=Δy+2
void MidpointCircle(int R){
int x=0,y=R;
double d=1.25-R;
printf("x=%d,y=%d",x,y);
while(x<y){
if(d<0){
d += 2*x+3;
}else {
d += 2*(x-y) + 5;
y--;
}
x++;
}
printf("x=%d,y=%d",x,y)
}
/**
* 递增版本
**/
void MidpointCircle(int R){
int x=0,y=R,d=1-R;
int deltax=3,deltay=2-R-R;
printf("x=%d,y=%d",x,y);
while(x<y){
if(d<0){
d += deltax;
deltax+=2;
}else {
d += deltax+deltay;
deltax+=2;
deltay+=2;
}
y--;
x++;
}
printf("x=%d,y=%d",x,y)
}
bresenham画圆算法
判别式 p 1 = 3 − 2 R p1=3-2R p1=3−2R ,如果 p i < 0 p_i<0 pi<0选H点, p i + 1 = p i + 4 x + 6 p_{i+1}=p_i +4x+6 pi+1=pi+4x+6 .否则选D点, p i + 1 = p i + 4 ( x i − y i ) + 10 p_{i+1}=p_i+4(x_i-y_i)+10 pi+1=pi+4(xi−yi)+10。
void bresenham(int R){
int x,y,p;
x=0;
y=R;
p=3-2*R;
for(;x<=y;x++){
if(p>=0){
p+=4*(x-y)+10;
y--;
}else {
p+=4*x+6;
}
}
}
图形填充算法
多边形的扫描转换算法
void Polygonfill(Edge ET, COLORREF color){
1.y=ET中登记项对应的y坐标的最小值;
2.AET初始化为空表;
3.while(ET表非空或AET表非空){
3.1 将ET表登记项y对应的各“吊桶”合并到AET表中,将AET中各“吊桶”按x坐标递增排序;
3.2 在扫描线y上,按照AET提供的x坐标对,用color值实施填充;
3.3 将AET中有y=y_max的各项清除出表;
3.4 对AET中留下的各项,分别将x替换为x+1/m,这是求出AET中各边与下一条扫描线交点的x坐标;
3.5 由于前一步可能破坏了AET中各项x坐标的递增次序,故按x坐标重新排序;
3.6 y++,去处理下一条扫描线;
}
}
ET表和AET表的数据结构是一个链表;
y_max | x_min | 斜率 | 指针 |
---|---|---|---|
图形变换
二维图形变换
二维齐次变换矩阵
{
a
d
g
b
e
h
c
f
i
}
\begin{Bmatrix} a & d & g \\ b & e & h\\ c & f & i \end{Bmatrix}
⎩⎨⎧abcdefghi⎭⎬⎫
-
平移变换
T ( T X , T y ) T(T_X,T_y) T(TX,Ty)
{ 1 0 0 0 1 0 T x T y 1 } \begin{Bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0\\ T_x & T_y & 1 \end{Bmatrix} ⎩⎨⎧10Tx01Ty001⎭⎬⎫ -
比例变换
S ( S x , S y ) S(S_x,S_y) S(Sx,Sy)
{ S x 0 0 0 S y 0 0 0 1 } \begin{Bmatrix} S_x & 0 & 0 \\ 0 & S_y & 0\\ 0 & 0 & 1 \end{Bmatrix} ⎩⎨⎧Sx000Sy0001⎭⎬⎫ -
旋转变换
R ( θ ) R(\theta) R(θ)
{ c o s ( θ ) s i n ( θ ) 0 − s i n ( θ ) c o s ( θ ) 0 0 0 1 } \begin{Bmatrix} cos(\theta) & sin(\theta) & 0 \\ -sin(\theta) & cos(\theta) & 0\\ 0 & 0 & 1 \end{Bmatrix} ⎩⎨⎧cos(θ)−sin(θ)0sin(θ)cos(θ)0001⎭⎬⎫ -
对称变换
绕x轴对称变换
{ 1 0 0 0 − 1 0 0 0 1 } \begin{Bmatrix} 1 & 0 & 0 \\ 0 & -1 & 0\\ 0 & 0 & 1 \end{Bmatrix} ⎩⎨⎧1000−10001⎭⎬⎫
绕y轴对称变换
{ − 1 0 0 0 1 0 0 0 1 } \begin{Bmatrix} -1 & 0 & 0 \\ 0 & 1 & 0\\ 0 & 0 & 1 \end{Bmatrix} ⎩⎨⎧−100010001⎭⎬⎫
三维图形变换
三维齐次变换矩阵
{
a
11
a
12
a
13
a
14
a
21
a
22
a
23
a
24
a
31
a
32
a
33
a
34
a
41
a
42
a
43
a
44
}
\begin{Bmatrix} a_{11} & a_{12} & a_{13} & a_{14} \\ a_{21} & a_{22} & a_{23} & a_{24} \\ a_{31} & a_{32} & a_{33} & a_{34} \\ a_{41} & a_{42} & a_{43} & a_{44} \\ \end{Bmatrix}
⎩⎪⎪⎨⎪⎪⎧a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44⎭⎪⎪⎬⎪⎪⎫
-
平移变换
T ( T X , T y ) T(T_X,T_y) T(TX,Ty)
{ 1 0 0 0 0 1 0 0 0 0 1 0 T x T y T z 1 } \begin{Bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 &0& 1 & 0 \\ T_x & T_y & T_z & 1 \\ \end{Bmatrix} ⎩⎪⎪⎨⎪⎪⎧100Tx010Ty001Tz0001⎭⎪⎪⎬⎪⎪⎫ -
比例变换
S ( S x , S y ) S(S_x,S_y) S(Sx,Sy)
{ S x 0 0 0 0 S y 0 0 0 0 S z 0 0 0 0 1 } \begin{Bmatrix} S_x & 0 & 0 & 0 \\ 0 & S_y & 0 & 0 \\ 0 &0& S_z & 0 \\ 0 & 0 & 0 & 1 \\ \end{Bmatrix} ⎩⎪⎪⎨⎪⎪⎧Sx0000Sy0000Sz00001⎭⎪⎪⎬⎪⎪⎫ -
旋转变换
R z ( θ ) R_z(\theta) Rz(θ)
{ c o s ( θ ) s i n ( θ ) 0 0 − s i n ( θ ) c o s ( θ ) 0 0 0 0 1 0 0 0 0 1 } \begin{Bmatrix} cos(\theta) & sin(\theta) & 0 & 0 \\ -sin(\theta) & cos(\theta) & 0 & 0 \\ 0 &0& 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{Bmatrix} ⎩⎪⎪⎨⎪⎪⎧cos(θ)−sin(θ)00sin(θ)cos(θ)0000100001⎭⎪⎪⎬⎪⎪⎫ -
旋转变换
R x ( θ ) R_x(\theta) Rx(θ)
{ 1 0 0 0 0 c o s ( θ ) s i n ( θ ) 0 0 − s i n ( θ ) c o s ( θ ) 0 0 0 0 1 } \begin{Bmatrix} 1 & 0 & 0 & 0 \\ 0 & cos(\theta) & sin(\theta) & 0 \\ 0 & -sin(\theta) & cos(\theta) & 0 \\ 0 & 0 & 0 & 1 \\ \end{Bmatrix} ⎩⎪⎪⎨⎪⎪⎧10000cos(θ)−sin(θ)00sin(θ)cos(θ)00001⎭⎪⎪⎬⎪⎪⎫ -
旋转变换
R y ( θ ) R_y(\theta) Ry(θ)
{ c o s ( θ ) 0 − s i n ( θ ) 0 0 1 0 0 s i n ( θ ) 0 c o s ( θ ) 0 0 0 0 1 } \begin{Bmatrix} cos(\theta) & 0 & -sin(\theta) & 0 \\ 0 & 1 & 0 & 0 \\ sin(\theta) & 0 & cos(\theta) & 0 \\ 0 & 0 & 0 & 1 \\ \end{Bmatrix} ⎩⎪⎪⎨⎪⎪⎧cos(θ)0sin(θ)00100−sin(θ)0cos(θ)00001⎭⎪⎪⎬⎪⎪⎫
综合变换:
-
指定点比例变换
平移给定点到原点
是用缩放变换矩阵进行相对于原点的缩放
平移给定点到原始位置。