🌌 Π§Π°ΡΡ‚ΡŒ 52: Π˜ΡΠΊΡƒΡΡΡ‚Π²Π΅Π½Π½Π°Ρ гравитация β€” ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„ΠΈΠ·ΠΈΠΊΠΎΠΉ свСта

ΠœΡ‹ создадим систСму, которая ΠΈΡΠΊΡ€ΠΈΠ²Π»ΡΠ΅Ρ‚ пространство-врСмя Π½Π° LED-ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅, симулируя Π³Ρ€Π°Π²ΠΈΡ‚Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π»ΠΈΠ½Π·Ρ‹ ΠΈ искривлСниС свСта!

Гравитационная Π»ΠΈΠ½Π·Π° Π½Π° LED-ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅:

cpp

#include <avr/pgmspace.h>

#define GRID_SIZE 16
#define LIGHT_RAYS 32

// 2D пространство-врСмя (искривлСниС)
int8_t spacetime[GRID_SIZE][GRID_SIZE];

// Масса (Π³Ρ€Π°Π²ΠΈΡ‚Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ источник)
int8_t massX, massY;
uint8_t massStrength;

// Π›ΡƒΡ‡ΠΈ свСта (Ρ„ΠΎΡ‚ΠΎΠ½Ρ‹)
struct LightRay {
    int8_t x, y;
    int8_t dx, dy;
    uint8_t intensity;
};

LightRay rays[LIGHT_RAYS];

// Π˜ΡΠΊΡ€ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ пространства-Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
void curveSpacetime() {
    // ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠ° искривлСния: dsΒ² = -dtΒ² + (1 + 2Ξ¦)drΒ²
    for (int8_t x = 0; x < GRID_SIZE; x++) {
        for (int8_t y = 0; y < GRID_SIZE; y++) {
            int8_t dx = x - massX;
            int8_t dy = y - massY;
            int16_t dist2 = dx * dx + dy * dy;
            if (dist2 < 1) dist2 = 1;
            
            // Π“Ρ€Π°Π²ΠΈΡ‚Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» Ξ¦ = -GM/r
            int16_t phi = (-massStrength * 100) / dist2;
            spacetime[x][y] = phi / 100;
        }
    }
}

// Врассировка свСта (гСодСзичСскиС)
void traceLightRays() {
    for (uint8_t i = 0; i < LIGHT_RAYS; i++) {
        LightRay* ray = &rays[i];
        
        // Π‘ΠΈΠ»Π° искривлСния Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅
        int8_t curvature = spacetime[ray->x][ray->y];
        
        // ИзмСнСниС направлСния (эффСкт Π³Ρ€Π°Π²ΠΈΡ‚Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ Π»ΠΈΠ½Π·Ρ‹)
        int8_t fx = (massX - ray->x) * curvature / 8;
        int8_t fy = (massY - ray->y) * curvature / 8;
        
        ray->dx += fx;
        ray->dy += fy;
        
        // Нормализация скорости свСта
        int16_t speed2 = ray->dx * ray->dx + ray->dy * ray->dy;
        if (speed2 > 0) {
            int16_t speed = sqrt(speed2);
            int16_t c = 10;  // Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ свСта
            ray->dx = (ray->dx * c) / speed;
            ray->dy = (ray->dy * c) / speed;
        }
        
        // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅
        ray->x += ray->dx;
        ray->y += ray->dy;
        
        // Π˜Π½Ρ‚Π΅Π½ΡΠΈΠ²Π½ΠΎΡΡ‚ΡŒ (красноС смСщСниС)
        if (abs(ray->x - massX) < 2 && abs(ray->y - massY) < 2) {
            ray->intensity = max(0, ray->intensity - 10);  // ΠŸΠΎΠ³Π»ΠΎΡ‰Π΅Π½ΠΈΠ΅
        }
    }
}

// Визуализация Π³Ρ€Π°Π²ΠΈΡ‚Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ Π»ΠΈΠ½Π·Ρ‹
void renderGravitationalLens() {
    clearScreen();
    
    // РисуСм искривлСнноС пространство-врСмя
    for (int8_t x = 0; x < GRID_SIZE; x++) {
        for (int8_t y = 0; y < GRID_SIZE; y++) {
            uint8_t brightness = 64 + spacetime[x][y] * 4;
            if (brightness > 255) brightness = 255;
            drawPixel(x, y, brightness > 128);
        }
    }
    
    // РисуСм Π»ΡƒΡ‡ΠΈ свСта
    for (uint8_t i = 0; i < LIGHT_RAYS; i++) {
        LightRay* ray = &rays[i];
        if (ray->x >= 0 && ray->x < GRID_SIZE && 
            ray->y >= 0 && ray->y < GRID_SIZE) {
            drawPixel(ray->x, ray->y, 1);
        }
    }
    
    // РисуСм массу (чСрная Π΄Ρ‹Ρ€Π°)
    drawPixel(massX, massY, 0);
    drawPixel(massX + 1, massY, 0);
    drawPixel(massX - 1, massY, 0);
    drawPixel(massX, massY + 1, 0);
    drawPixel(massX, massY - 1, 0);
    
    updateDisplay();
}

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ
void initGravitySimulation() {
    // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ искривлСниС
    massX = GRID_SIZE / 2;
    massY = GRID_SIZE / 2;
    massStrength = 100;
    curveSpacetime();
    
    // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π»ΡƒΡ‡ΠΈ свСта
    for (uint8_t i = 0; i < LIGHT_RAYS; i++) {
        rays[i].x = random(GRID_SIZE);
        rays[i].y = 0;
        rays[i].dx = random(-2, 3);
        rays[i].dy = random(1, 3);
        rays[i].intensity = 255;
    }
}

void setup() {
    initOLED();
    initGravitySimulation();
    Serial.println("🌌 Π˜Π‘ΠšΠ£Π‘Π‘Π’Π’Π•ΠΠΠΠ― Π“Π ΠΠ’Π˜Π’ΠΠ¦Π˜Π― ΠΠšΠ’Π˜Π’Π˜Π ΠžΠ’ΠΠΠ");
}

void loop() {
    // ОбновляСм Π³Ρ€Π°Π²ΠΈΡ‚Π°Ρ†ΠΈΡŽ (Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ массы)
    massX = GRID_SIZE / 2 + sin(millis() / 1000.0) * 3;
    massY = GRID_SIZE / 2 + cos(millis() / 1500.0) * 3;
    curveSpacetime();
    
    // ВрассируСм Π»ΡƒΡ‡ΠΈ свСта
    for (uint8_t step = 0; step < 5; step++) {
        traceLightRays();
    }
    
    // Визуализация
    renderGravitationalLens();
    delay(50);
}

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

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

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