计算机图形学

时间:2023-01-09 16:06:54

目录

1 绪论

1.1应用

科学计算可视化

地理信息系统(GIS)

娱乐

电脑游戏,电视广告,节目片头,科教演示(CAI)

多媒体

VR(虚拟现实、灵境)

自然景物的模拟(真实感图形绘制)

计算机动画

二维动画 :图像变形,形状混合

三维动画 :变形物体的动画,关节动画与人体动画 ,过程动画 ,关键帧动画

计算机艺术

1.2定义

图形 & 构成图形的要素

图形:

– 客观对象在人的视觉系统中产生的视觉印象

– 包括自然景物、拍摄到的图片等,可用用数学方法描述

构成图形的要素:

– 几何要素:刻画对象的轮廓、形状等

– 非几何要素:刻画对象的颜色、纹理等

计算机中表示图形的方法

点阵表示

• 枚举出图形中所有的点(强调图形由点构成) • 简称为图像(数字图像)。

参数表示

• 形状参数(方程或分析表达式的系数,线段的端点坐标等)+属性参数(颜色、线型等)来表示图形 • 简称为图形。

什么是计算机图形学

定义:计算机图形学是研究怎样用计 算机输入、生成(处理)、存储、显示 输出图形的一门学科。

计算机图形学的研究内容

具体概括为:图形硬件、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法,以及图形标准、图形交互技术、 科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。

图形输入设备的发展

– 第一阶段:控制开关、穿孔纸等等

– 第二阶段:键盘

– 第三阶段:二维定位设备,如鼠标、光笔、图 形输入板、触摸屏等等,语音

– 第四阶段:三维输入设备(如空间球、数据手 套、数据衣),用户的手势、表情等等

– 第五阶段:用户的思维

ACM SIGGRAPH会议(小知识)

– 全称 “the Special Interest Group on Computer Graphics and Interactive Techniques”

– 60年代中期,由Brown 大学的教授Andries van Dam (Andy) 和IBM公司的Sam Matsa发起

– 1974年,在Colorado大学召开了第一届SIGGRAPH 年会,并取得了巨大的成功

– 每年只录取大约50篇论文

常见的标准

通用的、与设备无关的图形包,图形标准

GKS (Graphics Kernel System) (第一个官方标准,1977)

PHIGS(Programmer’s Herarchical Iuteractive Graphics system)

非官方图形软件

广泛应用于工业界,成为事实上的标准

DirectX (MS)

Xlib(X-Window系统)

OpenGL(SGI)

Adobe公司Postscript

2 光栅设备

2.1 光栅输入设备

概念

像素:整个屏幕被扫描线分成 n 行,每行有 m 个点,每个点为一个像素。整个屏幕有 m × n 个像素。

设备

数字化仪是一种把图形转变成计算 机能接收的数字形式专用设备。基本工作原理是采用电磁感应技术。

扫描仪 :平面图象扫描仪 &三维立体扫描仪,图形扫描仪是直接以像素信息进行扫描和存储的设备。

2.2 光栅输出设备

概念

图像刷新:由于CRT内侧的荧光粉在接受电子束的轰击时,只能维持短暂的发光, 根据人眼视觉暂留的特性,需要不断 进行刷新才能有稳定的视觉效果。图像的刷新频率等于帧扫描的频 率(帧频),用每秒刷新的帧数表示; 目前刷新频率标准为每秒50~120帧。

行频、帧频:水平扫描频率为行频,垂直扫描频率为帧频。

逐行扫描、隔行扫描: 隔行扫描方式是先扫偶数行扫描线,再扫奇数行扫描线。

显示速度:指显示字符、图形特别是动态图像的速度,与显示器的分辨率及扫描频率有关。

分辨率:是指CRT在水平或垂直方向的单位长度 上能分辨出的最大光点(像素)数,分为水平分辨率和垂直分辨率。通常用屏幕上像素的数目来表示。比如 上述的 n 行,每行 m 点的屏幕分辨率为 m ×n

