?? page251.html
字號:
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<title>第9章 圖形顯示</title>
</head>
<body>
<style type="text/css">
body {
background-color: #c0c0c0;
}
table {
background-color: #c0c0c0;
line-height: 24px;
}
</style>
<!導航條>
<p><a href="content1.html">目錄</a> <a href="page250.html">上一頁</a> <a href="page252.html">下一頁</a> <a href="page269.html">下一章</a></p>
<table border=0 align="center" width=800 frame="box" rules="none">
<!標尺行>
<tr>
<td width=3%></td><td width=6%></td><td width=1%></td> <!左側空白>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=1%></td><td width=6%></td><td width=3%></td> <!右側空白>
</tr>
<!頁眉行>
<tr height=60 valign="bottom">
<td></td><td></td><td></td>
<td colspan=6><img src="icons/flag.gif"></td><td colspan=4></td><td colspan=6 align="right">第9章 圖形顯示</td> <!章節(jié)名>
<td></td><td>-251-</td><td></td> <!頁碼>
</tr>
<!頁眉線>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!正文>
<font face="宋體" lang="ZH-CN" size=3>
<tr height=20><td colspan=22></td></tr> <!頂部空白>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=18>
的點就會被畫在屏幕上的第一行,因為199/200直接取整為0。上面給出的程序其實就是直接將計算結果取整,結果造成了畫"拐棍兒"的效果。<br>
這樣的問題可以通過改進程序加以解決,就上面這個程序而言,只要在計算Y坐標時采用四舍五入的方法取整就能很好地解決這個問題。然而這樣做并不是最理想的改進方法,因為這個程序還有其它一些缺點:比如我們將程序中的續(xù)止點X、Y坐標交換一下,即由(200,1)變成(1,200),那么這個程序就會產(chǎn)生十分尷尬的結果:整條線變成了兩個點。看來"弱智"也是這個程序的一個缺陷。它至少應該能對(Y1-Y0)和(X1-X0)這兩個差值做些比較,如果(Y1-Y0) (X1-X0)那么程序應該以(Y1-Y0)作為循環(huán)計數(shù),而采用公式X=Y/K計算X坐標。<br>
列舉了以上一些不足之處,意在說明采用公式"Y=Kx+b"來畫直線并不適用于計算機。其實上述這些缺點都是次要因素,最主要的一個缺點就是這種算法要使用乘法和除法運算。乘除法運算要消耗大量的時間,所以說這種算法是極低效的,這是這種算法的致命的缺陷。因此我們必須設計出既有效率又有效果的畫線算法。<br>
當我們給出一條直線的兩個端點后,比如起點為(0,0),終點為(5,2),屏幕上應該顯示出什么樣的圖形才能給人感覺是一條直線呢?毫無疑問,屏幕上應該顯示出如圖8-4(a)所示的幾個點,即每畫兩個點之后Y坐標值要加1。如果起點仍為(0,0),終點為(11,3),那么屏幕顯示出的圖形就應該如圖8-4(b)所示的樣子了。不難看出如果我們所設計的程序能夠在畫第3、5點(對于圖8-4b來說是畫第3、7、11點)時自動將Y坐標值加上1,那么就能產(chǎn)生另人滿意的效果來。看來要解決的一個關鍵問題就是要判斷在什么樣的情況下所畫點的Y坐標值需要加1。
</td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=18 align=center><img src="figures/F9_4.gif"><br><font face="楷體_GB2312">圖9-4 直線的近似畫法</font></td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=18>
圖9-5給出了一種算法,可以看到程序只要能夠判斷某個點的ΔY值是否大于1/2就可以決定是否將這個點的Y坐標值加1。具體來說,當ΔY>1/2時,所畫點的Y坐標值就要加1,而當ΔY≤1/2時所畫點的Y坐標值保持不變。這里就出現(xiàn)了兩個問題:第一,各個點的ΔY值應如何計算?第二,怎樣將ΔY與1/2相比較?<br>
第一個問題比較好解決,從圖中我們可以看到,直線的起點A(0,0)的ΔYa=0,第二個點B的ΔYb=0+K,第三個點C的ΔYc=0+K+K,第四個點D的ΔYd=0+K+K+K-1,第五個點E的ΔYe=0+K+K+K+K-1,以此類推,其中的K就是這條直線的斜率,K=ΔY'/ΔX'=(Y1-Y0)/(X1-X0)。可以看出計算ΔY的過程都包括一個"斜率累加"的過程,只是在Y坐標值加1之后要從累加值中減去1。如果我們把K=ΔY'/ΔX'代入公式,則有ΔYa=0,ΔYb=ΔY'/ΔX',ΔYc=(ΔY'+ΔY')/ΔX',ΔYd=(ΔY'+ΔY'+ΔY'-ΔX')/ΔX',"斜率累加"就變成"ΔY'累加"了。<br>
由ΔY的計算式我們還可以看出每個點的ΔY都是分數(shù),那么如何判斷一個分數(shù)是否大于1/2呢?很明顯若一個分數(shù)滿足"(分子x2)>分母",則這個分數(shù)就大于1/2。對于圖中的B點而言,如果2ΔY'>ΔX',就說明其ΔY大于1/2。對于C點,如果2ΔY'+2ΔY'>ΔX',則其ΔY大于1/2。而D
</td>
<td></td><td></td> <!右邊距>
</tr>
</font>
<!頁腳線>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!頁腳>
<tr height=60 valign="top">
<td></td><td></td>
<td colspan=9><i>Copyright © 2004-2005 <a href="mailto:webmaster@nucstorm.com">Chunk Lee</a></i></td>
<td colspan=9 align="right"><i><a href="http://www.nucstorm.com" target="_top">www.nucstorm.com</a></i></td>
<td></td><td></td>
</tr>
</table>
<!導航條>
<p align="right"><a href="content1.html">目錄</a> <a href="page250.html">上一頁</a> <a href="page252.html">下一頁</a> <a href="page269.html">下一章</a></p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -