我在整个互联网上进行了搜索,发现了数百个 Bresenham 画线算法的实现。但是,我觉得奇怪的一件事是,它们中只有两三个可以覆盖所有八个八位字节。尽管如此,它们仍在许多应用中使用。
例如,这位女士实现了 Bresenham 算法的这个版本(第 415 行)。但是,它并没有覆盖整个 360 度。这家伙似乎正在开发一个图书馆。但它仍然不能正常工作。
你能告诉我为什么吗?
这家伙的实现工作正常。但是,我想这不是布雷森纳姆算法。它与理论几乎没有相似之处。
最后,我发现以下版本的 Bresenham's Line Drawing Algorithm 可以正常工作。
#include "utils.h"
void Bresenham(int x1, int y1, int const x2, int const y2, int color)
{
int dx = x2 - x1;
// if x1 == x2, then it does not matter what we set here
int ix((dx > 0) - (dx < 0));
dx = abs(dx) << 1;
int dy = y2 - y1;
// if y1 == y2, then it does not matter what we set here
int iy((dy > 0) - (dy < 0));
dy = abs(dy) << 1;
PlotPixel(x1, y1, color);
if (dx >= dy)
{
// error may go below zero
int error(dy - (dx >> 1));
while (x1 != x2)
{
if ((error >= 0) && (error || (ix > 0)))
{
error -= dx;
y1 += iy;
}
// else do nothing
error += dy;
x1 += ix;
PlotPixel(x1, y1, color);
}
}
else
{
// error may go below zero
int error(dx - (dy >> 1));
while (y1 != y2)
{
if ((error >= 0) && (error || (iy > 0)))
{
error -= dy;
x1 += ix;
}
// else do nothing
error += dx;
y1 += iy;
PlotPixel(x1, y1, color);
}
}
}
int main()
{
int gm = DETECT;
int gd = DETECT;
initgraph(&gm, &gd, "");
double x1 = 0;
double y1 = 0;
double r = 50;
double x2 = 0;
double y2 = 0;
double signx = 0;
double signy = 0;
for(int theta=0 ; theta<=360 ; theta++)
{
x2 = r * cos(DegreeToRad((double) theta));
y2 = r * sin(DegreeToRad((double) theta));
x1 = 5 * cos(DegreeToRad((double) theta));
y1 = 5 * sin(DegreeToRad((double) theta));
Bresenham(x1, y1, x2, y2, YELLOW);
//delay(10);
}
getch();
closegraph();
return 0;
}
原始代码很奇怪。所以,我需要你的帮助来理解这一点。
为什么他将 dx 和 dy 左移,然后在计算之前再次右移它们?
理论所说的 dt 和 ds 在哪里?
根据理论,dt 和 ds 应该在 while 循环的每一步都经过测试。但是,这段代码没有这样做。为什么?
该理论似乎没有任何错误值处理的迹象。
error
代码计算有什么用?他是怎么计算的error
?他是如何error
使用价值的?测试背后的逻辑是什么
if(dx >= dy)
?