点距:相邻像素点之间的距离。在同样面积大小的情况下,分辨 率越高,相邻像素点之间的距离越小,显示的字符或图像也就越清晰。

亮度等级与色彩等级:亮度等级又称灰度,主要指单色显示器的亮度变化;色彩等级是指像素颜色等级。

帧缓冲存储器(显示存储器)简称帧缓冲器,俗称显存。存储被刷新图像的信息,即存储屏幕上像素的颜色值。帧缓冲存储器的大小通 常用X方向(行)和Y方向 (列)可寻址的地址数的乘 积来表示,称为帧缓冲存储器的分辨率。帧缓存中单元数目与显示器上像素数目相同,单元与像素一一对 应;各单元的数值决定了其对应像素 的颜色。

黑白光栅扫描显示器

分为:1位帧缓存黑白光栅显示器 ,N位帧缓存灰度光栅显示器

灰度等级在光栅图形显示器中需要足够 的位面才能反映图形,存储器中的二进制位数被翻译成灰度等 级,范围是0到2的N次方-1之间。

彩色光栅扫描显示器

分辨率M*N、颜色个数K的光栅输出 设备,与显存大小V 的大小关系为:
$$
V >= M * N * [log 2 k]向上取整
$$
若存储器大小固定,则屏幕分辩率 与同时可用的颜色种数成反比关系。

显存问题– 高分辨率和真彩要求有大的显存

对于小显存如何完成大范围的显示颜色如何实现: 在不增加帧缓存单元位数的情况下,具有大范围内挑选颜色的能力。

解决方法:采用查色表(Lookup Table)或称彩色表 (Color Table)

查色表(look up Table)是一维线性表,其每一项的内容对应一种颜色,它的长度由帧缓存单元的位数决定,例如:每单元有8位,则查色表的长度为 2^8 =256。

计算机图形学

简单的光栅扫描图形显示系统的结构

计算机图形学

其中,帧缓存可为系统内存中的一块区域, 视频控制器能够直接存取该区域以刷新屏幕。

计算机图形学

计算机图形学

作用:建立帧缓存与屏幕像素之间 的一一对应,负责刷新。

光栅显示系统的特点

优点:

– 成本低

– 易于绘制填充图形

– 色彩丰富

– 刷新频率一定,与图形的复杂程度无关 – 易于修改图形

缺点:

– 需要扫描转换

– 会产生混淆

3 基本图形绘制

3.1 图元扫描转换

3.1.1 直线段扫描转换

基本思路

确定最佳逼近于该直线的一组象素

按扫描线顺序,对这些象素进行写操作

三个常用算法
(1)数值微分(Digital Differential Analyzer)算法

计算yi+1= kxi+1+b= k(xi+x) +b = kxi+b+kx= yi+kx

x每递增1y递增k(即直线斜率);

注意:上述分析的算法仅适用于|k|≤1的情形。此时,x每增加1,y最多增加1

当 |k|>1时,必须把x,y地位互换且y增1,则x增1/k。

DDA算法是一个增量算法:在一次迭代计算中,每一步的xy值是用前一步的值加上一个增量来获得的。

该方法直观,但yk需要 浮点表示、以及y的舍入运 算,这不利于硬件实现。

void DDALine(int x0,int y0,int x1,int y1,int color)
{
    int x;
    float dx, dy, y, k;
    dx = x1-x0; dy=y1-y0; k=dy/dx ; y=y0;
    for (x=x0; x<=x1; x++)
    {
        DrawPixel (x, int(y+0.5), color);
        y=y+k;
    }
}
(2)中点画线法

基本思路(原理)—位置关系

计算效率改进:由于只用d 的符号作判 断,为了只包含整数运算, 可以用2d代替d来摆脱小数,提高效率。

具体见PPT

void midPoint Line (int x0,int y0,int x1, int y1,int color)
{ 
    int a, b, d1, d2, d, x, y;
    a=y0-y1; 
    b=x1-x0; 
    d=2*a+b; 
    d1=2*a ;
    d2=2* (a+b);
    x=x0;
    y=y0;
    drawpixel(x, y, color); 
    while (x<x1) 
    {
        if (d<0) {x++; y++; d+=d2; } 
        else {x++; d+=d1;} 
        drawpixel (x, y,color);
    } /* while */
} /* mid PointLine */
(3)Bresenham画线算法

基本思路(原理)—位置关系:由误差项符号决定下一个象素取正右方像素还是右上方像素。

初始值ε(x2)= k -0.5 (k为斜率)

ε(xi+2)= ε(xi+1) + k -1 当ε(xi+1)≥0

ε(xi+2)= ε(xi+1) + k 当ε(xi+1)≤0

Bresenham算法改进内容:

上述Bresenham算法在计算斜率时 (判断直线走向)用到除法。

此外,在计算误差项时用到小数, 由于算法中只用到误差项的符号来判断,因此,如下替换不会改变算法性质: **e’=2*e*dx**

Bresenham算法优点:

整数运算,速度快;精度高;乘2可用移位运算,适于硬件实现。

BresenhamLine(x0,y0,x1,y1,color)
{
    int x0,y0,x1,y1,color;
    int x,y,dx,dy;
    float k,e;
    dx = x1-x0;
    dy = y1-y0;
    e = -dx; 
    x=x0; y=y0; 
    for( i=0; i<=dx; i++)
    {
        drawpixel(x,y,color); 
        x++; 
        e=e+2*dy;
        if(e >=0)
        { 
            y++;
            e=e-2*dx;
        }
    } 
 }

3.1.2 圆弧扫描转换

圆弧的扫描转换

1.确定最佳逼近于该圆弧的一组像素

2.按扫描线顺序,对这些像素进行写操作

中点画圆法
midPointCircle(int r, int color) 
{ 
    int x,y;
    float d;
    x=0; y=r; d=1.25-r; 
    drawpixel(x,y,color); 
    while(x<y)
    {
         if(d<0)
            { d+ = 2*x+3; x++ }
         else
            {d+ = 2*(x-y) + 5; x++;y--; }
    } 
}

算法改进:为了进一步提高算法的效率,可以将上 面的算法中的浮点数改写成整数,将 乘法运算改成加法运算,即仅用整数 与加减法实现中点画圆法:使用 e= d-0.25 代替d因 d0 = 1.25 R=1-R+0.25,d0-0.25 = 1-R,因此 e0 = d0- 0.25 = 1-R

Bresenham画圆算法

d0=3-2R

当di<0时:取Hi,此时yi=yi-1 则 di+1= di +4xi-1+7

当di ≥ 0时:取Li,此时yi=yi-1 - 1,则 di+1=di +4(xi-1-yi-1)+11

3.1.3 椭圆弧扫描转换-中点画法

MidpointEllipe(a,b, color) 
{ 
    int a,b,color;
    int x,y; float d1,d2;
    x = 0; y = b;
    d1 = b*b +a*a*(-b+0.25); 
    putpixel(x,y,color);
    while( b*b*(x+1) < a*a*(y-0.5)) 
    {
        
        if(d1<0)
        {
            d1 +=b*b*(2*x+3);
            x++; 
        }
        else
        {
            d1 +=(b*b*(2*x+3)+a*a*(-2*y+2));
            x++; y--;
        } 
        putpixel(x,y,color);
    }//上部分
    d2 = sqr(b*(x+0.5)) +sqr(a*(y-1)) – sqr(a*b); 
    while(y >0)
    {
        if (d2 <0) 
            { d2 +=b*b*(2*x+2)+a*a*(-2*y+3); x++; y--;}
        else
            {d2 += a*a*(-2*y+3); y--; } 
        putpixel(x,y,color); 
    }
}

3.2 实区域填充

点在多边形内的包含性检验:

  • 检验夹角之和:若夹角和为0,则点p在多边形外;若夹角和为360°, 则点p在多边形内。
  • 射线法检验交点数:交点数=偶数(包括0) ,点在多边形之外;交点数 = 奇数,点在多边形之内。
  • 包围盒法

