here2share

# tk_text2physics.py

Oct 10th, 2025 (edited)
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.49 KB | None | 0 0
  1. # tk_text2physics.py
  2.  
  3. import tkinter as tk
  4. import random
  5. import math
  6.  
  7. root = tk.Tk()
  8. root.title("# tk_text2physics")
  9. canvas = tk.Canvas(root, width=600, height=600, bg='#333333')
  10. canvas.pack()
  11.  
  12. letters_x = []
  13. letters_y = []
  14. letters_vx = []
  15. letters_vy = []
  16. letters_angle = []
  17. letters_av = []
  18. letters_char = []
  19. letter_chars = list("QWERTYUIOPASDFGHJKLZXCVBNM1234567890")
  20.  
  21. def apply_force(i, fx, fy):
  22.     letters_vx[i] += fx
  23.     letters_vy[i] += fy
  24.  
  25. def update_letter(i):
  26.     letters_vy[i] += 0.5
  27.     letters_x[i] += letters_vx[i]
  28.     letters_y[i] += letters_vy[i]
  29.     letters_angle[i] += letters_av[i]
  30.     letters_vx[i] *= 0.98
  31.     letters_vy[i] *= 0.98
  32.     letters_av[i] *= 0.92
  33.    
  34.     if abs(letters_vx[i]) < 0.01:
  35.         letters_vx[i] = 0
  36.     if abs(letters_vy[i]) < 0.01:
  37.         letters_vy[i] = 0
  38.     if abs(letters_av[i]) < 0.001:
  39.         letters_av[i] = 0
  40.    
  41.     if letters_y[i] > 570:
  42.         letters_y[i] = 570
  43.         if abs(letters_vy[i]) < 0.5:
  44.             letters_vy[i] = 0
  45.         else:
  46.             letters_vy[i] *= -0.4
  47.         letters_av[i] = letters_av[i] * 0.4 + letters_vx[i] * 0.05
  48.        
  49.     if letters_x[i] < 30:
  50.         letters_x[i] = 30
  51.         letters_vx[i] *= -0.4
  52.         letters_av[i] *= 0.6
  53.     if letters_x[i] > 570:
  54.         letters_x[i] = 570
  55.         letters_vx[i] *= -0.4
  56.         letters_av[i] *= 0.6
  57.  
  58. def check_collision(i, j):
  59.     dx = letters_x[j] - letters_x[i]
  60.     dy = letters_y[j] - letters_y[i]
  61.     dist = math.sqrt(dx*dx + dy*dy)
  62.    
  63.     if dist < 40 and dist > 0:
  64.         nx = dx / dist
  65.         ny = dy / dist
  66.        
  67.         dvx = letters_vx[j] - letters_vx[i]
  68.         dvy = letters_vy[j] - letters_vy[i]
  69.        
  70.         dot = dvx * nx + dvy * ny
  71.        
  72.         if dot < 0:
  73.             impulse = -1.2 * dot / 2
  74.            
  75.             letters_vx[i] -= impulse * nx
  76.             letters_vy[i] -= impulse * ny
  77.             letters_vx[j] += impulse * nx
  78.             letters_vy[j] += impulse * ny
  79.            
  80.             tangent_vel_i = -ny * letters_vx[i] + nx * letters_vy[i]
  81.             tangent_vel_j = -ny * letters_vx[j] + nx * letters_vy[j]
  82.            
  83.             torque_i = tangent_vel_j * 0.015
  84.             torque_j = tangent_vel_i * 0.015
  85.            
  86.             letters_av[i] += torque_i
  87.             letters_av[j] += torque_j
  88.            
  89.             letters_av[i] *= 0.7
  90.             letters_av[j] *= 0.7
  91.            
  92.             overlap = 40 - dist
  93.            
  94.             if letters_y[i] < letters_y[j]:
  95.                 letters_y[i] -= 3
  96.             else:
  97.                 letters_y[j] -= 3
  98.            
  99.             letters_x[i] -= nx * overlap * 0.5
  100.             letters_y[i] -= ny * overlap * 0.5
  101.             letters_x[j] += nx * overlap * 0.5
  102.             letters_y[j] += ny * overlap * 0.5
  103.  
  104. def attract_letters():
  105.     for i in range(len(letters_x)):
  106.         for j in range(i+1, len(letters_x)):
  107.             dx = letters_x[j] - letters_x[i]
  108.             dy = letters_y[j] - letters_y[i]
  109.             dist = math.sqrt(dx*dx + dy*dy)
  110.            
  111.             if dist > 0 and dist < 150:
  112.                 force = 0.02 / (dist * dist + 1)
  113.                 fx = (dx / dist) * force
  114.                 fy = (dy / dist) * force
  115.                
  116.                 apply_force(i, fx, fy)
  117.                 apply_force(j, -fx, -fy)
  118.  
  119. def update():
  120.     canvas.delete('all')
  121.    
  122.     attract_letters()
  123.    
  124.     for i in range(len(letters_x)):
  125.         update_letter(i)
  126.        
  127.     for i in range(len(letters_x)):
  128.         for j in range(i+1, len(letters_x)):
  129.             check_collision(i, j)
  130.    
  131.     for i in range(len(letters_x)):
  132.         canvas.create_text(letters_x[i], letters_y[i], text=letters_char[i],
  133.                           font=('Arial', 50, 'bold'),
  134.                           fill='white', angle=math.degrees(letters_angle[i]))
  135.    
  136.     root.after(16, update)
  137.  
  138. def spawn_letter():
  139.     if len(letters_x) < len(letter_chars):
  140.         letters_x.append(random.randint(50, 550))
  141.         letters_y.append(-20)
  142.         letters_vx.append(0)
  143.         letters_vy.append(0)
  144.         letters_angle.append(0)
  145.         letters_av.append(0)
  146.         letters_char.append(letter_chars[len(letters_x) - 1])
  147.         root.after(500, spawn_letter)
  148.  
  149. def reset(event):
  150.     letters_x.clear()
  151.     letters_y.clear()
  152.     letters_vx.clear()
  153.     letters_vy.clear()
  154.     letters_angle.clear()
  155.     letters_av.clear()
  156.     letters_char.clear()
  157.     spawn_letter()
  158.     update()
  159.  
  160. root.bind('<space>', reset)
  161.  
  162. spawn_letter()
  163. update()
  164. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment