File size: 5,358 Bytes
82a8f4b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from ideal_poly_volume_toolkit.geometry import (
    delaunay_triangulation_indices,
    lift_to_sphere_with_inf
)

# The golden ratio configuration from seed 42
phi = (1 + np.sqrt(5)) / 2
z_points = np.array([
    0 + 0j,                    # z[0]
    1 + 0j,                    # z[1]
    2.6180 + 0j,              # z[2] ≈ φ²
    0.5 - 1.5388j,            # z[3] 
    2.8917 - 2.6037j,         # z[4]
    0.5 + 1.5388j,            # z[5]
    -1.6180 + 0j              # z[6] ≈ -φ
])

# Get Delaunay triangulation
triangles = delaunay_triangulation_indices(z_points)

# Figure 1: Complex plane view with Delaunay triangulation
fig1, ax1 = plt.subplots(figsize=(10, 10))

# Plot points
real_coords = z_points.real
imag_coords = z_points.imag
ax1.scatter(real_coords, imag_coords, s=100, c='red', zorder=5)

# Label points
for i, z in enumerate(z_points):
    offset = 0.1
    ax1.annotate(f'z[{i}]', (z.real + offset, z.imag + offset))

# Draw Delaunay triangles
for tri in triangles:
    triangle = plt.Polygon([(real_coords[tri[j]], imag_coords[tri[j]]) for j in range(3)],
                          fill=False, edgecolor='blue', linewidth=1.5)
    ax1.add_patch(triangle)

ax1.set_xlabel('Real')
ax1.set_ylabel('Imaginary')
ax1.set_title('Golden Ratio Configuration in Complex Plane\nwith Delaunay Triangulation')
ax1.grid(True, alpha=0.3)
ax1.axis('equal')

# Add circle at radius φ and φ²
circle1 = plt.Circle((0, 0), phi, fill=False, linestyle='--', color='green', alpha=0.5)
circle2 = plt.Circle((0, 0), phi**2, fill=False, linestyle='--', color='green', alpha=0.5)
ax1.add_patch(circle1)
ax1.add_patch(circle2)
ax1.text(0.1, phi + 0.1, f'r = φ ≈ {phi:.3f}', color='green')
ax1.text(0.1, phi**2 + 0.1, f'r = φ² ≈ {phi**2:.3f}', color='green')

plt.savefig('golden_config_plane.png', dpi=150, bbox_inches='tight')
print("Saved: golden_config_plane.png")

# Figure 2: Stereographic projection to unit sphere
fig2 = plt.figure(figsize=(12, 12))
ax2 = fig2.add_subplot(111, projection='3d')

# Add infinity point for sphere projection
z_with_inf = np.append(z_points, [np.inf])
sphere_points = lift_to_sphere_with_inf(z_with_inf)

# Plot sphere points
ax2.scatter(sphere_points[:, 0], sphere_points[:, 1], sphere_points[:, 2], 
           s=100, c='red', depthshade=False)

# Label points
for i in range(len(sphere_points)):
    if i < len(z_points):
        label = f'z[{i}]'
    else:
        label = '∞'
    ax2.text(sphere_points[i, 0], sphere_points[i, 1], sphere_points[i, 2], 
            label, fontsize=10)

# Draw edges based on convex hull of sphere points
# We need to determine which edges to draw based on the Delaunay triangulation
# Each triangle in the plane corresponds to a face on the sphere
edges_drawn = set()

for tri in triangles:
    # Draw the three edges of each triangle
    for i in range(3):
        j = (i + 1) % 3
        edge = tuple(sorted([tri[i], tri[j]]))
        if edge not in edges_drawn:
            edges_drawn.add(edge)
            p1 = sphere_points[edge[0]]
            p2 = sphere_points[edge[1]]
            ax2.plot([p1[0], p2[0]], [p1[1], p2[1]], [p1[2], p2[2]], 
                    'b-', linewidth=1.5)

# Also draw edges to infinity (north pole)
# In ideal polyhedra, infinity is connected to certain boundary vertices
inf_idx = len(z_points)  # Index of infinity point
# Connect infinity to vertices that are on the boundary of the convex hull in the plane
from scipy.spatial import ConvexHull
hull = ConvexHull(np.column_stack([real_coords, imag_coords]))
for vertex_idx in hull.vertices:
    p1 = sphere_points[vertex_idx]
    p2 = sphere_points[inf_idx]
    ax2.plot([p1[0], p2[0]], [p1[1], p2[1]], [p1[2], p2[2]], 
            'g-', linewidth=1.5, alpha=0.7)

# Draw unit sphere (transparent)
u = np.linspace(0, 2 * np.pi, 50)
v = np.linspace(0, np.pi, 50)
x_sphere = np.outer(np.cos(u), np.sin(v))
y_sphere = np.outer(np.sin(u), np.sin(v))
z_sphere = np.outer(np.ones(np.size(u)), np.cos(v))
ax2.plot_surface(x_sphere, y_sphere, z_sphere, alpha=0.1, color='cyan')

ax2.set_xlabel('X')
ax2.set_ylabel('Y')
ax2.set_zlabel('Z')
ax2.set_title('Golden Ratio Configuration\nProjected onto Unit Sphere')

# Set equal aspect ratio
ax2.set_box_aspect([1,1,1])
ax2.view_init(elev=20, azim=45)

plt.savefig('golden_config_sphere.png', dpi=150, bbox_inches='tight')
print("Saved: golden_config_sphere.png")

# Print configuration details
print("\nConfiguration details:")
print(f"Number of vertices: {len(z_points)} (plus infinity)")
print(f"Number of triangles: {len(triangles)}")
print(f"Triangles: {triangles}")

# Analyze symmetries
print("\nDistance analysis:")
distances = {}
for i in range(len(z_points)):
    for j in range(i+1, len(z_points)):
        d = abs(z_points[i] - z_points[j])
        key = f"|z[{i}] - z[{j}]|"
        distances[key] = d

# Group by similar distances
unique_distances = {}
for key, d in distances.items():
    found = False
    for ud in unique_distances:
        if abs(d - ud) < 0.001:
            unique_distances[ud].append(key)
            found = True
            break
    if not found:
        unique_distances[d] = [key]

print("\nGrouped distances:")
for d in sorted(unique_distances.keys()):
    print(f"  {d:.4f}: {unique_distances[d]}")

plt.show()