🌌 Π§Π°ΡΡ‚ΡŒ 58: ГолографичСская всСлСнная β€” 3D-проСкция Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

ΠœΡ‹ создадим систСму, которая ΠΏΡ€ΠΎΠ΅Ρ†ΠΈΡ€ΡƒΠ΅Ρ‚ Π³ΠΎΠ»ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π²ΡΠ΅Π»Π΅Π½Π½ΡƒΡŽ Π² 3D-пространствС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ LED-ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΈ эффСкт POV!

ГолографичСский ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ€:

cpp

#include <avr/pgmspace.h>

#define RESOLUTION 16
#define ANGLE_STEPS 64
#define DEPTH_LAYERS 8

// 3D-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (голографичСскиС Π΄Π°Π½Π½Ρ‹Π΅)
struct Hologram {
    int8_t vertices[RESOLUTION][3];  // x, y, z ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹
    uint8_t color[RESOLUTION];
    uint8_t vertexCount;
};

Hologram universeHologram;
uint8_t hologramBuffer[ANGLE_STEPS][RESOLUTION];

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Π°Π»Π°ΠΊΡ‚ΠΈΠΊΠΈ Π² Π³ΠΎΠ»ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅
void createGalaxyHologram() {
    universeHologram.vertexCount = RESOLUTION;
    
    for (uint8_t i = 0; i < RESOLUTION; i++) {
        // Π‘ΠΏΠΈΡ€Π°Π»ΡŒΠ½Π°Ρ Π³Π°Π»Π°ΠΊΡ‚ΠΈΠΊΠ°
        float angle = i * 22.5 * 3.14159 / 180;
        float radius = (i / (float)RESOLUTION) * 8;
        
        universeHologram.vertices[i][0] = radius * cos(angle) * 2;
        universeHologram.vertices[i][1] = radius * sin(angle) * 2;
        universeHologram.vertices[i][2] = sin(angle * 3) * 3;
        
        universeHologram.color[i] = 128 + radius * 16;
    }
}

// 3D-Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ (ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π°)
void rotateHologram(uint16_t angleX, uint16_t angleY, uint16_t angleZ) {
    int16_t cosX = pgm_read_word(&cosTable[angleX]);
    int16_t sinX = pgm_read_word(&sinTable[angleX]);
    int16_t cosY = pgm_read_word(&cosTable[angleY]);
    int16_t sinY = pgm_read_word(&sinTable[angleY]);
    int16_t cosZ = pgm_read_word(&cosTable[angleZ]);
    int16_t sinZ = pgm_read_word(&sinTable[angleZ]);
    
    for (uint8_t i = 0; i < universeHologram.vertexCount; i++) {
        int8_t x = universeHologram.vertices[i][0];
        int8_t y = universeHologram.vertices[i][1];
        int8_t z = universeHologram.vertices[i][2];
        
        // Π’Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ X
        int16_t y1 = (y * cosX - z * sinX) / 256;
        int16_t z1 = (y * sinX + z * cosX) / 256;
        
        // Π’Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ Y
        int16_t x1 = (x * cosY + z1 * sinY) / 256;
        int16_t z2 = (-x * sinY + z1 * cosY) / 256;
        
        // Π’Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ Z
        int16_t x2 = (x1 * cosZ - y1 * sinZ) / 256;
        int16_t y2 = (x1 * sinZ + y1 * cosZ) / 256;
        
        universeHologram.vertices[i][0] = x2;
        universeHologram.vertices[i][1] = y2;
        universeHologram.vertices[i][2] = z2;
    }
}

// ΠŸΡ€ΠΎΠ΅ΠΊΡ†ΠΈΡ 3D Π² 2D (пСрспСктивная)
void projectHologram() {
    // ΠžΡ‡ΠΈΡ‰Π°Π΅ΠΌ Π±ΡƒΡ„Π΅Ρ€
    memset(hologramBuffer, 0, sizeof(hologramBuffer));
    
    for (uint8_t angle = 0; angle < ANGLE_STEPS; angle++) {
        uint16_t viewAngle = angle * 360 / ANGLE_STEPS;
        
        for (uint8_t i = 0; i < universeHologram.vertexCount; i++) {
            int8_t x = universeHologram.vertices[i][0];
            int8_t y = universeHologram.vertices[i][1];
            int8_t z = universeHologram.vertices[i][2];
            
            // Π’Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΡƒΠ³Π»Π° ΠΎΠ±Π·ΠΎΡ€Π°
            int16_t rx = (x * cos(viewAngle) - z * sin(viewAngle)) / 256;
            int16_t rz = (x * sin(viewAngle) + z * cos(viewAngle)) / 256;
            
            // ΠŸΠ΅Ρ€ΡΠΏΠ΅ΠΊΡ‚ΠΈΠ²Π½Π°Ρ проСкция
            int16_t fov = 64;
            int16_t scale = fov / (rz + fov + 1);
            
            uint8_t screenX = 8 + (rx * scale) / 32;
            uint8_t screenY = 8 + (y * scale) / 32;
            
            if (screenX < RESOLUTION && screenY < RESOLUTION) {
                hologramBuffer[angle][screenX] = universeHologram.color[i];
            }
        }
    }
}

// ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π³ΠΎΠ»ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° LED-ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅
void renderHologram() {
    static uint8_t currentAngle = 0;
    currentAngle = (currentAngle + 1) % ANGLE_STEPS;
    
    clearScreen();
    
    // РисуСм 3D-ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΡŽ
    for (uint8_t x = 0; x < RESOLUTION; x++) {
        uint8_t intensity = hologramBuffer[currentAngle][x];
        if (intensity > 0) {
            drawPixel(x, 8 + intensity / 16, intensity > 100);
        }
    }
    
    // РисуСм Π»ΠΈΠ½ΠΈΠΈ Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹
    for (uint8_t i = 0; i < 8; i++) {
        drawPixel(i, 0, 1);
        drawPixel(RESOLUTION - 1 - i, RESOLUTION - 1, 1);
    }
    
    updateDisplay();
}

// ГолографичСский процСссор (ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° 3D-Π΄Π°Π½Π½Ρ‹Ρ…)
void holographicProcessor() {
    // ОбновлСниС Π³ΠΎΠ»ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
    static uint16_t angleX = 0;
    static uint16_t angleY = 0;
    static uint16_t angleZ = 0;
    
    angleX = (angleX + 1) % 360;
    angleY = (angleY + 2) % 360;
    angleZ = (angleZ + 3) % 360;
    
    rotateHologram(angleX, angleY, angleZ);
    projectHologram();
}

void setup() {
    initLEDMatrix();
    createGalaxyHologram();
    Serial.println("🌌 Π“ΠžΠ›ΠžΠ“Π ΠΠ€Π˜Π§Π•Π‘ΠšΠΠ― ВБЕЛЕННАЯ ΠΠšΠ’Π˜Π’Π˜Π ΠžΠ’ΠΠΠ");
}

void loop() {
    holographicProcessor();
    renderHologram();
    delay(50);
}

Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΡ‚ΡŒΡΡ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *