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

Ortografikus vagy perspektivikus projekcióval pythonban írt forgatható 6D grafika


A matematika nyelvén a hat dimenzió (6D) teljesen értelmezhető, ám a mi fizikai, háromdimenziós világunkban ezt közvetlenül nem tudjuk lerajzolni. A vizualizációhoz a 6D-s koordinátákat le kell képeznünk 2D-s vagy 3D-s térbe. Ezt leggyakrabban dimenziócsökkentéssel (pl. ortografikus vagy perspektivikus projekcióval) érik el.Az alábbi Python program a numpy és a matplotlib segítségével egy 6D-s hiperkockát (tesserakt általánosítása 6 dimenzióra) vetít ki egy képernyőn megjelenő 3D-s ábrára, amelyet az egér segítségével szabadon forgathatsz.
-------------
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from itertools import product

# 1. Definiáljuk a 6 dimenziós hiperkocka csúcsait (-1 és 1 közötti értékekkel)
vertices_6d = np.array(list(product([-1, 1], repeat=6)))

# 2. Határozzuk meg az éleket a 6D térben
# Két csúcs akkor és csak akkor van összekötve, ha pontosan egy koordinátájukban különböznek
edges = []
for i in range(len(vertices_6d)):
    for j in range(i + 1, len(vertices_6d)):
        if np.sum(np.abs(vertices_6d[i] - vertices_6d[j])) == 2:
            edges.append((i, j))

# 3. Egyszerű ortografikus projekció: a 6D koordinátákat 3D-be képezzük
# (Általánosítva: az első 3 dimenziót vesszük, vagy tetszőleges lineáris transzformációt alkalmazunk)
def project_6d_to_3d(v_6d):
    # Itt az első 3 dimenziót használjuk vizualizációs célra
    return v_6d[:, :3]

# 4. Kirajzoló függvény
def draw_6d_hypercube():
    fig = plt.figure(figsize=(8, 8))
    ax = fig.add_subplot(111, projection='3d')
    ax.set_title("6D hiperkocka 3D-s projekciója")

    # Kezdeti 3D koordináták
    projected_vertices = project_6d_to_3d(vertices_6d)

    # Élek kirajzolása
    for edge in edges:
        p1 = projected_vertices[edge[0]]
        p2 = projected_vertices[edge[1]]
        ax.plot([p1[0], p2[0]], [p1[1], p2[1]], [p1[2], p2[2]], color='b', alpha=0.5)

    # Csúcsok megjelölése
    ax.scatter(projected_vertices[:, 0], projected_vertices[:, 1], projected_vertices[:, 2], color='r')

    ax.set_xlabel('X tengely')
    ax.set_ylabel('Y tengely')
    ax.set_zlabel('Z tengely')

    plt.show()

if __name__ == "__main__":
    draw_6d_hypercube()

----------------


Nincsenek megjegyzések:

Megjegyzés küldése