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()