ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

计算机图形学

2020-12-07 20:35:28  阅读:1771  来源: 互联网

标签:计算机 曲线 图形学 算法 rc c0 pt1 pt0


计算机图形学期末复习

第一章 绪论

  • 计算机图形学定义:计算机图形学是研究通过计算机将数据转换成图形,并在专门显示设备上显示的原理、方法和技术

第二章 计算机设备及硬件系统

知识点

  • 阴极射线管(CRT)

  • 光栅扫描图形显示器:垂直回扫、水平回扫

  • 液晶显示器

    • 工作原理:利用液晶的光电显示效应,通过施加电压改变液晶的光学特性,从而造成对入射光的调制,使通过液晶的透射光或反射光受所加电压的控制,达到显示的目的。

      (通过对液晶电场的控制可以实现光线的明暗变化,从而达到信息显示的目的)

image-20201204152829971
  • 光栅扫描图形显示子系统的结构(p35)

    • 重要部件:帧缓冲存储器、显示控制器
    • 帧缓冲存储器(显存):存储像素的颜色(灰度)的存储器,可由显示控制器直接访问
    • 显示控制器:依据设定的显示工作方式,读取显存里的数据,并转换成三原色并配以同步信号给显示器
image-20201204154551945

注意事项

  • 液晶显示器的亮度没有CRT的高
  • 扫描转换过程:像素信息从应用程序转化并放入帧缓冲区的过程

第四章 图形的表示与数据结构

  • 基本元素:
    • 定义:指可以用一定的几何参数和属性参数描述的最基本的图形元素
    • 组成:点、线、面、环、体等
  • 几何信息与拓扑信息:
    • 几何信息:一般指形体在欧氏空间的位置和大小
    • 拓扑信息:形体各分量(点、线、面)的数目及相互间的连接关系(9中拓扑关系)

第五章 基本图形生成算法

  • 直线扫描转换:

    数值微分法(DDA) 中点Bresenham算法 Bresenham算法
    判别式 有,取中点,判别d 有,判别误差e
    取舍 四舍五入,有误差 不做四舍五入 不作除法、无四舍五入
  • 多边形的扫描转换/多边形填充:

    • 定义:从多边形顶点表示点阵表示
    • x扫描线算法:左闭右开的原则
    • 改进的有效边表算法(y连贯性算法):
  • 边缘填充算法

  • 区域填充算法

  • 反走样:

    • 走样(图形失真):离散量表示连续量而引起的失真
    • 反走样(图形保真技术):用于减少或消除走样的现象的技术
    • 造成走样的原因:直线段或曲线段的数学描述是连续的,而光栅显示器上显示的直线段或曲线段是由一些离散的、面积不为0的像素点组成的
    • 避免走样的方法:
      • 过取样(后滤波):在高于显示分辨率的较高分辨率下用点取样方法计算,然后对几个像素的属性进行平均,得到较低分辨率下的像素属性
      • 区域取样(前滤波):根据图形对象在每个像素点上的覆盖率来确定像素点的亮度,这种计算覆盖率的方法

第六章 二维变换级二维观察

二维变换

  • 基本几何变换都是相对于坐标原点和坐标轴进行的

裁剪

  • 直线段裁剪:编码裁剪、中点分割裁剪、梁友栋算法

  • 多边形裁剪:

第七章 三维变换及三维观察

三维变换

  • 注意:三维变换中,绕y轴的旋转变换的特殊

三维观察

(规定以逆时针旋转方向为正向;三视图:以Z轴正向朝上)

  • 平面几何投影:

    • 透视投影:投影中心到投影面的距离有限
    • 平行投影:投影中心到投影面的距离无限
    • 正投影:三视图、正轴侧投影(对任意平面做投影)
      • 斜投影:投影方向不垂直于投影面;投影方向和投影面成45°
    image-20201205171238294

投影在x0y平面

  • 正轴测投影变换矩阵:

    image-20201206160353264
  • 斜轴测投影变换矩阵:

    • α=45°,β=30°或者45°
    image-20201206160546272
透视投影
  • 投影矩阵:(中间的为透视变换矩阵)
image-20201206162028637 image-20201206162054131
  • 主灭点:坐标轴方向的平行线在投影面上形成的灭点

  • 根据主灭点个数分为:一点透视、二点透视、三点透视

  • 观察坐标系:

  • OpenGL中的变换

    • OpenGL视点变换函数:OpenGL视点变换函数用于确定观察参考坐标系,即确定视点的位置和观察方向,默认情况视点位于原点,观察方向为Z轴负向。

      void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz,GLdouble upx, GLdouble upy, GLdouble upz);
      
    • OpenGL投影函数

      • 平行投影:

        image-20201206191438633
      • 透视投影:
        image-20201206191501771

第八章 曲线与曲面

  • 样条曲线中的边界条件:自由端、夹持端、抛物端

  • 样条曲线:

    • 定义:指由多项式曲线段连接而成的曲线,在每段的边界处满足特定的连续条件
  • hermite插值样条:

    • 可以局部调整,因为每个曲线段仅依赖于端点约束
    • 当曲线的端点及端点的切线方向确定时,若给定不同的切线长度,将有不同形状的Hermite曲线。
  • Bezier曲线/曲面:

    • 是一个阶数比控制点少一的多项式
    • 只有第一个点和最后一个点在曲线上
    • 不能对曲线形状进行局部控制,任意改变一控制点,整条曲线受影响
    • Bezier曲线的性质:
      • 端点:曲线总是通过起点和终点
      • 一阶导数:起点的切线位于前两个控制点的连线上,终点的切线位于最后两个的连线上
      • 二阶导数:曲线在起始点和终止点处的r阶导数由起点或终止点和它们的r个相邻的控制点决定
      • 对称性
      • 凸包性:
      • 几何不变性:曲线形状只与控制多边形各顶点的相对位置有关,与坐标系的选择无关
      • 变差减少性:曲线比控制多边形更加光滑
      • 控制顶点变化对曲线形状的影响
  • B样条曲线/曲面:

    • 性质:

      image-20201206230152629

第九、十章 消隐、真实感图形绘制

消隐

  • 物体空间的消隐算法:是将物体表面上的k个多边形中的每一个面与其余的k-1个面进行比较,精确地求出物体上每条棱边或每个面的遮挡关系(多 边形的区域排序算法)
  • 图像空间的消隐算法:对屏幕的每一像素进行判断,以决定物体上哪个多边形在该像素点上是可见的(如深度缓存算法)

简单光照模型

入射光=反射光+透射光+散射光+吸收光
简单光反射模型=漫反射光+环境光+镜面反射光

  • 环境光:是光在物体和周围环境之间多次反射的结果,即是来自周围的环境对光的反射。环境光的特点是:它不是直接自光源,而是照射在物体上的光来自周围各个方向,且又均匀地向各个方向反射

    Ie=Ia·Ka

    image-20201206231408507

  • 漫反射光:漫反射光是在光的照射下,物体表面发射的反射光均匀地射向各个方向

    Id=Ip·Kd·cos(a)

    image-20201206231948821
  • 镜面反射光:镜面反射是点光源照射在一个与物体光泽的表面(如镜子、光亮的金属等)有关的反射光。它的特点是光源来自一个光方向,并沿某特定方向(反射方向)离开

    image-20201206232749112 image-20201206232808962
  • OpenGL绘制函数:

    • OpenGL消隐处理:

      image-20201206233147238
    • OpenGL光照与材质:

      image-20201206233227953 image-20201206233241476
    • OpenGL纹理贴图:

      image-20201206233318691

程序设计

编码裁剪

//编码定义
char clipCode(const GPoint2d &pt, const GRect2d &rc)
{
    char code = 0;
    if(pt.y() > rc.y1()) code |= 0x01;
    else if(pt.y() < rc.y0()) code |= 0x02;
    if(pt.x() > rc.x1()) code |= 0x04;
    else if(pt.x() < rc.x0()) code |= 0x08;
    return code;
}

