Функция алгоритма 3D-линии Брезенхема не работает на Arduino для светодиодного куба - PullRequest
0 голосов
/ 03 августа 2020

Я сделал светодиодный куб 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);
    }
  }
}

1 Ответ

0 голосов
/ 03 августа 2020

Мне удалось это исправить, запустив переменные как 0, а операторы if else просто увеличивают или уменьшают значение

...