0

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

但是我有一个问题:由于控制台的笛卡尔平面仅适用于整数,因此当给出的近似数字等于 0 时,我的函数不会绘制 anithing,所以如果你能做这样的事情,我就在徘徊:

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);
    }
}

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

我真的希望你能帮助我,但如果没有,你能不能给我一个更好的算法,它仍然很简单,但可以很好地处理整数?(不是布雷森汉姆的那个)

4

2 回答 2

2

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

至于您在循环中所做的事情,这看起来与 wiki 上 Bresenham 的第 6 个方程式相同,应该没问题,因为您在所有除法之前进行了所有乘法运算,但正在做所有这些乘法运算和除法运算, latacode 片段避免的。您可能需要考虑半像素微调。

您可能还想查看 Wu 抗锯齿技巧,它使用浮点余数来遮盖 2 个重叠像素,但如何将其应用于文本模式是您的问题,抱歉。

于 2019-01-24T13:51:30.337 回答
0

使用相同的算法,您可以通过首先计算y浮点数然后将其四舍五入到最接近的整数来提高准确性。这可以与前面的答案结合使用。

于 2019-01-24T14:42:08.610 回答