使用Bresenham算法绘制直线时斜率大于1的异常问题求助
Bresenham直线绘制算法斜率异常问题
- 问题现象:直线斜率小于1时绘制正常,但斜率大于1时,绘制出的直线斜率始终为1。例如(0,0)到(70,25)能正常绘制,(0,0)到(25,70)绘制异常。
原实现代码
drawLine函数
void drawLine(Point a, Point b){ int x1 = a.first; int x2 = b.first; int y1 = a.second; int y2 = b.second; int dx = x2 - x1; int dy = y2 - y1; int j = y1; int e = dy - dx; for(int i = x1; i <= x2-1; i++){ setPixel(i, j); if(e >= 0){ j++; e -= dx; } e += dy; } }
setPixel函数
void setPixel(int x, int y){ image[(x+(y*sizex))*3] = 0; image[(x+(y*sizex))*3+1] = 0; image[(x+(y*sizex))*3+2] = 0; }
问题原因
你的代码仅处理了以x为主要步进方向的场景(即斜率绝对值小于1,dx>dy的情况)。当斜率大于1时,dy>dx,此时应该以y作为主要步进方向,循环遍历y而非x。原代码强制遍历x,导致y每次最多只能跟随x走1步,最终斜率被限制在1以内。
修正后的代码
void drawLine(Point a, Point b){ int x1 = a.first; int x2 = b.first; int y1 = a.second; int y2 = b.second; int dx = abs(x2 - x1); int dy = abs(y2 - y1); int sx = (x1 < x2) ? 1 : -1; // x方向步进增量,支持从右到左绘制 int sy = (y1 < y2) ? 1 : -1; // y方向步进增量,支持从下到上绘制 int err = dx - dy; // 误差项 while (true) { setPixel(x1, y1); if (x1 == x2 && y1 == y2) break; // 到达终点则退出循环 int e2 = 2 * err; if (e2 > -dy) { err -= dy; x1 += sx; } if (e2 < dx) { err += dx; y1 += sy; } } }
修正说明
- 新增
sx和sy变量处理直线的方向问题,支持任意起点到终点的绘制(包括从右到左、从下到上) - 通过
dx和dy的绝对值比较,自动切换主要步进方向,无论斜率大于1还是小于1都能适配 - 改用循环直到到达终点,解决原代码中
x2-1导致的终点像素缺失问题
内容的提问来源于stack exchange,提问作者TobsterStrudel
相关产品推荐
相关产品推荐