填充扩大化(边界取舍)问题:规定落在右/上方扫描线上象素不被填充

原理:利用图形的空间连贯性和扫描线的连贯性

顶点交点的计数(取舍)问题:根据交于该顶点的两条边的另外两个端点的y值大于该顶点y值的个数来判断选取该点的个数

区域填充的简单思路与问题:

  • 基本思路: 所有扫描线与所有的边求交、排 序、配对、填充。
  • 规律是: 每条扫描线只与少数的边相交,甚至整个多边形都不相交。

3.2.1 扫描线填充算法---扫描线的顺序

– 有序边表算法

空间连续性规律:

• 边的连续性:当某边与当前扫描线相交时,它很可能与下一条扫描线相交;

• 扫描线的连续性:当前扫描线与各边的交点顺序与下一条扫描线与各边的交点顺序,很可能相同或非常相似。

相关概念:与当前扫描线相交的边称为活性边(Active Edge),把它们按与扫描线交点x坐标递增的顺序存入一个链表中,称为活性边表AEL(Active Edge Table)。

基本思想:

连贯性的存在:多边形的边的连贯性 &扫描线的连贯性

下一条扫描线的活性边表 -> 只需对当前扫描线的活性边表作更新即可得到

具体实现:活性边表的转换与更新

删除旧边:删除与下条 扫描线不再相交的边

插入新边:插入与下条扫描线新相交的边

调整交点顺序:得到新 的活动边表(按照x递增)

活性边表的建立--表中需存放的信息:

x:当前扫描线与边的交点;

△x=-b/a=1/k :从当前扫 描线到下一条扫描线之 间的x增量;

ymax:边所交的最高扫描线 (边何时不再与下条扫描线相交)

新边表的建立: 依据扫描线顺序,存放第一次出现的边(已出现过的边不计)。

存放的信息:

x:扫描线与该边的初始交点(下端点)

△x:从当前扫描线到下一条扫描线之 间的x增量

ymax:该边的最大y值(最高扫描线)

有序边表算法具体描述

对第i条扫描线 -> 第i+1条扫描线->最终填充

step1:把新边表NET[i]中的边结点,用插入排序(与交点计数法则有关)法插入活性边表AET(期初为空),使之按X坐标递增顺序排序;

step2:遍历AET表(结合交点计数规则):把配对交点之间的区间(左闭右开)上的各象素(X,Y),用drawpixel(x,y,color)改写象素颜色值;

step3:遍历AET表:把 i = Ymax的结点从AET表中删除,并把i < Ymax的结果点的X值递增△X;

step4:对下一条(i+1)扫描线,重复以上过程

优点:

– 对每个像素只访问一次

– 与输入/出细节无关 -> 设备无关

缺点:

– 数据结构复杂

– 只适合软件实现

– 边填充算法

• 优点:

– 最适合于有帧缓存的显示器

– 可按任意顺序处理多边形的边

– 算法简单:仅访问与该边有交点的扫描线上右方的像素

• 缺点:

– 对复杂图形,每一像素可能被访问多次,输入/输出量大

– 图形输出不能与扫描同步进行,只有全部画 完才能打印

边填充算法(改进)—栅栏填充算法

• 基本思想:

经过多边形的某个顶点,在多边形内部建立一个与扫描线垂直的“栅栏”,当扫描线与多边形边有交点,就将交点与栅栏之间的象素取补。若交点位于栅栏左边,则将交点之右,栅栏之左的所有象素取补;若交点位于栅栏右边,则将栅栏之右,交点之左的象素取补。

3.2.2 种子填充算法---内部一个点出发

  • 种子填充指先将区域的一点赋予指定的颜色, 然后将该颜色扩展到整个区域的过程。
  • 种子填充算法要求区域是连通的
– 简单种子算法(4连通边界)

种子像素入栈,当栈非空时,重复以下步骤:

(1)栈顶像素出栈

(2)将出栈象素置成填充色

