我目前正在制作一个标题,用于在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
我真的希望您能为我提供帮助,但是如果不能,您可以给我链接一个更好的算法,该算法仍然很简单,但可以很好地使用整数吗? (不是布雷森汉姆的那个)
答案 0 :(得分:2)
传统方法是根据要绘制的对角线的八分圆数来编写算法2、4或8次。基本上,当| dx | > | dy |您将x步进1。当| dx | <| dy |您在y中按1。
关于您在循环中所做的事情,看起来与不伦瑞纳姆百科全书上的第六方程式相同,这应该没问题,因为您在所有除法之前进行了所有乘法运算,但正在进行所有这些乘法运算并分开,这是latacode片段避免的。您可能需要考虑将像素微调一半。
您可能还想看看Wu抗锯齿技巧,该技巧使用浮点余数来阴影2个重叠的像素,但是很抱歉,如何将其应用于文本模式是很麻烦的。
答案 1 :(得分:0)
使用相同的算法,可以通过以下方法提高精度:首先在float中计算y
,然后将其舍入到最接近的整数。这可以与先前的答案结合起来。