나는 Ball 클래스를 생성 한 다음 파이썬 스크립트의 인스턴스를 생성합니다. 공은 벽에서 튀어 나와 나중에 (아직 구현되지 않음) 서로 떨어져 있어야합니다. 볼이 벽에 도달 할 때 볼의 방향을 바꾸는 대신 벽이 볼에 힘 (또는 가속)을 가하는 것에 유의하십시오.파이썬 tkinter 튀는 공 - 에너지가 무한대로갑니다
불행히도, 벽에서 튀어 오르면 볼은 진폭이 커지면서 진동 운동을 시작합니다.
저는 파이썬에 매우 익숙하지만 다양한 자바 스크립트/캔버스 시뮬레이션을 작성했습니다.
이 특수한 python 스크립트는 Verlet 통합을 사용하여 위치와 속도를 계산합니다. 나는이에 스크립트를 근거로하고있다 :
http://physics.weber.edu/schroeder/software/demos/MolecularDynamics.html
아무도는 벽을 수신 거부 볼을 "안정적"이되도록 내가 코드를 수정하는 방법을 제안 할 수 있습니다? 주셔서 감사합니다
from Tkinter import *
import random
window = Tk()
canvas = Canvas(window, width = 400, height = 300)
canvas.pack()
wallStiffness=0.05
dt=0.02
class Ball:
def __init__(self):
self.x=0
self.y=0
self.xvel=random.random()*2-1
self.yvel=random.random()*2-1
self.ax=0
self.ay=0
self.rad=20
def computeAccelerations(z):
if z.x<z.rad:
z.ax=wallStiffness*(z.rad-z.x)
else:
if z.x>400-z.rad:
z.ax=wallStiffness*(400-z.rad-z.x)
#only have horizontal bounces so far, and no bounces between balls yet
list=[]
for i in range(100): #0 to 99, make 100 balls
myball=Ball()
list.append(myball)
#script to place in a crystal to begin with
current_x=30
current_y=0
for j in list:
j.x=current_x
current_x+=30
j.y=current_y
if current_x+30>370:
current_x=30
current_y+=30
j.ball=canvas.create_oval(j.x,j.y,j.x+j.rad,j.y+j.rad,fill="blue")
while True:
for i in range(10): #10 steps per frame
for j in list:
j.x+=j.xvel*dt+0.5*j.ax*dt*dt
j.y+=j.yvel*dt+0.5*j.ay*dt*dt
j.xvel+=0.5*j.ax*dt
j.yvel+=0.5*j.ay*dt
computeAccelerations(j)
for j in list:
j.xvel+=0.5*j.ax*dt
j.yvel+=0.5*j.ay*dt
canvas.after(10) #duration of frame in ms
for z in list:
canvas.move(z.ball,z.xvel, z.yvel)
canvas.update()
window.mainloop() #keeps the window open
while 루프의 j.x + = 및 j.y + = 부분에 * dt가 누락되었습니다.진동 운동은 끝났지 만 입자가 벽을 통과합니다! – user2094585