2016-02-21 44 views
0

我正在學習計算機圖形學並遇到了Cohen-Sutherland線剪裁算法。如果我們有一個由P1P2這兩個點定義的線段,並且我們試圖找出它是否在裁剪矩形內裁剪(通常由屏幕的寬度和高度定義,左上角是[0,0] )爲什麼在Cohen-Sutherland剪裁算法中計算水平線的x截距時需要舍入?

的算法很簡單,我們只需要檢查每一個點,看看是否該點的x和y是超出範圍:

if (y1 < min_clip_y) 
     p1_code |= CLIP_NORTH; 
else if (y1 > max_clip_y) 
     p1_code |= CLIP_SOUTH; 

if (x1 < min_clip_x) 
     p1_code |= CLIP_WEST; 
else if (x1 > max_clip_x) 
     p1_code |= CLIP_EAST; 

// Same deal with x2, y2 

如果兩個p1_codep2_code不等於零我們拒絕行,如果它們都是零,我們接受它,否則我們繼續測試以找到剪輯交叉點與剪切矩形邊交叉點:

switch(p1_code) 
{ 
    case CLIP_NORTH: 
    { 
     yc1 = min_clip_y; 
     xc1 = x1 + 0.5f + (min_clip_y - y1) * (x2-x1)/(y2-y1); 
    } break; 

    // other cases... 
} 

我從書中讀到這個。我理解我們如何推導x截距的方程,我只是不明白爲什麼我們要添加0.5f來舍入到下一個整數。我們爲什麼需要輪流?

謝謝!

回答

0

許多計算機圖形文本都有這樣的錯誤。 C-S是在50年前發明的,當浮點數比整數數學慢得多時,所以規範是使用整數算術或整數指令來模擬固定點。其結果是舊代碼的奇怪重新實現將舊浮點移植到舊定點。這顯然是其中之一。如果您懷疑,您希望使用浮點完成整個計算,然後在最後完全需要時繞回最近的像素。但是對於現代GPU,甚至可以跳過這一點,因爲消除鋸齒的線條繪圖可以用浮點座標來做正確的事情。

事實上,奇怪的是,圖形文本仍然突出顯示線條裁剪,因爲現代圖形更多地是關於多邊形。有許多不錯的三角形和多邊形算法比線條裁剪更具實用性。太多的教科書作者都是他們學徒工具的奴隸。

+0

感謝您的回答。我的書是相對老的,但它是獨一無二的,至少我沒有看到太多類似它的書。它由Andre Lamothe完成一個軟件渲染器的創建,但是首先創建一個線框引擎,您可以通過Bresenham繪製線條和三角形,然後剪裁線條。我得不到的是,爲什麼要輪到下一個整數,而不是現在的整數呢?即如果結果是「2.3」,爲什麼要舍入3而不是2? – vexe

+0

@vexe你錯了。 (int)(x + 0.5)具有舍入到最接近的整數的效果,因爲轉換爲int會截斷。 (2.3 + 0.5)截斷是2,而不是3.我的觀點是,這是一個愚蠢的地方轉換爲整數。它使算法相當不準確。完全在浮點上進行剪裁,然後四捨五入到像素座標。 – Gene

+0

「完全在浮動狀態下進行剪裁,然後在像素座標上進行四捨五入」 - 您的意思是讓輸入座標處於浮動狀態,然後在最後將它們四捨五入? 「你錯了」 - 確定2.3是一個壞榜樣。取2.7,int(2.7)== 2,int(2.7 + 0.5)== 3,我想看看我現在知道答案了,這是因爲2.7比3更接近3,所以我們輪迴的原因是要靠近對實際浮點值的整數值。 – vexe