2026. június 29., hétfő

Fekete lyukak körül, motion blur effekt.

Az algoritmus egy komplex, vizuálisan lenyűgöző interaktív gravitációs és részecskeszimulációt valósít meg, amelyben több ezer „csillag” kering dinamikusan változó tömegvonzású fekete lyukak körül, véletlenszerű színátmenetekkel és nyomkövető (motion blur) effekttel.
-------------
import pygame
import numpy as np
import math
import random

# Inicializálás
pygame.init()

# Képernyő beállítások (Teljes képernyő)
info = pygame.display.Info()
WIDTH, HEIGHT = info.current_w, info.current_h
screen = pygame.display.set_mode((WIDTH, HEIGHT), pygame.FULLSCREEN | pygame.DOUBLEBUF)
pygame.display.set_caption("Komplex Gravitációs Szimuláció és Részecskegyorsító")

# Színpaletta (RGB)
COLORS = [
    (255, 69, 0), (255, 215, 0), (0, 255, 255), 
    (127, 255, 0), (255, 20, 147), (138, 43, 226)
]

# Részecske osztály
class Particle:
    def __init__(self):
        self.reset()
        self.color = random.choice(COLORS)

    def reset(self):
        self.pos = np.array([random.uniform(0, WIDTH), random.uniform(0, HEIGHT)], dtype=np.float64)
        angle = random.uniform(0, 2 * math.pi)
        speed = random.uniform(2, 8)
        self.vel = np.array([math.cos(angle) * speed, math.sin(angle) * speed], dtype=np.float64)
        self.color = random.choice(COLORS)

    def update(self, black_holes):
        total_force = np.array([0.0, 0.0], dtype=np.float64)
        for bh in black_holes:
            direction = bh.pos - self.pos
            dist = np.linalg.norm(direction)
            if dist < 10: 
                dist = 10 # Szingularitás elkerülése
            
            # Newton-féle gravitációs törvény: F = G * (m1 * m2) / r^2
            force_mag = (bh.mass * 50) / (dist ** 2)
            total_force += (direction / dist) * force_mag

        self.vel += total_force
        
        # Sebesség korlátozása (hogy ne szakadjon szét a fizika)
        speed = np.linalg.norm(self.vel)
        if speed > 20:
            self.vel = (self.vel / speed) * 20

        self.pos += self.vel

        # Képernyő széléről való visszapattanás vagy reset
        if not (0 <= self.pos[0] <= WIDTH and 0 <= self.pos[1] <= HEIGHT):
            self.reset()

# Fekete lyuk (vonzásközpont) osztály
class BlackHole:
    def __init__(self, x, y, mass):
        self.pos = np.array([x, y], dtype=np.float64)
        self.mass = mass
        self.angle = random.uniform(0, 360)

    def update(self):
        self.angle += 0.01

# Szimuláció inicializálása
particles = [Particle() for _ in range(3000)]
black_holes = [
    BlackHole(WIDTH * 0.35, HEIGHT * 0.5, 3000),
    BlackHole(WIDTH * 0.65, HEIGHT * 0.5, 4000)
]

# Nyomkövető felület (Motion Blur) létrehozása
blur_surface = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)
blur_surface.fill((0, 0, 0, 15)) # Az alfa csatorna határozza meg a nyom hosszát

# Fő ciklus
clock = pygame.time.Clock()
running = True

while running:
    # Eseménykezelés
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
            running = False

    # Fekete lyukak mozgatása
    for bh in black_holes:
        bh.update()

    # Háttér elmosása (Trail effekt)
    screen.blit(blur_surface, (0, 0))

    # Részecskék frissítése és kirajzolása
    for p in particles:
        p.update(black_holes)
        # Pont kirajzolása (vastagabb pixelekkel, hogy jobban látszódjanak)
        pygame.draw.circle(screen, p.color, (int(p.pos[0]), int(p.pos[1])), 2)

    # Fekete lyukak kirajzolása
    for bh in black_holes:
        pygame.draw.circle(screen, (0, 0, 0), (int(bh.pos[0]), int(bh.pos[1])), 30)
        pygame.draw.circle(screen, (255, 255, 255), (int(bh.pos[0]), int(bh.pos[1])), 32, 2)

    # Képernyő frissítése
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
-----------------


Nincsenek megjegyzések:

Megjegyzés küldése