//裁剪
bool gltLineClip2d(GPoint2d &pt0, GPoint2d &pt1, const GRect2d &rc)
{
    char c0, c1;
    while(true)
    {
        c0 = clipCode(pt0, rc);
        c1 = clipCode(pt1, rc);
        if((c0 & c1) != 0) return false;//按位与,两点在同一个测
        if(c0 == 0 && c1 == 0) return true;//两点在窗口内

        if(c0 == 0)
        {
            swap(pt0, pt1);
            swap(c0, c1);
        }

        if(c0 & 0x01) // 在 Yt 之上
        {
            pt0.setX(pt0.x()-(pt0.y()-rc.y1())*(pt0.x()-pt1.x())/(pt0.y()-pt1.y()));
            pt0.setY(rc.y1());
        }
        else if(c0 & 0x02) // 在 Yb 之下
        {
            pt0.setX(pt0.x()-(pt0.y()-rc.y0())*(pt0.x()-pt1.x())/(pt0.y()-pt1.y()));
            pt0.setY(rc.y0());
        } 
        else if(c0 & 0x04) // 在 Xr 之右
        {
            pt0.setY(pt0.y()-(pt0.x()-rc.x1())*(pt0.y()-pt1.y())/(pt0.x()-pt1.x()));
            pt0.setX(rc.x1());
        }
        else if(c0 & 0x08) // 在 Xl 之左
        {
            pt0.setY(pt0.y()-(pt0.x()-rc.x0())*(pt0.y()-pt1.y())/(pt0.x()-pt1.x()));
            pt0.setX(rc.x0());
        } 
    }
}

Bezier曲线

//bezier的Castel推分算法
double bezierCastel(double x[],int n,double t){
	for(int r=1;r<n;r++){
        for(int i=0;i<n-r;i++){
            x[i] = (1-t)*x[i]+t*x[i+1];
        }
    }
    return x[0];
}

void gltBezier2d(const GPoint2dArray &points){
    if(points.count<2)
        return;
    double x0,y0,x1,y1;
    double t,dt;
    GPoint2d pt;
    int n = points.count();
    dt = 1.0f/(n*20);
    double *x = new double[n];
    double *y = new double[n];
    pt = points.at(0);
    x0 = pt.x();
    y0 = pt.y();
    for(int i = 0;i<n;i++){
        pt = points.at(i);
        x[i] = pt.x();
        y[i] = pt.y();
    }
    
    for(t=dt;t<1;t+=dt){
        x1 = bezierCastel(x,n,t);
        y1 = bezierCastel(y,n,t);
        gltLine2d(x0,y0,x1,y1);
		x0 = x1;
        y0 = y1;
    }
    pt = points.at(n-1);
    gltLine2d(x0,y0,pt.x().pt.y());
    delete []x;
    delete []y;
}

B样条曲线

//b样条基函数
void cubicBSplineBase(int begin,const GPoint2dArray &points,double t,GPoint &pt){
    float fh1 = (-t*t*t+3*t*t-3*t+1)/6;
    float fh2 = (3*t*t*t-6*t*t+4)/6;
    float fh3 = (-3*t*t*t+3*t*t+3*t+1)/6;
    float fh4 = (t*t*t)/6;
    GPoint pt0 = points.at(begin);
    GPoint pt1 = points.at(begin+1);
    GPoint pt2 = points.at(begin+2);
    Gpoint pt3 = points.at(begin+3);
    pt.setX(fh1 * pt0.x() + fh2 * pt1.x() +fh3 * pt2.x() + fh4 * pt3.x());
    pt.setY(fh1 * pt0.y() + fh2 * pt1.y() +fh3 * pt2.y() + fh4 * pt3.y());
}

void gltBSpline2d(const GPoint2dArray &points){
    if(points.count()<4)
        return ;
    double x0,y0;
    double t,dt;
    GPoint pt;
    int n = points.count();
    dt = 0.05;
    for(int i=0;i<n-3;i++){
        cubicBSplineBase(i,points,0,pt);
        x0 = pt.x();
        y0 = pt.y();
        for(t=dt;t<1;t+=dt){
            cubicBsplineBase(i,points,t,pt);
            gltLine2d(x0,y0,pt.x(),pt.y());
            x0 = pt.x();
            y0 = pt.y();
        }
        cubicBSplineBase(i,points,t,pt);
        gltLine2d(x0,y0,pt.x(),pt.y());
    }
}

标签:计算机,曲线,图形学,算法,rc,c0,pt1,pt0
来源: https://www.cnblogs.com/Christal-pyy/p/14099418.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有