(3)按右、上、左、下(逆时针)顺序检查与出栈象素相邻的四象素,若其中某象素不在边界上且未被置成填充色,则将其入栈

void FloodFill4(int x,int y,int fillColor,int oldColor)
{
    int current;
    current = getpixel(x, y); 
    if (current == oldColor)
    {
        putpixel(x, y, fillColor);
        BoundaryFill4(x+1, y, fillColor, oldColor);
        BoundaryFill4(x-1, y, fillColor, oldColor);
        BoundaryFill4(x, y+1, fillColor, oldColor);
        BoundaryFill4(x, y-1, fillColor, oldColor);
    } 
}

• 优点:

该算法也可以填充有孔区域

• 缺点:

(1) 有些象素会入栈多次,降低算法效率; 栈结构占空间。

(2) 递归执行,算法简单,但效率不高。区 域内每一象素都引起一次递归,进/出栈, 费时费内存。

• 改进算法,减少递归次数,提高效率。 解决方法是用扫描线种子填充算法

– 扫描线种子算法

• 目标:减少递归层次

• 适用于边界表示的4连通区域

扫描线种子填充算法(基本思想)

1在任意不间断区间中只取一个种子像素(不间断区间指在一条扫描线上一组相邻元素)

2 填充当前扫描线上的该段区间;

3然后确定与这一区段相邻的上、下两条扫描线上位于区域内的区段,并依 次把它们保存起来;

4反复进行这个过程,直到所保存的各区段都填充完毕。

扫描线种子填充算法(详细描述)

种子像素入栈,当栈非空时,重复以下步骤:

(1)栈顶像素出栈

(2)沿扫描线对出栈像素的左、右像素进行填充,直到遇到边界像素为止

(3)将上述区间内最左、最右像素记为xlxr

(4)在区间[xl,xr]中检查与当前扫描线相邻的上、下两条扫描线上的像素是否全为边界像素、或已填充的像素。若为非边界、未填充的像素,则把每一区间的最右像素取为种子像素入栈

3.3 图形反走样

反走样概念

• 用离散量表示连续量引起的失真现象称之为走样(aliasing)

• 用于减少或消除走样现象的技术称为反走样(antialiasing)

反走样的方法

• 提高分辨率(硬件、软件方法)

提高分辨率---硬件方法:把显示器分辨率提高一倍,直线经过两倍的象素,锯齿个数也会增加一倍, 但同时每个阶梯的宽度也减小了一倍,所以显示出的直线段看起来就平直光滑了一些。

硬件方法评价:方法简单,但代价非常大,显示器的水平、竖直分辩率各提高1倍, 则显示器的点距减少1倍,帧缓存容量则增加到原来的4倍,而扫描转换同样大小的图元却要花4倍时间;而且只能减轻而不能彻底消除锯齿问题。

提高分辨率---软件方法:高分辨率计算低分辨率显示,把每个像素分为四个子像素,扫描转换算法求得各子像素的灰度值,然后对四像素的灰度值简单平均,作为该像素的灰度值。

软件方法评价:只能减轻而不能消除锯齿问题。

• 简单区域取样

两点假设:1.象素是数学上抽象的点,它的面积为0,它的亮度由覆盖该点的图形的亮度所

决定;2.直线段是数学上抽象直线段,它的宽度为0

现实:像素的面积不为0;直线段的宽度至少为1个像素。

方法步骤:(1)、将直线段看作具有一定宽度的狭长矩形 (2)、当直线段与某象素有交时,求出两者相交区域的面积 (3)、根据相交区域的面积,确定该象素的亮度值。

缺点:

  • 象素的亮度与相交区域的面积成正比, 而与相交区域落在象素内的位置无关, 这仍然会导致锯齿效应。
  • 直线条上沿理想直线方向的相邻两个象素有时会有较大的灰度差。

4 *曲线与曲面

4.1 概述

形状表示与设计的要求

(1)易于实现光滑连接

(2)形状易于预测、控制和修改

(3)几何意义直观, 设计不必考虑其数学表达

4.2 参数曲线基础

函数的常见表达形式

