Прошу помощи. Код зависает. Перед зависанием может отработать несколько раз, но при этом не гасит предыдущую точку. Пытаюсь сделать фейерверк на матрице 64х16. Код dotsec и dotOnLine взят из библиотеки GyverMax7219. Демо-примеры работают отлично (кроме кривой Безье).
C++:
#include <GyverMAX7219.h>
MAX7219<8, 2, 5> mtrx; // 8 по горизонтали, 2 по вертикали
// CS - D5
const uint8_t wM = 64, hM = 16; // ширина и высота
uint32_t t1=millis();
void setup() {
mtrx.begin(); // запускаем матрицу
mtrx.setBright(3); // яркость 0..15
mtrx.clear();
randomSeed(analogRead(0)); // запускаем генератор случайных чисел
}
void loop() {
if (millis()-t1 > 100) {
t1 = millis();
fireworks();
mtrx.update();
}
}
void dotsec(int x, int y, uint8_t fill) {
if (x < 0 || x >= wM || y < 0 || y >= hM) return;
mtrx.dot(x, y, fill);
}
uint8_t xprev=0, yprev=0;
bool dotOnLine(int x0, int y0, int x1, int y1, uint8_t fill = 1) {
static uint8_t x=x0, y=y0;
int8_t sx = (x0 < x1) ? 1 : -1;
int8_t sy = (y0 < y1) ? 1 : -1;
int dx = abs(x1 - x0);
int dy = abs(y1 - y0);
int e1 = dx - dy;
static int e2 = 0;
dotsec(xprev, yprev, 0);
if (x == x1 && y == y1) return true;
dotsec(x, y, 1);
e2 = e1 << 1;
if (e2 > -dy) {
e1 -= dy;
xprev = x;
x += sx;
}
if (e2 < dx) {
e1 += dx;
yprev = y;
y += sy;
}
return false;
}
void fireworks() {
static bool fire=true;
static uint8_t x0, y0, x1, y1;
if (fire) {
x0 = random(wM); y0 = random(hM);
x1 = random(wM); y1 = random(hM);
fire = false;
mtrx.clear();
}
if (dotOnLine(x0, y0, x1, y1)) fire = true;
}