85 lines
2.9 KiB
Python
85 lines
2.9 KiB
Python
|
# Copyright 2018-2022 Streamlit Inc.
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
# See the License for the specific language governing permissions and
|
||
|
# limitations under the License.
|
||
|
|
||
|
import streamlit as st
|
||
|
import inspect
|
||
|
import textwrap
|
||
|
import numpy as np
|
||
|
from typing import Any
|
||
|
from streamlit.hello.utils import show_code
|
||
|
|
||
|
|
||
|
def animation_demo():
|
||
|
|
||
|
# Interactive Streamlit elements, like these sliders, return their value.
|
||
|
# This gives you an extremely simple interaction model.
|
||
|
iterations = st.sidebar.slider("Level of detail", 2, 20, 10, 1)
|
||
|
separation = st.sidebar.slider("Separation", 0.7, 2.0, 0.7885)
|
||
|
|
||
|
# Non-interactive elements return a placeholder to their location
|
||
|
# in the app. Here we're storing progress_bar to update it later.
|
||
|
progress_bar = st.sidebar.progress(0)
|
||
|
|
||
|
# These two elements will be filled in later, so we create a placeholder
|
||
|
# for them using st.empty()
|
||
|
frame_text = st.sidebar.empty()
|
||
|
image = st.empty()
|
||
|
|
||
|
m, n, s = 960, 640, 400
|
||
|
x = np.linspace(-m / s, m / s, num=m).reshape((1, m))
|
||
|
y = np.linspace(-n / s, n / s, num=n).reshape((n, 1))
|
||
|
|
||
|
for frame_num, a in enumerate(np.linspace(0.0, 4 * np.pi, 100)):
|
||
|
# Here were setting value for these two elements.
|
||
|
progress_bar.progress(frame_num)
|
||
|
frame_text.text("Frame %i/100" % (frame_num + 1))
|
||
|
|
||
|
# Performing some fractal wizardry.
|
||
|
c = separation * np.exp(1j * a)
|
||
|
Z = np.tile(x, (n, 1)) + 1j * np.tile(y, (1, m))
|
||
|
C = np.full((n, m), c)
|
||
|
M: Any = np.full((n, m), True, dtype=bool)
|
||
|
N = np.zeros((n, m))
|
||
|
|
||
|
for i in range(iterations):
|
||
|
Z[M] = Z[M] * Z[M] + C[M]
|
||
|
M[np.abs(Z) > 2] = False
|
||
|
N[M] = i
|
||
|
|
||
|
# Update the image placeholder by calling the image() function on it.
|
||
|
image.image(1.0 - (N / N.max()), use_column_width=True)
|
||
|
|
||
|
# We clear elements by calling empty on them.
|
||
|
progress_bar.empty()
|
||
|
frame_text.empty()
|
||
|
|
||
|
# Streamlit widgets automatically run the script from top to bottom. Since
|
||
|
# this button is not connected to any other logic, it just causes a plain
|
||
|
# rerun.
|
||
|
st.button("Re-run")
|
||
|
|
||
|
|
||
|
st.set_page_config(page_title="Animation Demo", page_icon="📹")
|
||
|
st.markdown("# Animation Demo")
|
||
|
st.sidebar.header("Animation Demo")
|
||
|
st.write(
|
||
|
"""This app shows how you can use Streamlit to build cool animations.
|
||
|
It displays an animated fractal based on the the Julia Set. Use the slider
|
||
|
to tune different parameters."""
|
||
|
)
|
||
|
|
||
|
animation_demo()
|
||
|
|
||
|
show_code(animation_demo)
|