标量函数:平面曲线 :y = f(x) 空间曲线 :y = f(x) z = g(x)

矢量函数:平面曲线 :P(t) = [x(t),y(t)]空间曲线 :P(t) = [x(t),y(t),z(t)]

曲线的表示形式

非参数表示

计算机图形学

参数表示

计算机图形学

参数矢量表示

计算机图形学

参数表示的优点

1)可满足几何不变性的要求。

2)有更大的*度来控制曲线、曲面的形状

3)对曲线、曲面进行变换,可对其参数方程直接进行几何变换。

4)便于处理斜率为无穷大的情形,不会因此而中断计算。

5)便于用户把低维空间中曲线、曲面扩展到高维 空间去。

6)规格化的参数变量t∈[0, 1],使其相应的几 何分量是有界的,而不必用另外的参数去定义 边界。

7)易于用矢量和矩阵表示几何分量,简化了计算。

曲线间连接的光滑度的度量

参数连续性

计算机图形学

几何连续性

直观的、易于交互控制的连续性

0阶几何连续

曲线P=P(t)t = t0 处0阶几何连续:如果它 在 t0处位置连续,即:p(t0-)=p(t0+),记为GC0

1阶几何连续

曲线P=P(t)t = t0 处1阶几何连续:如果它在该处 GC0 ,并且切矢量方向连续:

计算机图形学

记为GC1

2阶几何连续

曲线P=P(t)t = t0 处2阶几何连续:如果它在 t0 处:

(1)GC1 (即:切矢量方向连续)

​ (2)副法线矢量方向连续 B(t0-)=B(t0+)

(3)曲率相等 k(t0-) = k(t0+)

曲线、曲面拟合方法

已知条件

一系列有序的离散数据点 (型值点、控制点 )

边界条件

连续性要求

生成方法

插值

点点通过型值点(型值点:曲线上的点)

插值算法:线性插值、抛物样条插值、Hermite插值

逼近

在一定的误差范围内曲线贴近型值点

最小二乘法、回归分析

拟合

构造曲线的轮廓线贴近型值点或控制点(控制点:控制曲线的点,但曲线不一定过)

Bezier曲线、B样条曲线等

生成曲线的视觉要求:光顺(满足的条件)---不拐来拐去

具有二级几何连续

不存在多余的拐点和奇异点

曲率变化比较小

4.3 参数多项式曲线

概念

位置矢量

几何矩阵

控制顶点

基矩阵

基函数

代数系数矩阵

几何系数矩阵/ 条件边界矩阵 / 几何矩阵

调和函数

4.4 三次Hermite曲线

形状控制

改变端点位置矢量

调节切矢量 P0',P1'的方向

调节切矢量 P0 ',P1' 的长度

优缺点

优点

简单,易于理解

缺点

难以给出两个端点处的切线矢量作为初始条件

不方便

所有参数插值曲线的缺点:

只限于作一条每点都通过给定数据点的曲线

只适用于插值场合,如外形的数学放样

不适合于外形设计

4.5 Bezier曲线

Hermit曲线需要知道起点、终点的切矢,这在实 际工作中很难确定,如果将切矢用位矢代替,问题 就会迎刃而解,Bezier就是从这点入手的。

Bezier基函数--Bernstein多项式

Bernstein基函数的性质

计算机图形学

计算机图形学

Bezier曲线的性质

Bezier曲线的递推(de Casteljau)算法

优缺点:

优点:形状控制直观, 设计灵活

缺点:

所生成的曲线与特征多边形的外形相距较远

局部控制能力弱,因为曲线上任意一点都是所有给定顶点值的加权平均

控制顶点数增多时,生成曲线的阶数也增高

控制顶点数较多时,多边形对曲线的控制能力减弱

曲线拼接需要附加条件,不太灵活

4.6 B样条曲线

对于B样条曲线来说,特征多边形每增加一个顶点,就相应增加一段B样条曲线。因此,B样条曲线 很好地解决了曲线段的连接问题。

特殊外形设计

