@842001323
2016-11-20T18:47:24.000000Z
字数 2671
阅读 387
现实生活中,台球作为一种常见的消遣活动,因其娱乐方式很简单,几乎所有的朋友都接触过这种运动。台球发展到今天有了各种各样的规则和打法,其中库解球有比较简单的物理原理,可通过编程实现模拟
球在台桌上运动时,未触壁时一直匀速运动,触壁时速度的方向发生改变但大小不变。
可通过编程实现碰撞
当桌面为圆形,小球在圆内运动轨迹如图
这分别是t=50s,t=100s,t=250s所对应的图像。起始位置为(0.1,0),起始速度为(-0.3,0.2)
当桌面为正方形。正中内置一个圆形壁所对应的轨迹为
分别是t=50s,t=100s,t=400s所对应的图像。起始位置为(1.5,1.5),起始速度为(0.3,0.2)
但是当t增大到某一值时轨迹开始出现偏差
相对应的部分程序为
def run(self):
_time=0
while(_time<self.time):
length=math.sqrt(self.x[-1]**2+self.y[-1]**2)
if length<=1.0:
if self.y[-1]<=0 and self.x[-1]<0:
theta1=math.atan(self.y[-1]/self.x[-1])
theta2=math.atan(self.vy[-1]/self.vx[-1])
theta3=2*theta1-theta2
v=math.sqrt(self.vx[-1]**2+self.vy[-1]**2)
self.vx.append(-v*math.cos(theta3))
self.vy.append(-v*math.sin(theta3))
self.x.append(self.x[-1]+self.vx[-1]*self.dt)
self.y.append(self.y[-1]+self.vy[-1]*self.dt)
_time=_time+self.dt
elif self.y[-1]<=0 and self.x[-1]>0:
theta1=math.atan(self.y[-1]/self.x[-1])
theta2=math.atan(self.vy[-1]/self.vx[-1])
theta3=2*theta1-theta2
v=math.sqrt(self.vx[-1]**2+self.vy[-1]**2)
self.vx.append(v*math.cos(theta3))
self.vy.append(v*math.sin(theta3))
self.x.append(self.x[-1]+self.vx[-1]*self.dt)
self.y.append(self.y[-1]+self.vy[-1]*self.dt)
_time=_time+self.dt
else:
if self.x[-1]<=0:
theta1=math.atan(self.x[-1]/self.y[-1])
theta2=math.atan(self.vx[-1]/self.vy[-1])
theta3=2*theta1-theta2
v=math.sqrt(self.vx[-1]**2+self.vy[-1]**2)
self.vx.append(v*math.sin(theta3))
self.vy.append(v*math.cos(theta3))
self.x.append(self.x[-1]+self.vx[-1]*self.dt)
self.y.append(self.y[-1]+self.vy[-1]*self.dt)
_time=_time+self.dt
else:
theta1=math.atan(self.x[-1]/self.y[-1])
theta2=math.atan(self.vx[-1]/self.vy[-1])
theta3=2*theta1-theta2
v=math.sqrt(self.vx[-1]**2+self.vy[-1]**2)
self.vx.append(v*math.sin(theta3))
self.vy.append(v*math.cos(theta3))
self.x.append(self.x[-1]+self.vx[-1]*self.dt)
self.y.append(self.y[-1]+self.vy[-1]*self.dt)
_time=_time+self.dt
else :
if self.y[-1]>2 or self.y[-1]<-2:
self.vx.append(self.vx[-1])
self.vy.append(-self.vy[-1])
self.x.append(self.x[-1]+self.vx[-1]*self.dt)
self.y.append(self.y[-1]+self.vy[-1]*self.dt)
_time=_time+self.dt
elif self.x[-1]>2 or self.x[-1]<-2:
self.vx.append(-self.vx[-1])
self.vy.append(self.vy[-1])
self.x.append(self.x[-1]+self.vx[-1]*self.dt)
self.y.append(self.y[-1]+self.vy[-1]*self.dt)
_time=_time+self.dt
else:
self.x.append(self.x[-1]+self.vx[-1]*self.dt)
self.y.append(self.y[-1]+self.vy[-1]*self.dt)
self.vx.append(self.vx[-1])
self.vy.append(self.vy[-1])
_time=_time+self.dt
相对应的vpython动图为
vpython程序参考于2013级学长吴雨桥