直線生成演算法 Bresenham畫線法

2021-07-07 11:13:01 字數 1370 閱讀 8799

我們將平面劃分成十個部分,從第一象限的x軸開始做逆時針旋轉,每隔45度角為一部分,由此類推到第八部分。y軸正向為第九部分,負向為第十部分。

當直線的斜率k∈[0,1],bresenham畫線演算法的基本原理是通過各行各列畫素中心構造一張虛擬網格線,按直線從起點到終點的順序計算直線與各垂直網格線的交點,然後確定該列畫素中與此交點最近的畫素。如果在x方向增加乙個單位長度,在y方向是否增加乙個單位根據計算的誤差項d來決定。d為所畫直線與網格垂直線的交點到本網格水平底線的距離。

當d>=1時,將其減去1,使其保持在乙個單位之內,因此誤差項d的界定為0.5.判斷條件為:d>=0.5取右上方畫素,反之取正右方畫素。

同理於斜率在[1,+∞]和負數的情況,當斜率的絕對值大於1時,如果在y軸方向增加乙個單位長度,在x方向是否增加乙個單位根據計算的誤差項d來決定。

程式實現時,依舊劃分為8+2個共10個區域,但是這次引入對換方法實現,由於8個區域內存在4對4的斜率相同的情況,即,八個兩兩中心對稱的區域斜率相同,只是始末點不同。同時因為直線的無向性,所以我們以y軸為屆,x軸正向的情況通過公式匯出,x軸負向的通過其中心對稱區域的點互換數值實現直線畫圖。同時依舊使用if和switch語句實現。

onbresenhamline()

dx = x1 - x0;

dy = y1 - y0;

ex = -dx;

ey = -dy;

x = x0;

y = y0;

state = 0;

dx = abs(dx);

dy = abs(dy);

//狀態分析

if (dx > 0)

else

}else if (dx < 0)

else

}else if (dy < 0)

state = 9;

else

state = 10;

switch (state)

}break;

case 2: case 6:

for (i = 0; i <= (-dy); i++)

}break;

case 3: case 7:

for (i = 0; i <= dy; i++)

}break;

case 4: case 8:

for (i = 0; i <= dx; i++)

}break;

case 9:

while (y >= y1)

break;

case 10:

while (y <= y1)

break;

default:

break;

} releasedc(pdc);

}

直線生成演算法

目的 理解基本圖形元素光柵化的基本原理 掌握一種基本圖形元素光柵化演算法 利用opengl實現直線光柵化的 dda演算法。要求 根據所給的直線光柵化的示範源程式,在計算機上編譯執行,輸出正確結果 了解和使用opengl的生成直線的命令,來驗證程式執行結果。include include includ...

直線生成演算法

所謂圖元的生成,是指完成圖元的引數表示形式 由圖形軟體包的使用者指定 到點陣表示形式 光柵顯示系統重新整理時所需的表示形式 的轉換。通常也稱掃瞄轉換圖元。直線的掃瞄轉換 確定最佳逼近於該直線的一組畫素,並且按掃瞄線順序對這些畫素進行寫操作。三個常用演算法 1 數值微分法dda 2 中點畫線法 3 b...

實驗二 直線生成演算法

一 實驗目的和要求 1.理解基本圖形元素光柵化的基本原理,掌握一種基本圖形元素光柵化演算法,利用opengl實現直線光柵化的dda演算法。二 實驗內容及主要步驟 1 根據所給的直線光柵化的示範源程式,寫出dda演算法,在計算機上編譯執行,輸出正確結果 2 了解和使用opengl的生成直線的命令,來驗...