固定线栅格化算法的近似值

时间:2019-01-24 13:31:22

标签: c++ console line rasterizing approximate

我目前正在制作一个标题,用于在c ++控制台中制作简单的图形。 2天前,我添加了一个使用here使用的光栅化算法绘制线条的功能。

但是我有一个问题:由于控制台的笛卡尔平面仅适用于整数,因此如果给定的近似值等于0时,我的函数不会绘制任何运算,所以我在徘徊,如果您可以执行以下操作: / p>

if ( y == 0 ) 
{ 
    //fix using some kind of 'forecast' of what y could be
}

这是我的代码:

void Engine::line(int ax, int ay, int bx, int by, int color)
{

    int i = 0;

    if(ax < bx)
        i = 1;
    if(ax > bx)
        i = -1;


    int dx = bx - ax;
    int dy = by - ay;

    for (int x = ax; x != bx; x+=i)
    {
        int y = ay + (by - ay) * (x - ax)/(bx - ax);

        HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hConsole, color);

        Engine::gotoxy(x,y); printf("%c", 219);
    }
}

这是我的输出,如果线条倾斜太多,则无法正确显示: image

我真的希望您能为我提供帮助,但是如果不能,您可以给我链接一个更好的算法,该算法仍然很简单,但可以很好地使用整数吗? (不是布雷森汉姆的那个)

2 个答案:

答案 0 :(得分:2)

传统方法是根据要绘制的对角线的八分圆数来编写算法2、4或8次。基本上,当| dx | > | dy |您将x步进1。当| dx | <| dy |您在y中按1。

关于您在循环中所做的事情,看起来与不伦瑞纳姆百科全书上的第六方程式相同,这应该没问题,因为您在所有除法之前进行了所有乘法运算,但正在进行所有这些乘法运算并分开,这是latacode片段避免的。您可能需要考虑将像素微调一半。

您可能还想看看Wu抗锯齿技巧,该技巧使用浮点余数来阴影2个重叠的像素,但是很抱歉,如何将其应用于文本模式是很麻烦的。

答案 1 :(得分:0)

使用相同的算法,可以通过以下方法提高精度:首先在float中计算y,然后将其舍入到最接近的整数。这可以与先前的答案结合起来。