相切于控制多边形边的曲线--两顶点重合

含有尖点的曲线---三顶点重合

反向弧切接效果---用三点共线的方法

接入一段直线---可用四点共线的方法

优缺点

优点:

与控制多边形的外形更接近

局部修改能力

任意形状,包括尖点、直线的曲线

易于拼接

阶次低,与型值点数目无关,计算简便

缺点:

不能精确表示圆

4.7 曲面的生成

5 真实感绘制-图形裁剪

图形裁剪:确定图形中哪些部分落在显示区之内,哪些落在显示区之外,以便只 显示落在显示区内的那部分图形。图形裁剪算法,直接影响图形系统的效率。

5.1 点的裁剪

P点在窗口内的条件是: xL <=x<=xR and yB <=y<=yT 否则,P点就在窗口外。

5.2 直线段裁剪

直线段裁剪算法是复杂图形裁剪的基础。 复杂的曲线可以通过折线段来近似,从而 裁剪问题也可以化为直线段的裁剪问题。

裁剪线段与窗口的关系: (1)完全可见; (2)完全不可见; (3)其它。

一个概念:显然不可见:即在窗口的某条边的 延长线的非窗口一侧。

1直接求交算法:Cohen-Sutherland算法

编码顺序:上下右左

基本思想

对于每条线段P1P2分为三种情况处理:

(1)若P1P2完全在窗口内,则显示该线段P1P2。

(2)若P1P2显然不可见,则丢弃该线段。

(3)若线段不满足(1)或(2)的条件,则线段与 窗口的边相交,在交点处把线段分为两段。 其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。

算法描述

–若P1P2完全在窗口内:code1=0,且code2=0,则“取”

–若P1P2显然在窗口外:code1&code2≠0,说明在窗口 的某一侧,则“弃”(显然不可见)

–否则,求线段与某一边的交点,在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一 段重复上述处理。

直线裁剪算法小结

优点:简单,易于实现。按上,下, 右,左的顺序依次进行,处理之后, 剩余部分就是可见的了。

特点:用编码方法可快速判断线段的完全可见和显然不可见。

缺点:本算法对于其它形状的窗口未 必同样有效。

2中点分割裁剪算法

可见点:落在窗口内的点

基本思想:找最近可见点

中点分割方法

计算机图形学

从P0出发找距离P0最近可见点的中点分割方法

– 先求出P0P1的中点Pm

– 若P0Pm不是显然不可见的(说明P0P1在窗口 中有可见部分),则距P0最近的可见点一 定落在P0Pm上,则用P0Pm代替P0P1;

– 否则取PmP1代替P0P1;

– 再对新的P0P1求中点Pm。重复上述过程, 直到PmP0长度小于给定的控制常数为止, 此时Pm收敛于交点,即为P0最近可见点。

从P1出发找距离P1最近可见点采用上面类似方法
中点分割裁剪算法---完整描述

从P0点出发找出离P0最近的可见点,和从P1点出发找出离P1最近的可见点。这两个可见 点的连线就是原线段的可见部分。

与Cohen-Sutherland算法一样:首先对线段端点进行编码,并把线段与窗口的关系分为 三种情况,对前两种情况(完全在内、显然不可见),进行同样的处理。对于第三种情况,用中点分割的方法求出线段与窗口的交点:A和B,它们分别为距P0和P1最近的可见点,并保留之,其它段弃之。

3中点算法:梁友栋-barskey算法

算法步骤(核心思想)

计算机图形学

计算机图形学

计算机图形学

计算机图形学

5.3 多边形裁剪

Sutherland-Hodgman算法

存在的问题:对凸多边形,本算法可以得到 正确的结果;但对凹多边形,如图所示显示出一条多余的直线。 因为只有一个输出顶点表,所以表中最后一个顶点总是连着第一个顶点,在裁剪后的多边形有两个或多个分离部分出现。

解决这个问题有多种方法:

一是把凹多边形分割成若干个凸多边形,然后分别处理各个凸多边形。

