Advertisement
Guest User

Untitled

a guest
May 26th, 2015
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.18 KB | None | 0 0
  1. from tkinter import *
  2. import time
  3. import math
  4. #constant
  5. window_width=300
  6. window_height=300
  7. ball_size=20
  8. ball_distance = ball_size/2
  9. ball_offset_line = ball_size/2 + ball_distance/2
  10. nb_balls= 1
  11. pixel_step=1
  12. ball_weight=20
  13. time_refresh=0.005
  14. time_simulation=2
  15. window_offsetx = window_width/2 - 2.5*ball_size - 2*ball_distance
  16. window_offsety = window_height/3
  17. selected_ball = -1
  18. canvas= -1
  19. white_ball=-1
  20. balls=-1
  21. xp=0
  22. xm=0
  23. delta=0
  24. pente=0
  25. coeff_directeur=0
  26. ord_origin=0
  27. ord2_origin=0
  28. coeff2_directeur = 0
  29. phi=0
  30. m1=0.450
  31. m2=0.450
  32. def angle_apres_choc(v1,v2,theta1,theta2):
  33. if v2==0:
  34. theta11=math.atan(((m1-m2)/(m1+m2))*math.tan(theta1))
  35. theta21=(math.pi)/2
  36. v11=math.sqrt(pow(v1*math.cos(theta1),2)+pow(((2*m2)/(m1+m2))*(math.sin(theta2)*v2)+((m1-m2)/(m1+m2))*v1*math.sin(theta1),2))
  37. v21=math.sqrt(pow(v2*math.cos(theta2),2)+pow(((2*m1)/(m1+m2))*(math.sin(theta1)*v1)+((m2-m1)/(m1+m2))*v2*math.sin(theta2),2))
  38. else:
  39. theta11=math.atan(((2*m2)/(m1+m2)*v2*math.sin(theta2))/(v1*math.cos(theta1))+(m1-m2)/(m1+m2)*math.tan(theta1))
  40. theta21=math.atan(((2*m1)/(m1+m2)*v1*math.sin(theta1))/(v2*math.cos(theta2))+(m2-m1)/(m1+m2)*math.tan(theta2))
  41. v11=math.sqrt(pow(v1*math.cos(theta1),2)+pow(((2*m2)/(m1+m2))*(math.sin(theta2)*v2)+((m1-m2)/(m1+m2))*v1*math.sin(theta1),2))
  42. v21=math.sqrt(pow(v2*math.cos(theta2),2)+pow(((2*m1)/(m1+m2))*(math.sin(theta1)*v1)+((m2-m1)/(m1+m2))*v2*math.sin(theta2),2))
  43. return(v11,v21,theta11,theta21)
  44.  
  45.  
  46.  
  47.  
  48. def intersect(x0,x1,y0,y1):
  49. if y0==y1:
  50. x=(pow(x0,2)-pow(x1,2))/(2*(x0-x1))
  51. A = 1
  52. B = -2*y1
  53. C = pow(x1,2)+pow(x,2) - 2*x1*x + pow(y1,2) - pow(ball_size/2,2)
  54. delta = pow(B,2)-4*(A)*C
  55. ym = ((-B)-math.sqrt(delta))/(2*A)
  56. yp = ((-B)+math.sqrt(delta))/(2*A)
  57. y=(yp+ym)/2
  58. return(x,y)
  59. else:
  60. N=(-pow(x1,2)+pow(x0,2)-pow(y1,2)+pow(y0,2))/(2*(y0-y1))
  61. B=2*(y0*((x0-x1)/(y0-y1)))-2*N*((x0-x1)/(y0-y1))-2*x0
  62. A=pow((x0-x1)/(y0-y1),2)+1
  63. C=(pow(x0,2)+pow(y0,2)+pow(N,2)-pow(ball_size/2,2)-2*y0*N)
  64. delta = pow(B,2)-4*(A)*C
  65. xm=((-B)-math.sqrt(delta))/(2*A)
  66. xp=((-B)+math.sqrt(delta))/(2*A)
  67. x=(xm+xp)/2
  68. ym=N-xm*((x0-x1)/(y0-y1))
  69. yp=N-xp*((x0-x1)/(y0-y1))
  70. y=(ym+yp)/2
  71. return(x,y)
  72.  
  73. def tangente(x0,y0,x1,y1):
  74. if (x1-x0)==0:
  75. pente=0
  76. coeff_directeur=0
  77. ord_origin=y1
  78. else:
  79. pente=(y1-y0)/(x1-x0)
  80. if pente:
  81. coeff_directeur=-1/(pente)
  82. else:
  83. coeff_directeur=0
  84. ord_origin=y1-coeff_directeur*x1
  85. return(coeff_directeur,ord_origin)
  86.  
  87. def coeffdirecteur(x0,y0,x1,y1):
  88. if x1-x0==0:
  89. coeff2_directeur=1000000000
  90. ord2_origin=0
  91. else:
  92. coeff2_directeur=(y1-y0)/(x1-x0)
  93. ord2_origin=y0-coeff2_directeur*x0
  94. return(coeff2_directeur,ord2_origin)
  95.  
  96.  
  97. def angle(c0,c1):
  98. phi=math.atan((c1-c0)/(1+c1*c0))
  99. return(phi)
  100.  
  101. def mouse_clicked(event):
  102. global selected_ball
  103. for i in range(1,nb_balls+1):
  104. event.widget.itemconfig(i, fill="black")
  105. event.widget.itemconfig(nb_balls+1, fill='white')
  106. selected_ball = event.widget.find_overlapping(event.x, event.y,event.x,event.y)
  107. event.widget.itemconfig(selected_ball, fill="red")
  108. if not len(selected_ball): return
  109. def left_move(event):
  110. if selected_ball != -1:
  111. canvas.move(selected_ball, -pixel_step, 0)
  112.  
  113.  
  114. def right_move(event):
  115. if selected_ball != -1:
  116. canvas.move(selected_ball, pixel_step, 0)
  117.  
  118. def up_move(event):
  119. if selected_ball != -1:
  120. canvas.move(selected_ball, 0, -pixel_step)
  121.  
  122.  
  123. def down_move(event):
  124. if selected_ball != -1:
  125. canvas.move(selected_ball, 0, pixel_step)
  126.  
  127. def simulation_launched():
  128.  
  129. depls = []
  130.  
  131. # Init speeds
  132. for ball in balls:
  133. depls.append([0,0])
  134. depls[-1] = [0, - pixel_step]
  135.  
  136. white_coords = canvas.coords(white_ball)
  137. center_white_x0= white_coords[0]+ ball_size/2
  138. center_white_y0= white_coords[1] + ball_size/2
  139.  
  140. for i in range(1,int(time_simulation/time_refresh)):
  141.  
  142. white_coords = canvas.coords(white_ball)
  143. center_white_x=white_coords[0]+ ball_size/2
  144. center_white_y= white_coords[1] + ball_size/2
  145.  
  146. for ball in balls:
  147. for ball2 in balls:
  148. if balls.index(ball2) > balls.index(ball):
  149.  
  150. black_coords_1 = canvas.coords(ball)
  151. black_coords_2 = canvas.coords(ball2)
  152.  
  153. center_black_x1 = black_coords_1[0]+ ball_size/2
  154. center_black_y1 = black_coords_1[1] + ball_size/2
  155. center_black_x2 = black_coords_2[0]+ ball_size/2
  156. center_black_y2 = black_coords_2[1] + ball_size/2
  157. radius = ball_size/2
  158.  
  159. if math.sqrt(pow(center_black_x1 - center_black_x2,2)+pow(center_black_y1 - center_black_y2,2))<=2*radius:
  160. (contact_x, contact_y) = intersect(center_black_x1, center_black_x2, center_black_y1, center_black_y2)
  161. (coef_tang, ord_orig_tang) = tangente(center_black_x2, center_black_y2, contact_x, contact_y)
  162. #canvas.create_line(0,ord_orig_tang,window_width,ord_orig_tang+window_width*coef_tang,fill='red')
  163. (coef_droite, ord_orig_droite)=coeffdirecteur(center_white_x0,center_white_y0,contact_x,contact_y)
  164. #canvas.create_line(center_white_x0,center_white_y0,contact_x,contact_y,fill='blue')
  165. phi=angle(coef_droite,coef_tang)
  166. (v1_choc,v2_choc,theta1_choc,theta2_choc)=angle_apres_choc(66,0,phi,0)
  167. if coef_tang <0 :
  168. depls[balls.index(ball2)][0]=v1_choc*time_refresh*3*math.cos(theta1_choc+angle(coef_tang,0))
  169. depls[balls.index(ball2)][1]=v1_choc*time_refresh*3*math.sin(theta1_choc-angle(coef_tang,0))
  170. depls[balls.index(ball)][0]=v2_choc*time_refresh*3*math.cos(theta2_choc+angle(coef_tang,0))
  171. depls[balls.index(ball)][1]=-v2_choc*time_refresh*3*math.sin(theta2_choc+angle(coef_tang,0))
  172. else:
  173. depls[balls.index(ball2)][0]=v1_choc*time_refresh*3*math.cos(math.pi-theta1_choc-angle(coef_tang,0))
  174. depls[balls.index(ball2)][1]=v1_choc*time_refresh*3*math.sin(theta1_choc+angle(coef_tang,0))
  175. depls[balls.index(ball)][0]=v2_choc*time_refresh*3*math.cos(theta2_choc+angle(coef_tang,0))
  176. depls[balls.index(ball)][1]=-v2_choc*time_refresh*3*math.sin(theta2_choc+angle(coef_tang,0))
  177.  
  178. canvas.move(ball,depls[balls.index(ball)][0],depls[balls.index(ball)][1])
  179. time.sleep(time_refresh)
  180. canvas.update()
  181.  
  182.  
  183.  
  184. #Ecran de simulation
  185. #Initialisation
  186. def main():
  187. global balls, white_ball
  188. fenetre= Tk()
  189. fenetre.title("Simulateur de billard")
  190. Button(fenetre,text='Quit', command=fenetre.destroy).pack(side=BOTTOM)
  191. Button(fenetre,text="launch",command=simulation_launched).pack(side=BOTTOM)
  192. global canvas
  193. canvas=Canvas(fenetre,width=window_width,height=window_height, background='green')
  194. balls=[]
  195. for j in range(0,5):
  196. for i in range(0,5-j):
  197. initx= window_offsetx + (ball_size+ ball_distance)*i + (ball_offset_line)*j
  198. inity= window_offsety +(ball_size + ball_distance)*j
  199. ball=canvas.create_oval(initx,inity, initx+ ball_size,inity + ball_size,fill='black')
  200. balls.append(ball)
  201. white_ball = canvas.create_oval(window_width/2 - ball_size/2, window_height- ball_size,window_width/2+ball_size/2, window_height,fill='white')
  202. balls.append(white_ball)
  203. canvas.bind('<Button-1>', mouse_clicked)
  204. fenetre.bind('<Left>', left_move)
  205. fenetre.bind('<Right>', right_move)
  206. fenetre.bind('<Up>',up_move)
  207. fenetre.bind('<Down>', down_move)
  208. canvas.pack()
  209. fenetre.mainloop()
  210.  
  211.  
  212. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement