修复线光栅化算法的近似值
Fixing the approximations of a line rasterization algorithm
我目前正在制作一个 header 用于在 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
我真的希望你能帮助我,但如果不能,你能不能 link 给我一个更好的算法,它仍然很简单,但可以很好地处理整数? (不是 Bresenham 的)
传统方法是根据要绘制的对角线的八分圆,将算法编写 2、4 或 8 次。基本上,当|dx| > |迪|你在 x 中步进 1。当 |dx| < |迪|你在 y 中步进 1。
至于你在循环中所做的事情,这看起来与维基上关于 Bresenham's 的第 6 个等式相同,它应该没问题,因为你在所有除法之前做了所有乘法,但是正在做所有那些乘法和除法,latacode 片段避免了。您可能需要考虑半像素微调。
您可能还想看看 Wu 抗锯齿技巧,它使用浮点余数来遮蔽 2 个重叠像素,但是您如何将其应用于文本模式是您的问题,抱歉。
同样的算法,先用float计算y
,然后四舍五入到最接近的整数,可以提高精度。这个可以和之前的答案结合起来。
我目前正在制作一个 header 用于在 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
我真的希望你能帮助我,但如果不能,你能不能 link 给我一个更好的算法,它仍然很简单,但可以很好地处理整数? (不是 Bresenham 的)
传统方法是根据要绘制的对角线的八分圆,将算法编写 2、4 或 8 次。基本上,当|dx| > |迪|你在 x 中步进 1。当 |dx| < |迪|你在 y 中步进 1。
至于你在循环中所做的事情,这看起来与维基上关于 Bresenham's 的第 6 个等式相同,它应该没问题,因为你在所有除法之前做了所有乘法,但是正在做所有那些乘法和除法,latacode 片段避免了。您可能需要考虑半像素微调。
您可能还想看看 Wu 抗锯齿技巧,它使用浮点余数来遮蔽 2 个重叠像素,但是您如何将其应用于文本模式是您的问题,抱歉。
同样的算法,先用float计算y
,然后四舍五入到最接近的整数,可以提高精度。这个可以和之前的答案结合起来。