二是修改本算法:沿着任何一个裁剪窗 口边检查顶点表,并实施正确的连接。

此外,还可用Weiler-Atherton算法。

6 真实感绘制-图形变换

6.1 变换的数学基础

齐次坐标:就是由n+1维向量表示一个n维向量。如n维向量 (P1,P2, ... ,Pn)表示为(hP1,hP2,hPn,...,h),其中h** 称为哑坐标。

  • 同一点的齐次坐标不是唯一的,因为h可以取 不同的值。
  • 普通坐标与齐次坐标的关系为“一对多”
  • 由:普通坐标xh→齐次坐标;由:齐次坐标÷h→普通坐标。
  • h=1时产生的齐次坐标称为“规格化坐标”。

齐次坐标的作用

1 将各种变换用阶数统一的矩阵来表示。提供了一个点从一个坐标系变换到另一坐标系的有效方法。

2 便于表示无穷远点。

3 齐次坐标变换矩阵形式对直线、平面、多 边形、多面体变换具有图形拓扑关系保持不变的特性。

4 变换具有统一表示形式的优点 :便于变换合成&便于硬件实现

6.2 图形的几何变换

相关概念

用户域

程序员用来定义草图的整个自然空间(WD)

  • 用户域是一个实数域,理论上是连续无限的。
  • 人们所要描述的图形均在用户域中 定义。

窗口区

用户指定的任一区域(W )

  • 窗口区W 小于或等于用户域WD
  • 小于用户域的窗口区W 叫做用户域的子域
  • 窗口可以有多种类型,矩形窗口、圆形 窗口、多边形窗口等。
  • 窗口可以嵌套,即在第一层窗口中可再 定义第二层窗口,在第i层窗口中可再定义第i+1层窗口等。

屏幕域(DC)

设备输出图形的最大区域, 是有限的整数域。

视图区

任何小于或等于屏幕域的区域

  • 视图区用设备坐标定义在屏幕域中
  • 当窗口区显示在视图区时,需做窗口区到视图区的坐标转换
  • 视图区可以有多种类型:圆形、矩形、 多边形等
  • 视图区也可以嵌套

关系

用户域->屏幕域

窗口区->视图区

图形的几何变换

作用

把用户坐标系(用户域)与设备坐标系(屏幕域)联系起来

可由简单图形生成复杂图形

可用二维图形表示三维形体

可实现动态显示

图形变换

对图形的几何信息经过几何变换后产生新的图形

图形变换的两种形式

图形不变,坐标系改变

图形改变,坐标系不变

二维图形的显示流程图

计算机图形学

6.3 三维投影变换

计算机图形学

平行投影:投影中心到投影平面距离为无限

透视投影:投影中心到投影平面距离为有限

正、斜平行投影:按投影方向与 投影平面是否垂直进行分类

正三面投影:投影平面与 一个坐标轴垂直,或者说与一个坐标平面平行

正等侧投影:投影平面与三个坐 标轴成相等的夹角(或其法线与 每个坐标轴的夹角相等),投影 后,三个轴的变形系数相等。

正二轴侧投影:投影平面与两个 坐标轴成固定夹角(或其法线与 两个坐标轴的夹角相等),投影 后,两个轴的变形系数相等。

正三轴侧投影:投影平面与三个坐标轴之 间的夹角不相等(或其法线与每个坐标轴 的夹角都不相等),投影后,每个轴的变 形系数都不相等。

斜二侧投影:投影平面的法线与两个坐标轴的夹角相等。

斜等侧投影:投影平面的法线与每个坐标轴的夹角相等。

灭点(消失点)/主灭点:视线(投影线) 从视点(观察点)出发,汇聚于一点称 为灭点。在坐标轴上的灭点称为主灭点。 主灭点就是投影平面相交于坐标轴的数量,以此为依据分为以上的三种。

单/一点透视:投影平面与坐标系的一个轴垂直

二点透视:投影平面与一个轴平行,与另两轴呈相同的固定角度

三点透视:投影平面与三 个轴均呈相同固定角度

6.4 三维观察变换