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