import streamlit as st import matplotlib.pyplot as plt import numpy as np # Define golden_ratio as a global constant golden_ratio = (1 + np.sqrt(5)) / 2 def generate_colored_circle_template(num_circles): fig, ax = plt.subplots(figsize=(6, 6)) ax.set_xlim(0, 1) ax.set_ylim(0, 1) ax.axis('off') for _ in range(num_circles): radius = np.random.uniform(0.05, 0.15) center = (np.random.uniform(radius, 1-radius), np.random.uniform(radius, 1-radius)) color = np.random.rand(3,) circle = plt.Circle(center, radius, color=color, alpha=0.8) ax.add_artist(circle) return fig def generate_symmetrical_circle_layout(num_layers): fig, ax = plt.subplots(figsize=(6, 6)) ax.set_aspect('equal') ax.axis('off') center = (0.5, 0.5) for i in range(num_layers): radius = (i + 1) * 0.1 for j in range(6): angle = np.pi / 3 * j x = center[0] + radius * np.cos(angle) y = center[1] + radius * np.sin(angle) circle = plt.Circle((x, y), radius=0.05, color=np.random.rand(3,), fill=True) ax.add_artist(circle) return fig def generate_fibonacci_spiral_layout(num_points): fig, ax = plt.subplots(figsize=(6, 6)) ax.axis('off') radius = 0.05 for i in range(num_points): angle = i * 2 * np.pi / golden_ratio distance = np.sqrt(i) * radius x = 0.5 + distance * np.cos(angle) y = 0.5 + distance * np.sin(angle) circle = plt.Circle((x, y), radius, color=np.random.rand(3,), fill=True) ax.add_artist(circle) ax.set_aspect('equal') return fig def is_prime(n): if n <= 1: return False for i in range(2, int(n**0.5) + 1): if n % i == 0: return False return True def generate_prime_number_spiral(num_points): fig, ax = plt.subplots(figsize=(6, 6)) ax.axis('off') radius = 0.05 for i in range(1, num_points + 1): if is_prime(i): angle = i * 2 * np.pi / golden_ratio distance = np.sqrt(i) * radius x = 0.5 + distance * np.cos(angle) y = 0.5 + distance * np.sin(angle) circle = plt.Circle((x, y), radius, color=np.random.rand(3,), fill=True) ax.add_artist(circle) ax.set_aspect('equal') return fig # Streamlit UI st.title("Circle Packings Visualization") mode = st.radio( "Choose a visualization mode:", ("Random Circle Packings", "Symmetrical Circle Layouts", "Fibonacci Spiral Layout", "Prime Number Spiral") ) if mode == "Random Circle Packings": num_circles = st.slider("Number of Circles", 5, 50, 10) fig = generate_colored_circle_template(num_circles) elif mode == "Symmetrical Circle Layouts": num_layers = st.slider("Number of Symmetrical Layers", 1, 5, 3) fig = generate_symmetrical_circle_layout(num_layers) elif mode == "Fibonacci Spiral Layout": num_points = st.slider("Number of Points", 10, 100, 30) fig = generate_fibonacci_spiral_layout(num_points) elif mode == "Prime Number Spiral": num_points = st.slider("Number of Points", 10, 1000, 200) fig = generate_prime_number_spiral(num_points) st.pyplot(fig)