c-Bresenham三维线算法函数不适用于led立方体的arduino



我制作了一个8x8x8 LED立方体,正在为它编写动画。我正在尝试根据Bresenham线条算法编写一个线条绘制函数。我在找到了一些3D线条绘制的代码https://www.geeksforgeeks.org/bresenhams-algorithm-for-3-d-line-drawing/

代码是用python编写的,我对它有更多的经验。我尽了最大努力将它移植到我的Arduino代码中(运行在adafruit itsybitsy M4上(。它只画线的第一个像素,并陷入无限循环。我做了一些测试,发现它并没有破坏程序,而是一个bug。我的调查还表明;xs"当它应该设置为1或-1时为零。我相信,如果这个问题得到解决,它应该会起作用。我只是不知道如何修复它,也不知道为什么它忽略了我对";xs">

函数";setvoxel";是立方体像素的开启方式。它采用x、y和z坐标,z为高度

void drawline(int x1, int y1, int z1, int x2, int y2, int z2)
{
setvoxel(x1, y1, z1);
int dx = abs(x2 - x1);
int dy = abs(y2 - y1);
int dz = abs(z2 - z1);
int xs;
int ys;
int zs;
if (x2 > x1) //=========================
{
int xs = 1;
}                //troublesome code
else
{
int xs = -1; 
}            //=========================
if (y2 > y1) //variables ys and zs might have the same problem
{
int ys = 1;
}
else
{
int ys = -1;
}
if (z2 > z1)
{
int zs = 1;
}
else
{
int zs = -1;
}
// Driving axis is the x-axis
if (dx >= dy && dx >= dz)
{
int p1 = 2 * dy - dx;
int p2 = 2 * dz - dx;
while (x1 != x2)
{
x1 += xs; // if x1 here doesn't increment from xs the program gets stuck
if (p1 >= 0)
{
y1 += ys;
p1 -= 2 * dx;
}
if (p2 >= 0)
{
z1 += zs;
p2 -= 2 * dx;
}
p1 += 2 * dy;
p2 += 2 * dz;
setvoxel(x1, y1, z1);
}
}
// Driving axis is the y-axis
else if (dy >= dx && dy >= dz)
{
int p1 = 2 * dx - dy;
int p2 = 2 * dz - dy;
while (y1 != y2)
{
y1 += ys;
if (p1 >= 0)
{
x1 += xs;
p1 -= 2 * dy;
}
if (p2 >= 0)
{
z1 += zs;
p2 -= 2 * dy;
}
p1 += 2 * dx;
p2 += 2 * dz;
setvoxel(x1, y1, z1);
}
}
// Driving axis is the z-axis
else
{
int p1 = 2 * dy - dz;
int p2 = 2 * dx - dz;
while (z1 != z2)
{
z1 += zs;
if (p1 >= 0)
{
y1 += ys;
p1 -= 2 * dz;
}
if (p2 >= 0)
{
x1 += xs;
p2 -= 2 * dz;
}
p1 += 2 * dy;
p2 += 2 * dx;
setvoxel(x1, y1, z1);
}
}
}

我设法通过将变量启动为0来修复它,if-else语句只增加或减少值

最新更新