我正在學習計算機圖形學並遇到了Cohen-Sutherland線剪裁算法。如果我們有一個由P1
和P2
這兩個點定義的線段,並且我們試圖找出它是否在裁剪矩形內裁剪(通常由屏幕的寬度和高度定義,左上角是[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_code
和p2_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來舍入到下一個整數。我們爲什麼需要輪流?
謝謝!
感謝您的回答。我的書是相對老的,但它是獨一無二的,至少我沒有看到太多類似它的書。它由Andre Lamothe完成一個軟件渲染器的創建,但是首先創建一個線框引擎,您可以通過Bresenham繪製線條和三角形,然後剪裁線條。我得不到的是,爲什麼要輪到下一個整數,而不是現在的整數呢?即如果結果是「2.3」,爲什麼要舍入3而不是2? – vexe
@vexe你錯了。 (int)(x + 0.5)具有舍入到最接近的整數的效果,因爲轉換爲int會截斷。 (2.3 + 0.5)截斷是2,而不是3.我的觀點是,這是一個愚蠢的地方轉換爲整數。它使算法相當不準確。完全在浮點上進行剪裁,然後四捨五入到像素座標。 – Gene
「完全在浮動狀態下進行剪裁,然後在像素座標上進行四捨五入」 - 您的意思是讓輸入座標處於浮動狀態,然後在最後將它們四捨五入? 「你錯了」 - 確定2.3是一個壞榜樣。取2.7,int(2.7)== 2,int(2.7 + 0.5)== 3,我想看看我現在知道答案了,這是因爲2.7比3更接近3,所以我們輪迴的原因是要靠近對實際浮點值的整數值。 – vexe