本文主要是概念的总结,并不会讲述具体的算法,如需查看详细内容,请点击相关博客。

1、基础概念:

光栅化(图形的扫描转换):确定最佳逼近图形的像素集合,并用指定属性写像素的过程。
一维图形的表示:在不考虑线宽时,可以直接使用一个像素宽的直线、曲线来显示图形。
二维图形的表示:必须区域填充(确定区域对应的像素集,并使用指定的属性与图案显示
之)。
裁剪:确定一个图形的哪些部分在窗口内必须显示;哪些部分在窗口之外不该显示的过程。
走样:因为像素逼近误差,导致所画图形产生畸变(台阶、锯齿)的现象。
反走样:用于减少或消除走样的技术。
隐藏部分:当不透光的物体阻挡了来自某些物体部分的光线,使其无法到达观察者时的这些
不透明物体。
消隐:由于隐藏部分是不可见的,如不删除隐藏的线或面,就可能发生对图形的错误理解。因此必须将隐藏部分从图中删除,而这一需求便是消隐。

2、直线段的扫描转换算法

相关概念:

当有过端点P0(x0,y0),P1(x1,y1)的直线。
该直线的斜截式:y=kx+b;k=(y1-y0)/(x1-x0)。
该直线的一般式:ax+by+c=0;a=y0-y1,b=x1-x0,c=x0y1-y0x1。

DDA算法:

基本思想:先由x轴值稳步增加1,然后根据k(斜率)计算y轴值,使用四舍五入的方式确定像素点,如此循环,直到画完。

中点画线法:

基本思想:先由x轴值稳步增加1,然后根据ax+by+c=0的直线方程来获取线的y轴值,如果y轴值处于当前像素块中的0.5之上,就选择右上方坐标,否则选择正右方坐标。

Bersenham算法:

基本思想:算是上面两种方法的结合改进版,先由x轴值稳步增加1,然后根据k(斜率)获取线的y轴值,然后根据一个误差项符号决定下一个像素取正右方坐标还是右上方坐标。

计算机图形学——直线扫描转换(基本光栅图形算法)
计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法

3、圆弧的扫描转换算法

相关概念:

八对称性:若已知圆弧上的一点,即可得到4条对称轴与圆弧相交的其他七个点。因此只需
扫描转换出八分之一的圆弧,即可用八对称性求出整个圆弧的像素集。

中点画圆算法:

基本思想:跟中点画线法的思想基本一致,不同之处在于构造函数改为了x^2+y^2-R^2=0;
即先由x轴值稳步增加1,然后根据x^2+y^2-R^2=0来获取圆弧的y轴值,如果y轴值处于当前像素块中的0.5之上,就选择右上方坐标,否则选择正右方坐标。

计算机图形学:中点画圆算法

4、多边形的扫描转换和区域填充

4.1、多边形的扫描转换
相关概念:

活性边:与当前扫描线相交的边称为活性边。
活性边表:把活性边按与扫描线交点x坐标递增的顺序存放在一个链表中,这个链表就是活性表。
新边表:为了方便活性边表建立和更新而建立的一个纵向链表,长度为多边形所占有的最大扫描线数,链表的每个结点称为吊桶,对应多边形覆盖的每一条扫描线,存放着与该扫描线第一次相交的多边形边。

多边形的扫描线算法:

基本思想:从y轴上发射一条条扫描线划过多边形,扫描线经过
多边形内部的像素点就上填充色,在多边形之外的就上背景色。
主要实现方式:通过活性边表求扫描边与多边形边的交点。

多边形的边界标志算法:

基本思想:先使用直线扫描转换将多边形每个边给绘制出来,然后用扫描线算法进行填充。
可以理解为一个人如果让你画一个多边形,你肯定是先拿着多边形顶点去连线,然后在涂颜色。而直线扫描转换就是你在连线,扫描线算法就是你在涂颜色。

4.2、多边形的区域填充
相关概念:

