c++ - 修复线光栅化算法的近似值

标签 c++ console line rasterizing approximate

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

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

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

我真的希望你能帮助我,但如果不能,你能给我一个更好的算法吗?它仍然很简单,但可以很好地处理整数? (不是 Bresenham 的)

最佳答案

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

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

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

关于c++ - 修复线光栅化算法的近似值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54347830/

相关文章:

c++ - 必须在 GUI 线程中创建小部件错误!。如何更正代码?

C++ 对象和 C 风格转换问题

c - 如何将 unicode 符号打印到控制台

c++ - 如何在 MATLAB 中创建字符串数组?

C++ 解析函数类型模板参数

linux - 在 tty1 而不是 ttyS1 上显示 Linux 引导消息

.net - 无法构建/发布 OS X 自包含的 .NET Core 可执行文件

r - 从图中删除线

javascript - Internet Explorer 为错误生成错误的行号

python - 绘制被数据中断的虚线(类似于等高线图)