Spaces:
Sleeping
Sleeping
File size: 2,975 Bytes
0611560 9ec2516 db09f14 0611560 6e1639c 0611560 6e1639c 0611560 9ec2516 0611560 9ec2516 bae4e7e 0611560 db09f14 0611560 6e1639c 0611560 db09f14 0611560 bae4e7e 6e1639c 9ec2516 6e1639c 9ec2516 6e1639c 9ec2516 6e1639c bae4e7e 0611560 db09f14 bae4e7e 6e1639c 9ec2516 c8eca0d 9ec2516 bae4e7e 6e1639c db09f14 6e1639c 0611560 db09f14 6e1639c |
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 |
import streamlit as st
from typing import List, Tuple
from transformers import pipeline
# Constants
WIDTH, HEIGHT = 600, 600
ELASTICITY = 0.3
DAMPING = 0.7
# Create touch points
num_points = 20
touch_points: List[Tuple[float, float]] = [(x, y) for x in range(50, WIDTH-50, int((WIDTH-100)/(num_points-1))) for y in range(50, HEIGHT-50, int((HEIGHT-100)/(num_points-1)))]
original_points = touch_points.copy()
velocities: List[Tuple[float, float]] = [(0.0, 0.0)] * len(touch_points)
is_affected: List[bool] = [False] * len(touch_points)
# Set up the Hugging Face pipeline
text_generator = pipeline('text-generation', model='gpt2')
# Streamlit app
st.title("Artificial Touch Simulation")
# Create a Streamlit container for the touch simulation
touch_container = st.container()
def update_points():
global touch_points, velocities, is_affected
# Apply spring force
for i, (x, y) in enumerate(touch_points):
force_x = (original_points[i][0] - x) * ELASTICITY
force_y = (original_points[i][1] - y) * ELASTICITY
velocities[i] = (velocities[i][0] + force_x, velocities[i][1] + force_y)
# Apply damping
for i, (vx, vy) in enumerate(velocities):
velocities[i] = (vx * DAMPING, vy * DAMPING)
# Update position
for i, (x, y) in enumerate(touch_points):
vx, vy = velocities[i]
touch_points[i] = (x + vx, y + vy)
# Reset affected flags
is_affected = [False] * len(touch_points)
def on_tap(x, y):
global touch_points, velocities, is_affected
for i, (tx, ty) in enumerate(touch_points):
distance = ((tx - x)**2 + (ty - y)**2)**0.5
if distance < 30:
force_x = (tx - x) / distance
force_y = (ty - y) / distance
velocities[i] = (velocities[i][0] - force_x * 10, velocities[i][1] - force_y * 10)
is_affected[i] = True
# Generate a description of the touch
with touch_container:
st.write(f"Touch at ({x:.2f}, {y:.2f})")
text = text_generator(f"The user touched the screen at ({x:.2f}, {y:.2f}).", max_length=100, num_return_sequences=1, do_sample=True, top_k=50, top_p=0.95, num_beams=1)[0]['generated_text']
st.write(text)
update_points()
while True:
with touch_container:
for i, (x, y) in enumerate(touch_points):
if is_affected[i]:
st.circle((x, y), 5, color="red", fill_opacity=0.5)
else:
st.circle((x, y), 5, color="navy", fill_opacity=0.5)
if st.button("Tap the screen"):
on_tap(st.session_state.get('x', 0), st.session_state.get('y', 0))
st.experimental_set_query_params(x=touch_points[0][0], y=touch_points[0][1])
st.session_state['x'] = st.experimental_get_query_params().get('x', [0])[0]
st.session_state['y'] = st.experimental_get_query_params().get('y', [0])[0]
update_points()
st.experimental_rerun() |