昨天面试时,让我写一个画线算法,我大喜,以为找着便宜了,没有十几分钟,就把画线算法写出来了,还洋洋得意,结果另人把我的代码一看,说我的程序肯定速 度慢,另外,又用vc自带的放大镜一看,说我直线中有些点的位置不对。我还自称精通图形学,太丢人了,请问各位老大,你们是如何优化画线算法的, 请给一段优秀的在光栅上画直线的算法给我学习学习。真想见一见传说中的最优画线算法,不知CDC中的LineTo是如何实现的。请各位高手成全小弟!
调试欢乐多
template<class Fun>
void
DrawLine(long x0, // start point
long y0,
long x1, // end point
long y1,
Fun &fu
)
{
long dx, dy;
long dxSign, dySign;
dxSign = (x1 > x0) ? 1 : ( (x1 == x0) ? 0 : -1 );//dxSign = 1, 0 , -1
dySign = (y1 > y0) ? 1 : ( (y1 == y0) ? 0 : -1 );
dx = abs(x1 - x0);
dy = abs(y1 - y0);
long x, y;
x = x0;
y = y0; bool bExchange = false;
if( dy > dx )
{
bExchange = true;
std::swap(dx, dy);
} long p;
p = dy * 2 - dx;
long i;
for( i = 0; i <= dx; i++ )
{
if( !fu(x,y) )
{//over.
return;
}
if( p >= 0 )
{
x += dxSign;
y += dySign; p = p + (dy - dx) * 2; // p = p - 2 * dx;
}
else{
if( bExchange )
{
y += dySign;
}
else{
x += dxSign;
}
p = p + dy * 2;// p = p + 2 * dx;
}
}
} //draw line.
void
DrawLine(long x0, // start point//?为什么用long 型,字长的四倍速度较快,int 也是字长的四倍
long y0,
long x1, // end point
long y1,
Fun &fu
)
{
long dx, dy;
long dxSign, dySign;
dxSign = (x1 > x0) ? 1 : ( (x1 == x0) ? 0 : -1 );//dxSign = 1, 0 , -1
dySign = (y1 > y0) ? 1 : ( (y1 == y0) ? 0 : -1 );
dx = abs(x1 - x0); //改成上两行的方式较好,或写成inline
dy = abs(y1 - y0); //同上
long x, y;
x = x0;
y = y0; bool bExchange = false;
if( dy > dx )
{
bExchange = true;
std::swap(dx, dy);
} long p;
p = dy * 2 - dx;
long i;
for( i = 0; i <= dx; i++ )
{
if( !fu(x,y) )
{//over.
return;
}
if( p >= 0 )
{
x += dxSign;
y += dySign; p = p + (dy - dx) * 2; // p = p - 2 * dx;//为什 么用移位运算
}
else{
if( bExchange )
{
y += dySign;
}
else{
x += dxSign;
}
p = p + dy * 2;// p = p + 2 * dx;
}
}
} //draw line.
说得不 对,请不要笑我,哈哈!