区域:已经表示为点阵形式的填充图形。
内点表示:区域内的所有像素着同一颜色。
边界表示:区域的边界点着同一颜色。
区域填充:先将区域中的一点赋予指定的颜色,然后将该颜色扩展至整个区域的过程。
四连通区域:从区域上一点出发,可通过上下左右4个方向移动的组合,在不越出区域的前提下,到达区域内的任意像素。
八连通区域:从区域上一点出发,可通过上、下、左、右、左上、右上、左下、右下等八个方向移动的组合,在不越出区域的前提下,到达区域内的任意像素。

区域填充的递归算法(种子填充算法):

基本思想:假设在多边形内的一个像素点已知,由此出发利用连通性来找到区域内的所有像素。(八连通的更加全面)

区域填充的扫描线算法:

基本思想:在给定一个种子点之后,就先将该种子点所在扫描线与多边形重叠部分的像素进行填充,然后再找出与该扫描线上、下相邻的两条扫描线,然后再填充,再找相邻,如此循环,直至填充完成。

多边性的扫描转换
计算机图形学——区域填充算法(基本光栅图形算法)

5、字符

常用的字符有两种:ASCII码和汉字编码。标识方式为,采用字节的最高位进行表示,
最高位为0表示ASCII码,最高位为1表示汉字编码。
点阵字符:每个字符使用一个位图表示,其中字位为1则着字符颜色,为0则着背景色。
矢量字符:每个字符使用笔画信息和其对应的端点信息。就好比一笔一笔的写出来的一样。
字符的主要属性包括:字体、字高、字宽因子、字倾斜角、对齐、字色、写方式等。

6、裁剪

相关概念:

裁剪:确定一个图形的哪些部分在窗口内必须显示;哪些部分在窗口之外不该显示的过程。
最简单的裁剪方法就是把各种图形扫描转换为点之后,再判断各点是否在窗口内。
入边:直线由窗口外向窗口内移动时和窗口边界相交的边。
出边:直线由窗口内向窗口外移动时和窗口边界相交的边。

6.1、直线段裁剪
Cohen-Sutherland算法

基本思想:线段全在窗口外就抛弃,全在窗口内则保留。
如果线段只有部分在窗口内,则查找交点,分成两段,不在窗口内的一段抛弃。
重复分段操作行为,直到剩下的线段全在窗口内,则保留。
实现方式:先把窗口的四条边延长,得到9个区域,然后赋予每个区域四位编码,编码的方式为在窗口内的位为0,不在窗口内的位为1. 根据线段的两个端点来获取其所在的区域的编码,全部为0则保留,按位与后不为0(说明完全在窗口外)则抛弃。如果都不是的话,就求交点分割线段。求交点的方式为(按顺序检测端点的编码值不为0时,即与对应的窗口边界求交)。

中点分割裁剪算法

与Cohen-Sutherland算法基本一致,不同的地方在于求交点的方式。
比如:有线段的两个端点p0和p1,p0和p1只有中间部分的线段在窗口中。
于是便求出p0p1的中点,只要p0pm不是显然不可见的,并且p0p1在窗口中有可见部分,
则距离p0最近的可见点一定在p0pm上,于是使用p0pm代替p0p1,否则使用pmp1代替p0p1。
然后取中点求线段。几次重复之后,中点与离p0近的可见点的误差就越来越小,
有点类似牛顿逼近法。离p1最近的可见点也可以通过这样的方式求出。

梁友栋-Barskey裁剪算法
这个有点难。

基本思想:
1、先通过直线的参数方程来确定直线。
将某个点在线段上的位置通过增量乘以u的方式来表示,个人理解增量其实就是线段的长度,
u则是用来控制 点在线段上与起始点间的距离,在线段长度上的占比(0-1)。
2、将窗口的四条边延伸出去,与线段进行相交,得到四个u值,加上起始的u=0、u=1,
求出与 非延伸边 的交点的u值,进行裁剪。
(之所以要0和1,是因为线段为了求交点,也延伸了,但有可能起点和终点本身就在窗口内,
并不需要对应的交点。)
注:入边和出边的概念在这里有应用,因为梁将线段看为有方向的。
具体的求解过程,笔者就不讲了,也讲不来。自己去看下面的博客。

计算机图形学——裁剪
计算机图形学——梁友栋-Barsky算法
6.2、多边形的裁剪
Sutherland-Hodgeman算法

