修复线栅格化算法的近似值
Fixing the approximations of a line rasterization algorithm
我目前正在制作一个标题,用于在 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);
}
}
这是我的输出,如果线倾斜很多,它不会正确显示:图像
我真的希望你能帮助我,但如果没有,你能给我链接一个更好的算法,它仍然很简单,但对整数工作得很好吗?(不是布雷森汉姆的)
传统方法是根据要绘制的对角线的八进制编写算法 2、4 或 8 次。 基本上,当 |DX|> |dy| 你在 x 中一步一步。当 |dx|<|dy|你一步一步 1 在 Y 中。
至于你在循环中做了什么,这看起来与 wiki 上 Bresenham 的第 6 个方程相同,它应该没问题,因为你在所有除法之前做了所有的乘法,但正在做所有这些乘法和除法,这是 latacode 片段避免的。您可能需要考虑半像素的微移。
您可能还想看看 Wu 抗锯齿技巧,它使用浮点余数来着色 2 个重叠像素,尽管您如何将其应用于文本模式是您的问题,抱歉。
使用相同的算法,您可以通过首先以浮点数计算y
,然后将其舍入到最接近的整数来提高精度。这可以与前面的答案相结合。
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- std::unordered_map 搜索算法是如何实现的?
- 如何实现高效的算法来计算大型数据集的多个不同值?
- 修复线栅格化算法的近似值