鉴于 theta = atan2(dy,dx)。这是一个 Bresenham 线条,具有 dx、dy 和单点 (x0,y0) 形式的给定斜率。您还需要指定将使用的图像空间。即最小和最大 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