基本思想:使用窗口的四条边作为裁剪线,裁剪多边形。
实现:由裁剪线将平面分为可见一侧和不可见一侧。依序考虑多边形的各条边的两个端点。
大致可以分为以下几种情况:
(1)两个端点均在可见一侧,则保留两个端点。
(2)两个端点均在不可见一侧,则抛弃两个端点。
(3)两个端点有一个在可见一侧,一个在不可见一侧,则保留可见一侧的线段,即保留可见一侧的端点和线段与裁剪线的交点。

最后将这些得到的端点连接起来即可得到可以显示的多边形。
多边形裁剪|Sutherland-Hodgman
6.3、字符串裁剪

字符串裁剪可分为三个精度进行:串精度、字符精度、笔画(像素)精度。
串精度:包围字符串的外接矩形框,没能全部在窗口内,则整个字符串都不显示。
字符精度:包围字符的外接矩形框,全部在窗口内,则显示。否则不显示。
笔画精度:将笔画变成直线段来进行裁剪,完全就是有多少在窗口内,就显示多少。

7、反走样

相关概念:

走样:用于表示图形的基本单位是一个个离散的像素,这样用离散量表示连续量引起的失真现象。
反走样:用于减少或消除走样现象的技术。

7.1、提高分辨率

把显示器分辨率提高一倍,直线经过两倍的像素,锯齿增加了一倍,但同时每个阶梯的宽度
也减小了一半,由此看上去更加平滑。

7.2、区域采样

基本思想:先假定每个像素是具有一定面积的小区域,然后将直线段看做具有一定宽度的狭长矩
形。当直线段与像素有交时,求出两者相交的面积,然后根据相交的区域面积的大小确定该像素
的亮度值。
缺点:1、像素亮度只与相交区域面积成正比,与相交区域落在像素内的位置无关。2、直线条上沿着理想直线方向上的两个像素有时会存在较大的灰度差。

7.3、加权区域采样

基本思想:在区域采样的基础上,将像素划分为n个更小的子像素,并引入了对应的加权表,该加权表为每个子像素对原像素的贡献值(如1/16),通常离中心越近值越大。统计所有中心值落在直线段上的子像素的权值()之和,乘以最大灰度值作为该像素的最大灰度值。

计算机图形学——反走样

8、消隐

相关概念:

消隐:由于显示设备为二维的,当三维模型要显示时,便需要先进行投影变化,但投影变换会失
去深度信息,导致二义性。而消除这种二义性、在绘制时消除被遮挡的不可见的线和面的方法称
为消隐。消隐按消隐对象分类:
线消隐:消隐对象是物体上的边,消除的是物体上不可见的边。
面消隐:消隐对象是物体上的面,消除的是物体上不可见的面。消隐按消隐空间分类:
物体空间的消隐算法:将场景中每个面与其他每个面比较,求出所有点、边、面的遮挡关系,
如光线投射算法、Roberts算法。
图像空间的消隐算法:对屏幕上的每个像素进行判断,决定哪个多边形在该像素可见。
例如:Z-Buffer算法、扫描线算法、Warnock算法。
物体空间和图像空间的消隐算法:在物体空间中预先计算main的可见性优先级,
再在图像空间中生成消隐图,例如:画家算法。前向面:由视点出发的观察向量与某多边形面的法向量相乘的值小于0时的该多边形面。
后向面:由视点出发的观察向量与某多边形面的法向量相乘的值大于0时的该多边形面。

8.1、消除隐藏线

线与线无法产生遮挡关系,只有面和体才能与线产生遮挡关系。
基本运算:判断面对线的遮挡关系。体也可以分解为面,再进行判断。
三种情况:
1、视点与线段在给定平面的同侧,则不遮掩。
2、线段的投影与平面投影无交,则不遮掩。
3、线段的投影与平面投影相交,则求交点,根据交点将线段的投影分成若干段。每一段的中点
如在平面的投影内,则该段被遮挡,否则则显示。

8.2、消除隐藏面
8.2.1、画家算法(列表优先算法):

基本思想:首先将屏幕置为背景色,把物体的每个面按其离视点的远近进行排序,离视点远的放
在前面先绘制,离视点近的放后面后绘制。这样后绘制的面就会覆盖掉先绘制的面。
缺点是:只能处理互不想交的面,而且深度优先列表中面的顺序可能出错。

