Bresenham的算法有一个点和一个角度

时间:2016-12-20 13:41:51

标签: algorithm grid line angle bresenham

我有一个网格,每个单元格由x和y坐标(整数)决定。此网格宽100x100。

我得到一个单元格(x0,y0)和一个角度A.

我的目标是能够获得网格中线((x0,y0),A)穿过的所有单元格的坐标。

我该怎么做?问题是我没有线的长度......

我正在考虑找到第二个点,然后使用Bresenham的算法,但计算它太长了,因为我找到的第二个点通常在我的网格之外。因此,我正在考虑修改Bresenham的算法(http://www.roguebasin.com/index.php?title=Bresenham%27s_Line_Algorithm#Python),但我不知道如何做到这一点,因为算法是基于我们在输入上有两个点的事实! :/

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

假设角度使得线在沿y轴退出之前沿x轴离开网格。这意味着您知道该行末尾的x坐标,并且可以使用@AxelKemper给出的公式计算其y坐标。 (如果需要,在上面交换x& y的角色。)如果你事先不知道是哪种情况,只需选择一个,进行计算,如果它不属于网格,请使用其他情况。

答案 1 :(得分:0)

给出theta = atan2(dy,dx)。这是具有给定斜率dx,dy和单点(x0,y0)的Bresenham线条。您还需要指定将要使用的图像空间。这就是x和y的最小值和最大值:

     void line(int x0, int y0, int dx, int dy, int minx, int miny, int maxx, int maxy)
     {
         int  sx = dx > 0 ? 1 : -1;
         int  sy = dy > 0 ? 1 : -1;

         dx = abs(dx);
         dy = abs(dy);

         int err = (dx > dy ? dx : -dy) / 2, e2;

         while (x0 >= minx&& y0 >= miny&& x0 <= maxx && y0 <= maxy)
         {
             std::cout << x0 << "," << y0 << endl; // setPixel(x0, y0);
             e2 = err;
             if (e2 > -dx) { err -= dy; x0 += sx; }
             if (e2 < dy) { err += dx; y0 += sy; }
         }
     }

示例驱动程序:

  void driver()
  {
       vector < pair<int, int>> dxdy = { { -1,0},
        { -1,-1},{0,1},{1,1},{-3,1} };

       for (auto& j : dxdy) {
          std::cout << "dxdy = " << j.first << "," << j.second << endl;
          line(5, 5, j.first, j.second, 0, 0, 10, 10);

      }
  }

输出:
dxdy = -1,0
5,5
4,5
3,5
2,5
1,5
0,5
dxdy = -1,-1
5,5
4,4
3,3
2,2
1,1
0,0
dxdy = 0,1
5,5
5,6
5,7
5,8
5,9
5,10
dxdy = 1,1
5,5
6,6
7,7
8,8
9,9
10,10
dxdy = -3,1
5,5
4,5
3,6
2,6
1,6
0,7