前兩天在校內(nèi)上發(fā)了一篇bresenham畫線算法超簡(jiǎn)單的日志,用了四句話概括了這個(gè)算法的核心思想,現(xiàn)在在這里重新敘述一遍,并加上這幾天我新理解到的幾點(diǎn)。
我用x(k+1)表示k+1是下標(biāo)。
x(k+1) = x(k)+1時(shí),按比例,y方向應(yīng)增加△y/△x這么多。
其中,△y=|yEnd-y0|,△x=|xEnd-x0|
如果△y/△x超過(guò)了1/2,也就是位于y(k)和y(k+1)中較上的位置y(k+1),則選擇y(k+1),否則選擇y(k).
如果△y/△x超過(guò)了1/2可以轉(zhuǎn)化為p0=2△y-△x。判斷p0符號(hào)即可。
今天重新看了一下,發(fā)現(xiàn)了幾個(gè)我忽略了的細(xì)節(jié)問(wèn)題。我們首先要把x0,y0點(diǎn)畫上,并且這個(gè)點(diǎn)的位置是絕對(duì)準(zhǔn)確的。p0為什么有初值呢,是2△y-△x,是因?yàn)閜0第一次用的時(shí)候就是在畫下一個(gè)點(diǎn)了而不是初始點(diǎn)。pk確定以后,pk+1-pk就有兩種情況了,繪制上面一點(diǎn)和下面一點(diǎn)的增量是不同的,最好理解的方法就是還原成用△y/△x表示的式子化簡(jiǎn)得到pk+1再計(jì)算差值,即增量。
同樣的道理,并行畫線算法也可以寫成那樣的式子再進(jìn)行轉(zhuǎn)化和推算,并不需要好幾頁(yè)紙的推導(dǎo)的。中點(diǎn)畫圓算法也是的。在中點(diǎn)畫圓算法的代碼中,用到了class,加入了一點(diǎn)面向?qū)ο蟮乃枷耄@個(gè)是我要著重學(xué)習(xí)和體會(huì)的。
關(guān)于透視投影,可算被折騰壞了,剛開(kāi)始理解不了,后來(lái)理解錯(cuò)了,還是在shinji的熱心幫助下才算真正明白了。現(xiàn)實(shí)中是不存在一點(diǎn)透視的,所謂的一點(diǎn)透視只是看起來(lái)與人眼觀察比較相近。對(duì)于
一個(gè)三維笛卡爾坐標(biāo)系中的
點(diǎn),或者與z軸垂直的線或平面,可以理解為觀察點(diǎn)與滅點(diǎn)關(guān)于過(guò)此點(diǎn)的垂直于z軸的平面對(duì)稱。對(duì)于一個(gè)圖形不同深度位置的部分,滅點(diǎn)位置是不同的。也就是說(shuō),觀察點(diǎn)只有一個(gè),滅點(diǎn)有無(wú)數(shù)多個(gè)。隨著物體離觀察點(diǎn)距離的增大,滅點(diǎn)以兩倍速度向遠(yuǎn)處延伸。所以我們現(xiàn)實(shí)中觀察的鐵軌是延伸到很遠(yuǎn)處交于一點(diǎn)而不是止于某處。
關(guān)于多個(gè)滅點(diǎn)這個(gè)問(wèn)題,這是我自己的理解,也不知道是否準(zhǔn)確,如果哪里錯(cuò)了還請(qǐng)大家批評(píng)指正。謝謝