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