为啥Bresenham 算法 这么写不正确呢 5C

只画斜率小于 1 的直线

 float deltax = end.x - begin.x;
    float deltay = end.y - begin.y;
    float k = deltay / deltax;
    float d = 0;
    float y = begin.y;
    for (int i = begin.x; i <= end.x; i++)
    {
        Vertex v(glm::vec3(i, y, 1));
        DrawPoint(v);

        d = d + k;
        if (d >= 1)
        {
            d -= 1;
        }
        if (d >= 0.5f)
        {
            y += 1;
        }
    }

在视频看到的算法。 然后ppt 上这么写的。。但是画出来不对。 为啥呢 ?

2个回答

那你需要把视频好好看看,ppt上面也可能是错的。

a694777513
_hahaha 我知道是 d=d+k 的问题。但是不知道为什么。。
2 年多之前 回复

我以前写的Bresenham算法

// Bresenham算法
void lineBresenham(HDC hDC, int xa, int ya, int xb, int yb, COLORREF crColor)
{
int dx = abs(xb - xa), dy = abs(yb - ya); // 这两个值只与绝对值有关
int x = xa, y = ya;
int xIncrement, yIncrement, loop; // 步进量/累加变量
bool interchange;
int p;

if (xb - xa > 0)
    xIncrement = 1;
else if (xb - xa == 0)
    xIncrement = 0;
else 
    xIncrement = -1;

if (yb - ya > 0)
    yIncrement = 1;
else if (yb - ya == 0)
    yIncrement = 0;
else 
    yIncrement = -1;

#ifdef _DEBUG
int count = 0;
printf("Bresenham算法:起始点(%03d, %03d) 终止点(%03d, %03d)\n", xa, ya, xb, yb);
RecordPixel(xa, ya, hDC, crColor, count);
#else
SetPixel(hDC, x, y, crColor); // 绘制初始点
#endif // _DEBUG
// 处理特殊情况的直线绘制
if (dy == 0)
{// 水平线
for (loop = 0; loop < dx; loop++)
{
x += xIncrement;
#ifdef _DEBUG
RecordPixel(x, y, hDC, crColor, count);
#else
SetPixel(hDC, x, y, crColor);
#endif // _DEBUG
}
}
else if (dx == 0)
{// 竖直线
for (loop = 0; loop < dy; loop++)
{
y += yIncrement;
#ifdef _DEBUG
RecordPixel(x, y, hDC, crColor, count);
#else
SetPixel(hDC, x, y, crColor);
#endif // _DEBUG
}
}
else if (dx == dy)
{// 或各个象限的角平分线
for (loop = 0; loop < dx; loop++)
{
x += xIncrement;
y += yIncrement;
#ifdef _DEBUG
RecordPixel(x, y, hDC, crColor, count);
#else
SetPixel(hDC, x, y, crColor);
#endif // _DEBUG
}
}
// 处理一般情形下的直线绘制
else
{
// 若斜率绝对值小于1,不需交换
if (dx > dy)
interchange = false;
// 若斜率绝对值大于1,交换dx和dy执行计算,后续步进累加时需要做相应变更
else
{
int temp = dx;
dx = dy;
dy = temp;
interchange = true;
}

    p = - dx;
    for (loop = 0; loop < dx; loop++)
    {
        // 首先处理步进变量
        if (interchange)
            y += yIncrement;    // 若交换了x和y则每次循环步进y值
        else 
            x += xIncrement;    // 若没有交换,则每次循环步进x值

        p += 2 * dy;    // 因为每次循环都需要加上2dy,初始值时需要相加再这里加上

        if (p >= 0)
        {// 此时需要步进另一个量
            if (interchange)
                x += xIncrement;
            else 
                y += yIncrement;
            p -= 2 * dx;
        }

#ifdef _DEBUG
RecordPixel(x, y, hDC, crColor, count);
#else
SetPixel(hDC, x, y, crColor); // 画点
#endif // _DEBUG
}
}
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