8.2.2、Z缓冲区(Z-Buffer)算法

基本思想:用帧缓冲区存放每个像素的颜色值,用深度缓存来存放每个像素的深度值。当遍历到
屏幕中一个像素点时,如果(1)该像素点没有在多边形上,则帧缓冲区对应位置置为背景颜色,
如(2)在一个多边形上,则置为该多边形的颜色,
如(3)在多个多边形上,则置为这些多边形中深度(z轴值)最大的那个多边形的颜色。

Z缓冲区算法需要判断一个给定的点是否在多边形内。判断可以采用射线法和弧长法。

射线法

基本思想:由被测点P向y=负无穷方向做射线,如果与多边形的交点个数为奇数,则在多边形内,
为偶数则在多边形外。
如果刚好与多边形的顶点重叠,则采用“左开右闭”原则来计算。
边在射线左侧,则交点个数+1,边在射线右侧,则交点个数不变。

弧长法

基本思想:以被测点P为圆心作单位圆,将全部有向边向单位圆做径向投影,并计算其在单位圆上
弧长的代数和。
如果代数和为0,则点在多边形外部;
如代数和为2π,则点在多边形内部;
如代数和为π,则点在多边形边上。

8.2.3、扫描线Z-Buffer算法

基本思想:与Z-Buffr算法非常相似,区别在于:
(1)将整个绘图窗口内的消隐问题分解到了一条条扫描线上解决,使得所需的Z缓冲区大大减小;
(2)计算深度值时,利用面的连贯性(扫描线的增量计算),只用了一个加法(因为x的增量为1)。
但计算深度时,依旧是按像素点计算。

8.2.4、区域扫描线算法

基本思想:在扫描线Z-Buffer算法的基础上,根据扫描线的投影与多边形的投影相交,
将扫描线分为若干子区间。
每次深度测试,整个子区间一起测试,每次上色时,整个子区间一起上色。

8.2.5、区域子分割算法(Warnack算法)

基本思想:把物体投影到全屏幕窗口上,然后递归的分割窗口,直到窗口内的目标足够简单,
可以显示为止,至多分割窗口至为像素大小。复杂的地方,分割的窗口越多。
个人理解:其实就是把区域扫描线算法的扫描线子区间,改为了窗口子区间。

8.2.6、光线投射算法

基本思想:考察由视点出发穿过观察屏幕的一个像素而射入场景的一条射线,则可以确定出
场景中与该射线相交的物体。

计算机图形学—— 隐藏线和隐藏面的消除(消隐算法)
参考书籍:
《计算机图形学基础教程》 孙家广 胡事民著

