painteralgorithm.htm
来自「电脑图学(Computer Graphics)是资料结构、演算法与数学的应用」· HTM 代码 · 共 159 行
HTM
159 行
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>画家深度排序</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="ComputerGraphics.htm">Computer Graphics: 画家深度排序</a></h1>
考虑一个CH4分子模型如下所示 :<br>
<img style="width: 150px; height: 142px;" alt="" src="images/painterAlgorithm-1.jpg"><br>
<br>
如果您旋转这个分子模型,则在某些角度时,中间的C原子有时会部份或完全遮盖住外面的一个H分子,这是由于它们在深度上的不同所造成的遮盖效果。<br>
<br>
画家演算法可用来解决不同深度的绘图效果,其实简单的说,就是将远方的物体图形先进行绘制,然后再绘制近方的图形,如此后面绘制的图形就会遮盖住之前绘制的图形,例如: <br>
<img style="width: 278px; height: 153px;" alt="" src="images/painterAlgorithm-2.jpg"><br>
<br>
<br>
所以我在进行绘图之前,必须先对要绘制的图形之Z分量进行深度排序的动作,在物体的移动、旋转等动作之运算完成之后,将所有的物体资讯储存至阵列中,然后对这个阵列进行排序,之后依序绘制出阵列中的图形。<br>
<br>
由于必须额外进行排序的动作,所以在物体的数目多时,使用画家演算法会耗用较多的运算资源与时间,所以通常会依据绘制对象先作一些处理,然后再进行画家演算法。<br>
<br>
例如在凹多面体的绘制时,由于图形有凹陷的面,单先使用法线向量判定法来绘制图形,某些面可能被更前面的平面遮盖而造成图形的错乱(与平面的绘制顺序有关),例如下面这个图形: <br>
<img style="width: 310px; height: 177px;" alt="" src="images/painterAlgorithm-3.jpg"><br>
<br>
在凹多面体的绘制中,我们可以应用画家演算法,但为了加快处理的速度,我们可以先应用法线向量判定法,先将隐藏面去除,再依据所剩下的可视平面之重心来进行深度排序的动作:<br>
<ol>
<li>先用法线向量判定法去除隐藏面</li>
<li>再用深度排序进行画家演算法</li>
</ol>
<br>
画家演算法并无法处理所有的深度问题,例如在有图形贯穿或交叠时,就不能使用画家演算法,例如下面这两个图形并无法使用画家演算法来实现: <br>
<img style="width: 450px; height: 123px;" alt="" src="images/painterAlgorithm-4.jpg"><br>
<br>
像以上的图形有很多技巧可以解决,其中最简单的一种就是补贴图,先依画家演算法处理,然后在必要的地方补上片段图形(有些人戏称为作弊)例如 : <br>
<img style="width: 515px; height: 369px;" alt="" src="images/painterAlgorithm-5.jpg"><br>
<br>
<br>
有时会在报章杂志上看到一些的不合理图形,其中一些图形也是使用这种补贴图的方式产生,例如:<br>
<img style="width: 428px; height: 300px;" alt="" src="images/painterAlgorithm-6.jpg"><br>
<br>
<br>
至于在进行深度排序时,要使用何种排序方式呢?在图形数量不多时,常见的简单排序像是气泡排序法就足够了,当然您也可以试试其它的高等排序来改进效能。<br>
<br>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?