推广Bresenham算法高度八分圆

时间:2014-03-13 13:05:29

标签: c++ algorithm bresenham generalization

我试图将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 ;
    }
}

那么,有人知道任何解决方案吗?

2 个答案:

答案 0 :(得分:0)

八分圆可以通过一些额外的变量dx0, dy0, dx1, dy1来推广。

if (error < delta)
{
       x += dx0;
       y += dy0;
} else {
       x += dx1;
       y += dy1;
}

取决于八分圆, dx0 dy0 中的一个为零; “delta变量”也可以有负值。

答案 1 :(得分:0)

http://tech-algorithm.com/articles/drawing-line-using-bresenham-algorithm/

void LineBresenham(int x,int y,int x2, int y2, int color) 
{
    int w = x2 - x ;
    int h = y2 - y ;
    int dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0 ;
    if (w<0) dx1 = -1 ; else if (w>0) dx1 = 1 ;
    if (h<0) dy1 = -1 ; else if (h>0) dy1 = 1 ;
    if (w<0) dx2 = -1 ; else if (w>0) dx2 = 1 ;

    int longest = abs(w) ;
    int shortest = abs(h) ;

    if (!(longest>shortest)) 
    {
        longest = abs(h) ;
        shortest = abs(w) ;
        if (h<0) dy2 = -1 ; 
        else if (h>0) dy2 = 1 ;
        dx2 = 0 ;            
    }
    int numerator = longest >> 1 ;
    for (int i=0;i<=longest;i++) 
    {
        PlotPixel(x,y,color) ;
        numerator += shortest ;
        if (!(numerator<longest)) 
        {
            numerator -= longest ;
            x += dx1 ;
            y += dy1 ;
        } else {
            x += dx2 ;
            y += dy2 ;
        }
    }
}