图形学日记(一)光栅图形学相关推荐

  1. 【计算机图形学】壹 · 光栅图形学之直线段的扫描转换算法

    有两点P0(x0,y0),P1(x1,y1)P_{0}(x_{0},~y_{0}),~P_{1}(x_{1},~y_{1})P0​(x0​, y0​), P1​(x1​, y1​)确定一条线段L(P0 ...

  2. 吉林大学计算机图形学实验_计算机图形学学习笔记(一):图形学概论

    第一章 计算机图形学概论 1.1 全书概述 图形学基本知识 光栅图形学 扫描转换.区域填充.裁减.反走样.消隐 二维.三维图形变换及观察 几何造型 参数曲线曲面基本概念.Bezier曲线曲面.B样条曲 ...

  3. 光栅图形学算法基础其二 (裁剪算法)

    光栅图形学算法的研究内容      直线段的扫描转换算法 多边形的扫描转换与区域填充算法 直线裁剪算法 反走样算法 消隐算法 一.裁剪简述         使用计算机处理图形信息时,计算机内部存储的图 ...

  4. 图形学(2)光栅图形学的直线绘制(上)

    本模块内容绝大部分是在慕课上看中国农业大学网客时的笔记,因此算作转载,在此鸣谢赵明.李振波两位老师,感谢他们录制该门课程供大家学习! 光栅图形学 为适应光栅显示器,需发展一套和他相适应的算法来处理.显 ...

  5. 计算机图形学 第四章 光栅图形学

    第四章 光栅图形学 计算机图形学 第四章 光栅图形学的相关内容,包括:直线段的扫描转换算法.圆弧的扫描转换算法.多边形区域填充.字符的生成.裁剪.反走样 等 Def 光栅显示器:一个像素矩阵(因此,要 ...

  6. 【图形学基础】光栅图

    [图形学基础]光栅图 文章目录 [图形学基础]光栅图 前言 1. 初识光栅图 2. 光栅设备 2.1. 展示型光栅设备 2.2. 硬拷贝型光栅设备 2.3. 输入型光栅设备 3. 图片,像素,几何 3 ...

  7. 光栅图形学-画直线经典算法

    光栅图形学算法-画直线算法 如果对这些算法感兴趣,可以去查阅算法的详细介绍,这里只是用伪代码来描述这些算法. 1.DDA算法 DDA算法依赖于直线的斜截式方程 n=x2 - x1; //像素点个数k ...

  8. 【XJTUSE计算机图形学】第二章 光栅图形学(1)

    文章目录 [XJTUSE计算机图形学]第二章 光栅图形学(1) 1.基本概念 2.直线段的扫描转换算法 数值微分(DDA)法 增量算法 中点画线法[重点] Bresenham算法[重点 很有可能会考] ...

  9. 计算机图形学生活应用,计算机图形学的应用实例(计算机图形作业).doc

    计算机图形学的应用实例(计算机图形作业).doc 计算机图形学大作业 计算机图形学的应用实例 班级: 学号: 姓名: 2012-03-12 计算机图形学的应用实例 一.计算机图像学简介 计算机图形学是 ...

  10. 计算机图形学透视投影知识点,计算机图形学

    计算机图形学期末复习 第一章 绪论 计算机图形学定义:计算机图形学是研究通过计算机将数据转换成图形,并在专门显示设备上显示的原理.方法和技术 第二章 计算机设备及硬件系统 知识点 阴极射线管(CRT) ...

最新文章

  1. C++实现另一个猜数字游戏
  2. 2018-2019 ACM—ICPC SEERC 题解
  3. linux container 原理,容器概念与Linux Container原理
  4. %3c php foreach%3e,PHP 数组函数-数组排序
  5. STM32F103移植mpu9250
  6. python1011无标题_讲解:Python:COMP1011 Programming For The WebPython
  7. python输入整数n计算并输出1+22+333_Python 经典练习题-016
  8. centos 6.5上安装php7,centos 6.5 编译安装PHP7
  9. CCNA学习笔记3---备份和升级IOS
  10. pyhanlp 繁简转换,拼音转换与字符正则化
  11. AutoCAD输入netload命令后不弹出菜单而是一直显示程序集文件名解决方案
  12. c盘满了怎么清理垃圾而不误删?C盘清理,4个方法!
  13. MySQL--数据库基础知识点(一)
  14. 07中华小姐大赛落幕 20岁佳丽曾光夺冠
  15. 服务器虚拟化的未来展望,IT号外:未来展望之拥抱虚拟化3.0
  16. The following packages have unmet dependencies: libx11-dev : Depends: libx11-6 (= 2:1.6.7-1+deb10u2
  17. SQL中的DECIMAL()函数
  18. 最大数据被盗案是怎么被发现的:从微博被加粉开始
  19. 【转载BYR】一年来遇到的C++问题和解决方法,分享一下
  20. # 160_技巧_Power BI 新函数-计算工作日天数

热门文章

  1. python基础篇大合集,进程、装饰器、列表详解篇!
  2. 关于Layabox发布的OPPO小游戏程序出错在谷歌浏览器上无报错的解决方案
  3. Activiti6---通用拒绝
  4. 个人服务器的搭建(腾讯云服务器)
  5. 微信小程序设计指南官方版放出
  6. T端无限制附魔NPC脚本
  7. 2020年百度搜索算法规范(算法盘点)
  8. 2020年哈尔滨工业大学C语言程序设计精髓 第八周练兵编程题
  9. c语言怎么用二维数组表示坐标,c语言中二维数组怎么用?
  10. Github全面详解-20 什么是开源