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

4D hiperkocka pythonba

Az alábbi Python kód a numpy és a matplotlib segítségével egy forgó 4D hiperkockát vetít ki.
------------
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import itertools
import time

# 4D hiperkocka csúcsai
vertices_4d = np.array(list(itertools.product([-1, 1], repeat=4)))

# 4D élek meghatározása (azok a csúcsok, amik pontosan 1 koordinátában különböznek)
edges = []
for i in range(len(vertices_4d)):
    for j in range(i + 1, len(vertices_4d)):
        if np.sum(np.abs(vertices_4d[i] - vertices_4d[j])) == 2:
            edges.append((i, j))

def rotate_4d(vertices, xy_angle, yz_angle, zw_angle):
    # Forgatási mátrixok a 4D térben
    c_xy, s_xy = np.cos(xy_angle), np.sin(xy_angle)
    c_yz, s_yz = np.cos(yz_angle), np.sin(yz_angle)
    c_zw, s_zw = np.cos(zw_angle), np.sin(zw_angle)
    
    rotated = np.zeros_like(vertices)
    for i, v in enumerate(vertices):
        x, y, z, w = v
        
        # xy síkú forgatás
        x1, y1 = x * c_xy - y * s_xy, x * s_xy + y * c_xy
        
        # yz síkú forgatás
        y2, z2 = y1 * c_yz - z * s_yz, y1 * s_yz + z * c_yz
        
        # zw síkú forgatás
        z3, w3 = z2 * c_zw - w * s_zw, z2 * s_zw + w * c_zw
        
        rotated[i] = [x1, y2, z3, w3]
        
    return rotated

def project_4d_to_3d(vertices, distance=3.0):
    # Perspektivikus vetítés 4D-ből 3D-be
    projected = np.zeros((vertices.shape[0], 3))
    for i, v in enumerate(vertices):
        x, y, z, w = v
        w_factor = 1 / (distance - w)
        projected[i] = [x * w_factor, y * w_factor, z * w_factor]
    return projected

# Matplotlib beállítások
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection='3d')
ax.set_facecolor('black')

# Forgatási szögek
angle_xy, angle_yz, angle_zw = 0.0, 0.0, 0.0

try:
    while True:
        # Forgatás és vetítés
        rotated_4d = rotate_4d(vertices_4d, angle_xy, angle_yz, angle_zw)
        projected_3d = project_4d_to_3d(rotated_4d)
        
        ax.cla()
        ax.set_xlim3d(-1.5, 1.5)
        ax.set_ylim3d(-1.5, 1.5)
        ax.set_zlim3d(-1.5, 1.5)
        ax.axis('off')
        
        # Élek kirajzolása
        for edge in edges:
            p1 = projected_3d[edge[0]]
            p2 = projected_3d[edge[1]]
            ax.plot([p1[0], p2[0]], [p1[1], p2[1]], [p1[2], p2[2]], color='cyan', alpha=0.5)
            
        plt.pause(0.01)
        
        # Szögek növelése a folyamatos animációhoz
        angle_xy += 0.02
        angle_yz += 0.03
        angle_zw += 0.01
        
except KeyboardInterrupt:
    print("Animáció leállítva.")
-------------


Nincsenek megjegyzések:

Megjegyzés küldése