Bresenham 直线算法

Bresenham 直线算法是直线画法中目前比较优秀的算法,不仅高效,而且实现了用整形代替了浮点数的运算,可谓经典。
该算法的核心思想:
比较两点之间的X轴的增量deltaX,和Y轴的增量deltaY那个比较大,然后以那个为进取方向,因此保证了斜率在K <= 1,然后通过斜率计算另一个方向的数值,那么当步进方向增量为1的时候,另一个方向增量为K,因此可以保证另一个方向,直线所在的位置,
都有像素。

具体的算法如下:

<textarea cols="50" rows="15" name="code" class="cpp">inline
void SwapInt(int &amp;nTempA, int &amp;nTempB)
{
	int nTemp = nTempA;
	nTempA = nTempB;
	nTempB = nTemp;
}
</textarea> 

Bresenham 直线算法:
<textarea cols="50" rows="15" name="code" class="cpp">BOOL Bresenham(CPoint ptStart, CPoint ptEnd, CDC *pDC) { int nX1 = ptStart.x; int nY1 = ptStart.y; int nX2 = ptEnd.x; int nY2 = ptEnd.y; int nDx = abs(nX2 - nX1); int nDy = abs(nY2 - nY1); bool bYDirection = false; if (nDx &lt; nDy) { // y direction is step direction SwapInt(nX1, nY1); SwapInt(nDx, nDy); SwapInt(nX2, nY2); bYDirection = true; } // calculate the x, y increment int nIncreX = (nX2 - nX1) &gt; 0 ? 1 : -1; int nIncreY = (nY2 - nY1) &gt; 0 ? 1 : -1; int nCurX = nX1; int nCurY = nY1; int nTwoDY = 2 * nDy; int nTwoDyDx = 2 * (nDy - nDx); int nIniD = 2 * nDy - nDx; while (nCurX != nX2) // nCurX == nX2 can not use in bitmap { if(nIniD &lt; 0) { nIniD += nTwoDY; // y value keep current state } else { nCurY += nIncreY; nIniD += nTwoDyDx; } if (bYDirection) { pDC-&gt;SetPixel(nCurY, nCurX, RGB(0, 0, 255)); } else { pDC-&gt;SetPixel(nCurX, nCurY, RGB(0, 0, 255)); } nCurX += nIncreX; } return TRUE; }</textarea>

你可能感兴趣的:(Bresenham 直线算法)