首页 > 解决方案 > 了解 Bresenham 算法的修改版本?

问题描述

我最近在阅读 Alois Zingl 的一篇关于光栅化算法的论文。在我完全失去对算法的理解之前,我没有走多远。根据我的研究,我相信这个算法是 Bresenham 画线算法的某种版本。话虽这么说,但在某些方面它似乎不像我读过的那样。我在 OpenGL 中测试了该算法,它运行良好,但我不知道如何......这是 C/C++ 样式语法中的代码:

void plotLine(int x0, int y0, int x1, int y1)
{
  int dx =  abs(x1 - x0), sx = x0<x1 ? 1 : -1;
  int dy = -abs(y1 - y0), sy = y0<y1 ? 1 : -1;
  int err = dx+dy, e2;
  for (;;)
  {
    setPixel(x0,y0);
    e2 = 2*err;
    
    if (e2 >= dy) 
    {
      if (x0 == x1) 
        break;
      err += dy; 
      x0 += sx;
    }

    if (e2 <= dx) 
    {
      if (y0 == y1) 
        break;
      err += dx; 
      y0 += sy;
    }   
  }
}

我曾尝试对 Bresenham 的算法进行研究,但这似乎并不相同,因为它适用于所有斜坡。我已经对等式进行了一些数学运算,但对我来说没有任何意义的一件事是与 和 进行比较意味着dy什么dx。在我尝试从中派生算法时y = mx + b,这没有任何意义。我的另一个问题是为什么err每帧乘以两个。我不明白这一点。这是我画线的尝试。它并没有真正起作用,但它可能有助于理解我的大脑来自的方向。(为了简化,我删除了x0y0)提前致谢!

void plotLine(uint32_t* bitmap, int size, int endX, int endY)
{
  int a = 0, b = 0;
  int y = endY, x = endX;
  
  int error = a * x;
  int target = y * b;
  
  for (;;)
  {
    bitmap[b * size + a] = 0xffffffff;
    
    if (error >= target)
    {
      if (b == x)
        break;
      
      target += y;
      b++;
    }
    
    if (error <= target)
    {
      if (a == y)
        break;
        
      error += x;
      a++;
    }
  }
}

标签: algorithmrasterizingbresenhamline-drawing

解决方案


推荐阅读