You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 06:24:17