我正在尝试实现 Bresenham 算法,使其具有以下特性:
所以在我的主要,我测试了很多算法,比如:
line(ushort x0, ushort y0, ushort x1, ushort y1, const Color couleur)
int dx = abs(x1-x0);
int dy = abs(y1-y0);
int sx,sy;
sx=sy=0;
if(x0 < x1) sx = 1;
else sx = -1;
if(y0 < y1) sy = 1;
else sy = -1;
int err = dx-dy;
while(1)
{
pixel(x0, y0) = couleur;
if(x0 == x1 && y0 == y1) break;
int e2 = 2* err;
if(e2 > -dy)
{
err = err - dy;
x0 = x0 + sx;
}
if(e2 < dy)
{
err = err + dx;
y0 = y0 + sy;
}
}
或者
ushort x=x1;
ushort y=y1;
int longX=x2-x1;
int longY=y2-y1;
if(longY<longX)
{ // 1er Octant
const int c1=2*(longY-longX);
const int c2=2*longY;
int critère=c2-longX;
while(x<=x2)
{
DessinePoint(x,y,couleur);
if(critère>=0)
{ // changement de ligne horizontale
y++;
critère=critère+c1;
}
else
// toujours la même ligne horizontale
critère=critère+c2;
x++; // ligne suivante, et recommence
}
}
else
{ // 2eme Octant
const int c1=2*(longX-longY);
const int c2=2*longX;
int critère=c2-longY;
while(y<=y2)
{
DessinePoint(x,y,couleur);
if(critère>=0)
{ // changement de ligne verticale
x++;
critère=critère+c1;
}
else
// toujours la même ligne verticale
critère=critère+c2;
y++; // ligne suivante, et recommence
}
}
对于两个八分圆。
我还尝试了我们可以在维基百科中找到的内容,但没什么特别的。
我尝试实现的最后一个功能:
line(ushort xi, ushort yi, ushort xf, ushort yf, const Color couleur)
{
int dx,dy,i,xinc,yinc,cumul,x,y ;
x = xi ;
y = yi ;
dx = xf - xi ;
dy = yf - yi ;
xinc = ( dx > 0 ) ? 1 : -1 ;
yinc = ( dy > 0 ) ? 1 : -1 ;
dx = abs(dx) ;
dy = abs(dy) ;
pixel(x,y)= couleur;
if ( dx > dy )
{
cumul = dx / 2 ;
for ( i = 1 ; i <= dx ; i++ )
{
x += xinc ;
cumul += dy ;
if ( cumul >= dx )
{
cumul -= dx ;
y += yinc ;
}
pixel(x,y) = couleur ;
}
}
else
{
cumul = dy / 2 ;
for ( i = 1 ; i <= dy ; i++ )
{
y += yinc ;
cumul += dx ;
if ( cumul >= dy )
{
cumul -= dy ;
x += xinc ;
}
pixel(x,y) = couleur ;
}
}
那么,有人知道任何解决方案吗?