Update app.py
Browse files
app.py
CHANGED
@@ -32,16 +32,64 @@ def generate_symmetrical_circle_layout(num_layers):
|
|
32 |
ax.add_artist(circle)
|
33 |
return fig
|
34 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
# Streamlit UI
|
36 |
st.title("Circle Packings Visualization")
|
37 |
|
38 |
-
mode = st.radio(
|
|
|
|
|
|
|
39 |
|
40 |
if mode == "Random Circle Packings":
|
41 |
num_circles = st.slider("Number of Circles", 5, 50, 10)
|
42 |
fig = generate_colored_circle_template(num_circles)
|
43 |
-
st.pyplot(fig)
|
44 |
elif mode == "Symmetrical Circle Layouts":
|
45 |
num_layers = st.slider("Number of Symmetrical Layers", 1, 5, 3)
|
46 |
fig = generate_symmetrical_circle_layout(num_layers)
|
47 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
ax.add_artist(circle)
|
33 |
return fig
|
34 |
|
35 |
+
def generate_fibonacci_spiral_layout(num_points):
|
36 |
+
fig, ax = plt.subplots(figsize=(6, 6))
|
37 |
+
ax.axis('off')
|
38 |
+
n = num_points
|
39 |
+
golden_ratio = (1 + np.sqrt(5)) / 2
|
40 |
+
radius = 0.05
|
41 |
+
for i in range(n):
|
42 |
+
angle = i * 2 * np.pi / golden_ratio
|
43 |
+
distance = np.sqrt(i) * radius
|
44 |
+
x = 0.5 + distance * np.cos(angle)
|
45 |
+
y = 0.5 + distance * np.sin(angle)
|
46 |
+
circle = plt.Circle((x, y), radius, color=np.random.rand(3,), fill=True)
|
47 |
+
ax.add_artist(circle)
|
48 |
+
ax.set_aspect('equal')
|
49 |
+
return fig
|
50 |
+
|
51 |
+
def is_prime(n):
|
52 |
+
if n <= 1:
|
53 |
+
return False
|
54 |
+
for i in range(2, int(n**0.5) + 1):
|
55 |
+
if n % i == 0:
|
56 |
+
return False
|
57 |
+
return True
|
58 |
+
|
59 |
+
def generate_prime_number_spiral(num_points):
|
60 |
+
fig, ax = plt.subplots(figsize=(6, 6))
|
61 |
+
ax.axis('off')
|
62 |
+
radius = 0.05
|
63 |
+
for i in range(1, num_points + 1):
|
64 |
+
if is_prime(i):
|
65 |
+
angle = i * 2 * np.pi / golden_ratio
|
66 |
+
distance = np.sqrt(i) * radius
|
67 |
+
x = 0.5 + distance * np.cos(angle)
|
68 |
+
y = 0.5 + distance * np.sin(angle)
|
69 |
+
circle = plt.Circle((x, y), radius, color=np.random.rand(3,), fill=True)
|
70 |
+
ax.add_artist(circle)
|
71 |
+
ax.set_aspect('equal')
|
72 |
+
return fig
|
73 |
+
|
74 |
# Streamlit UI
|
75 |
st.title("Circle Packings Visualization")
|
76 |
|
77 |
+
mode = st.radio(
|
78 |
+
"Choose a visualization mode:",
|
79 |
+
("Random Circle Packings", "Symmetrical Circle Layouts", "Fibonacci Spiral Layout", "Prime Number Spiral")
|
80 |
+
)
|
81 |
|
82 |
if mode == "Random Circle Packings":
|
83 |
num_circles = st.slider("Number of Circles", 5, 50, 10)
|
84 |
fig = generate_colored_circle_template(num_circles)
|
|
|
85 |
elif mode == "Symmetrical Circle Layouts":
|
86 |
num_layers = st.slider("Number of Symmetrical Layers", 1, 5, 3)
|
87 |
fig = generate_symmetrical_circle_layout(num_layers)
|
88 |
+
elif mode == "Fibonacci Spiral Layout":
|
89 |
+
num_points = st.slider("Number of Points", 10, 100, 30)
|
90 |
+
fig = generate_fibonacci_spiral_layout(num_points)
|
91 |
+
elif mode == "Prime Number Spiral":
|
92 |
+
num_points = st.slider("Number of Points", 10, 1000, 200)
|
93 |
+
fig = generate_prime_number_spiral(num_points)
|
94 |
+
|
95 |
+
st.pyplot(fig)
|