algorithm - 了解 Bresenham 算法的修改版本?
问题描述
我最近在阅读 Alois Zingl 的一篇关于光栅化算法的论文。在我完全失去对算法的理解之前,我没有走多远。根据我的研究,我相信这个算法是 Bresenham 画线算法的某种版本。话虽这么说,但在某些方面它似乎不像我读过的那样。我在 OpenGL 中测试了该算法,它运行良好,但我不知道如何......这是 C/C++ 样式语法中的代码:
void plotLine(int x0, int y0, int x1, int y1)
{
int dx = abs(x1 - x0), sx = x0<x1 ? 1 : -1;
int dy = -abs(y1 - y0), sy = y0<y1 ? 1 : -1;
int err = dx+dy, e2;
for (;;)
{
setPixel(x0,y0);
e2 = 2*err;
if (e2 >= dy)
{
if (x0 == x1)
break;
err += dy;
x0 += sx;
}
if (e2 <= dx)
{
if (y0 == y1)
break;
err += dx;
y0 += sy;
}
}
}
我曾尝试对 Bresenham 的算法进行研究,但这似乎并不相同,因为它适用于所有斜坡。我已经对等式进行了一些数学运算,但对我来说没有任何意义的一件事是与 和 进行比较意味着dy
什么dx
。在我尝试从中派生算法时y = mx + b
,这没有任何意义。我的另一个问题是为什么err
每帧乘以两个。我不明白这一点。这是我画线的尝试。它并没有真正起作用,但它可能有助于理解我的大脑来自的方向。(为了简化,我删除了x0
和y0
)提前致谢!
void plotLine(uint32_t* bitmap, int size, int endX, int endY)
{
int a = 0, b = 0;
int y = endY, x = endX;
int error = a * x;
int target = y * b;
for (;;)
{
bitmap[b * size + a] = 0xffffffff;
if (error >= target)
{
if (b == x)
break;
target += y;
b++;
}
if (error <= target)
{
if (a == y)
break;
error += x;
a++;
}
}
}
解决方案
推荐阅读
- php - 将 JSON 字符串发送到需要对象数组的 API 时出现问题
- php - /etc/cron.d 中的作业不适用于 ubuntu
- docker - mysql 'volume' 的一些奇怪(或不是)的事情
- python - OpenNERO Ubuntu:进程以退出代码 134 完成(被信号 6:SIGABRT 中断)
- javascript - 条纹结帐在关闭后将 Chrome 挂起几秒钟
- linux - docker-compose 找不到合适的配置文件
- sed - 如何使用 sed 用制表符替换特定字符
- apache-spark - 现在或将来会支持多少种窗口类型触发结构化流支持?
- jmeter - Jmeter的startAgent.sh协议中的“network i/o”是什么意思?
- java - JPMS 是否支持来自 META-INF/services 的自动模块服务?