File size: 4,736 Bytes
bdf68d5
 
 
68599bb
bdf68d5
68599bb
7791160
 
68599bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bdf68d5
 
 
 
 
 
68599bb
bdf68d5
 
68599bb
 
 
 
bdf68d5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7a37a91
 
 
 
7791160
7a37a91
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68599bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bdf68d5
7a37a91
 
68599bb
7a37a91
bdf68d5
 
 
 
 
 
 
7a37a91
 
 
 
 
 
68599bb
 
 
 
 
 
7a37a91
68599bb
 
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
import streamlit as st
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors as mcolors

# Global constant for golden ratio
golden_ratio = (1 + np.sqrt(5)) / 2

def is_prime(n):
    """Check if a number is prime."""
    if n <= 1:
        return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True

def fib_sequence(n):
    """Generate Fibonacci sequence up to n."""
    fib_seq = [0, 1]
    while fib_seq[-1] + fib_seq[-2] <= n:
        fib_seq.append(fib_seq[-1] + fib_seq[-2])
    return fib_seq[2:]  # Exclude first two numbers for this use case

def adjust_color_brightness(color, factor):
    """Darken a color by a given factor."""
    color = np.array(mcolors.to_rgb(color)) * factor
    return tuple(color)

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 i 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))
        base_color = np.random.rand(3,)
        darker_color = adjust_color_brightness(base_color, 0.5)
        color_variation = base_color * (0.95 + 0.1 * np.random.rand())  # Slight color variation
        circle = plt.Circle(center, radius, color=color_variation, ec=darker_color, lw=1, alpha=0.5)
        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 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

def emoji_dynamics_and_number_theory_simulation(size):
    fib_seq = fib_sequence(size**2)
    grid = []

    for i in range(1, size**2 + 1):
        if i in fib_seq:
            grid.append("πŸŒ€")  # Fibonacci positions
        elif is_prime(i):
            grid.append("🌟")  # Prime positions
        else:
            grid.append("βšͺ")  # Other positions

        if i % size == 0:
            grid.append("\n")  # Newline at the end of each row

    return "".join(grid)

# Streamlit UI setup
st.title("Circle Packings and Number Theory Visualizations")

mode = st.radio(
    "Choose a visualization mode:",
    ("Random Circle Packings", "Symmetrical Circle Layouts", "Fibonacci Spiral Layout", "Prime Number Spiral", "Emoji Dynamics and Number Theory Simulation")
)

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)
elif mode == "Emoji Dynamics and Number Theory Simulation":
    size = st.slider("Grid Size", 5, 20, 10)
    simulation = emoji_dynamics_and_number_theory_simulation(size)
    st.text(simulation)
else:
    st.text("Select a visualization mode to display.")

if 'fig' in locals():
    st.pyplot(fig)