Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import numpy as np | |
| import plotly.graph_objects as go | |
| from streamlit_plotly_events import plotly_events | |
| st.set_page_config(page_title="Dot Product Visualization", layout="wide") | |
| # Initialize session state | |
| if "v1" not in st.session_state: | |
| st.session_state.v1 = np.array([3, 2]) # Initial position of vector 1 | |
| if "v2" not in st.session_state: | |
| st.session_state.v2 = np.array([-2, 3]) # Initial position of vector 2 | |
| if "selected_vector" not in st.session_state: | |
| st.session_state.selected_vector = None # To track which vector is being moved | |
| # Function to compute dot product | |
| def compute_dot_product(v1, v2): | |
| return np.dot(v1, v2) | |
| # Create a plot | |
| fig = go.Figure() | |
| # Add vector 1 | |
| fig.add_trace(go.Scatter( | |
| x=[0, st.session_state.v1[0]], | |
| y=[0, st.session_state.v1[1]], | |
| mode="lines+markers", | |
| marker=dict(size=12, color="blue"), | |
| line=dict(width=4, color="blue"), | |
| name="Vector 1" | |
| )) | |
| # Add vector 2 | |
| fig.add_trace(go.Scatter( | |
| x=[0, st.session_state.v2[0]], | |
| y=[0, st.session_state.v2[1]], | |
| mode="lines+markers", | |
| marker=dict(size=12, color="red"), | |
| line=dict(width=4, color="red"), | |
| name="Vector 2" | |
| )) | |
| # Set axis properties | |
| fig.update_layout( | |
| xaxis=dict(range=[-5, 5], title="X-axis"), | |
| yaxis=dict(range=[-5, 5], title="Y-axis"), | |
| title="Interactive Dot Product Visualization", | |
| dragmode="pan", | |
| showlegend=True | |
| ) | |
| # Display the interactive plot | |
| st.subheader(f"Dot Product: `{compute_dot_product(st.session_state.v1, st.session_state.v2):.2f}`") | |
| selected_points = plotly_events(fig, click_event=True) | |
| # Check if a point is clicked | |
| if selected_points: | |
| clicked_x, clicked_y = selected_points[0]['x'], selected_points[0]['y'] | |
| # Determine which vector is clicked | |
| if np.allclose([clicked_x, clicked_y], st.session_state.v1, atol=0.5): | |
| st.session_state.selected_vector = "v1" | |
| elif np.allclose([clicked_x, clicked_y], st.session_state.v2, atol=0.5): | |
| st.session_state.selected_vector = "v2" | |
| # Move the selected vector using sliders | |
| if st.session_state.selected_vector: | |
| st.sidebar.subheader(f"Move {st.session_state.selected_vector}") | |
| new_x = st.sidebar.slider("X component", -5.0, 5.0, float(st.session_state[st.session_state.selected_vector][0]), step=0.1) | |
| new_y = st.sidebar.slider("Y component", -5.0, 5.0, float(st.session_state[st.session_state.selected_vector][1]), step=0.1) | |
| # Update vector position | |
| st.session_state[st.session_state.selected_vector] = np.array([new_x, new_y]) | |