计算机图形学期末复习

图形学复习

名词解释

  1. C2连接:两条相邻曲线段在相交点处,有相同的一阶导和二阶导。
  2. C1连接:两条相邻曲线段在相交点处,有相同的一阶导。
  3. 捕捉技术 :利用外部设备捕捉计算机能够理解的数据。
  4. 消隐:在绘制图形时,消除被遮挡的不可见的线或者面。
  5. 引力场技术:物体延伸到空间中对另一物体的产生的吸引效应的技术。
  6. 灭点:立体空间各边延伸至同一相同点。
  7. 实体:同时具有几何要素和视觉要素的对象。
  8. 型值点:位于最终得到的自由直线上的点。
  9. 控制点:没有位于最终得到的自由直线上的点。
  10. 反走样:减少或消除图形因锯齿而失真的技术。
  11. 法向量插值法:保留双向性插值,并对顶点采用法向量插值,其中顶点的法向矢量由该点相邻的多边形面片的法向矢量值取平均值取得。
  12. 连通:同一像素在上、下、左、右四个方向上连通。
  13. 投影分为平行投影和透视投影。平行投影:由一组平行光照射产生的图形;透视投影:从某一投射中心,把物体投射到单一投影面。
  14. 简单光照模型:由反射光决定的简单模型 反射光=漫反射光+环境光+镜面反射光
  15. 多边形裁剪:将超出的定义裁剪面的多边形的视图窗口删除,如果线,点在多边形外部,则全部删除;如果只有部分在内部,则部分删除。
  16. 深度缓存算法:依次比较两个像素的深度值,将最小深度值存入深度缓存数组,最小深度值对应的颜色值存入帧缓存数组。
  17. 分形:研究不规则几何的图形形状,也称为大自然几何学,通过各种变换算法来研究不规则图形,具有零散,破碎的图形。
  18. 正则形体:空间中点符合正则集的形体称为正则形体,正则集符合正则运算规则,结果包含内部点集和报批边界。
  19. L算法:L-算法系统的本质是一个重写系统,通过对植物对象生长过程的经验式概括和抽象,初始状态与描述规则,进行有限次迭代,生成字符发展序列以表现植物的拓扑结构,并对产生的字符串进行几何解释,就能生成非常复杂的分形图形。
  20. 扭矢:曲面四个顶点的混合偏导数。
  21. 图形和图像:通常把参数法描述的图形叫做图形(Graphics)。把点阵法描述的图形叫做图象(Image)。
  22. 图形的要素(图素):几何要素和非几何要素。
  23. 光点:一般是指电子束打在显示器的荧光屏上,显示器能够显示的最小发光点。
  24. 象素:指图形显示在屏幕的时候,按当前的图形显示分辨率所能提供的最小元素点。
  25. 扫描转换:象素信息从应用程序转换并放入帧缓冲区的过程
  26. CRT:阴极射线管。
  27. DPU:分散处理单元。
  28. 存储分辨率:指帧缓冲区的大小。
  29. 显示分辨率:计算机显示器所能够提供的显示模式分辨率,水平和垂直方向上像素点的乘积。
  30. 屏幕分辨率:通常用水平方向上的光点数与垂直方向上的光点数的乘积来表示。
  31. 颜色位面法:帧缓存被分成若干独立的存储区域,每一个区域称为一个位面),每个位面控制一种颜色或者灰度,每一个图形象素点在每个位面中占一位,通过几个位面中的同一位组合成一个象素。
  32. 组合象素法:一个图形象素点的全部信息被编码成一个数据字节,按照一定方式存储到帧缓存中,编码字节的长度与点的属性(如颜色、灰度等)有关。
  33. 图形交互技术:是人和计算机进行图形数据双向通讯的技术。
  34. 用户接口:用户接口是人与计算机交互作用的界面,基本交互任务包括:定位、选择、文字输入、数值输入。
  35. 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=x1x0,dy=y1y0 ;

