Я сделал светодиодный куб 8x8x8 и пишу для него анимацию. Я пытаюсь написать функцию рисования линий на основе линейного алгоритма Брезенхема. Я нашел код для рисования 3D-линий в https://www.geeksforgeeks.org/bresenhams-algorithm-for-3-d-line-drawing/
Код был в python, с которым у меня больше опыта. Я приложил все усилия, чтобы перенести его на свой код Arduino (работающий на adafruit itsybitsy M4). Он только dr aws первого пикселя строки и застревает в бесконечном l oop. Я провел некоторое тестирование и обнаружил, что это не сбой программы, это ошибка. Мое расследование также показало, что переменная «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);
}
}
}