​ 再求 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=y0y1,b=x1x0 ;

​ 再求 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=2dydx ;

​ 后续的点:如果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(dydx),否则, 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.25R .

​ 每次判断 d < 0 d<0 d<0 ,取 x = x + 1 , y = y − 1 x=x+1,y=y-1 x=x+1,y=y1 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(xy)+5 .

​ 如果是整数版本的,初值 d = 1 − R d = 1-R d=1R

​ 递增版本:初值 Δ x = 3 , Δ y = 2 − R − R \Delta_{x} = 3,\Delta_{y}=2-R-R Δx=3,Δy=2RR 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=32R ,如果 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(xiyi)+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_maxx_min斜率指针

图形变换

二维图形变换

二维齐次变换矩阵
{ a d g b e h c f i } \begin{Bmatrix} a & d & g \\ b & e & h\\ c & f & i \end{Bmatrix} abcdefghi

  1. 平移变换

    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

  2. 比例变换

    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

  3. 旋转变换

    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

  4. 对称变换

    绕x轴对称变换

{ 1 0 0 0 − 1 0 0 0 1 } \begin{Bmatrix} 1 & 0 & 0 \\ 0 & -1 & 0\\ 0 & 0 & 1 \end{Bmatrix} 100010001

 绕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

  1. 平移变换

    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

  2. 比例变换

    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

  3. 旋转变换

    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

  4. 旋转变换

    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

  5. 旋转变换

    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(θ)00100sin(θ)0cos(θ)00001

综合变换:
  1. 指定点比例变换

    平移给定点到原点

    是用缩放变换矩阵进行相对于原点的缩放

    平移给定点到原始位置。

  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
计算机图形学是研究计算机生成和处理图像的学科。在计算机图形学期末速成中,通常会涉及到图像的生成、变换、渲染和消隐等方面的知识。以下是一个简单的介绍和演示: 1. 图像生成:计算机图形学中常用的图像生成方法包括光栅化和矢量图形。光栅化是将矢量图形转换为像素点的过程,常用于显示器上的图像显示。矢量图形则是通过数学公式描述图像,可以无损地进行缩放和变换。 2. 图像变换:图像变换是指对图像进行平移、转、缩放等操作,以实现图像的变形和变换。常用的图像变换方法包括仿射变换和透视变换。 3. 图像渲染:图像渲染是指将三维模型转换为二维图像的过程。常用的图像渲染方法包括光照模型、阴影计算和纹理映射等。 4. 图像消隐:图像消隐是指在三维场景中,将被遮挡的物体从图像中消除的过程。常用的图像消隐算法包括深度缓冲法、扫描线算法和光线追踪等。 以下是一个简单的演示代码,展示了如何使用Python和OpenGL库进行简单的图形绘制和渲染: ```python import pygame from pygame.locals import * from OpenGL.GL import * from OpenGL.GLU import * def draw_cube(): vertices = ( (1, -1, -1), (1, 1, -1), (-1, 1, -1), (-1, -1, -1), (1, -1, 1), (1, 1, 1), (-1, -1, 1), (-1, 1, 1) ) edges = ( (0, 1), (1, 2), (2, 3), (3, 0), (4, 5), (5, 6), (6, 7), (7, 4), (0, 4), (1, 5), (2, 6), (3, 7) ) glBegin(GL_LINES) for edge in edges: for vertex in edge: glVertex3fv(vertices[vertex]) glEnd() def main(): pygame.init() display = (800, 600) pygame.display.set_mode(display, DOUBLEBUF | OPENGL) gluPerspective(45, (display[0] / display[1]), 0.1, 50.0) glTranslatef(0.0, 0.0, -5) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() glRotatef(1, 3, 1, 1) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) draw_cube() pygame.display.flip() pygame.time.wait(10) if __name__ == '__main__': main() ``` 这段代码使用了Pygame和OpenGL库,绘制了一个旋转的立方体。你可以尝试运行这段代码,观察立方体的旋转效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值