123456789101112131415161718192021222324252627282930313233343536 |
- """Simulation of a block connected to a spring in a viscous medium"""
- from vedo import *
- L = 0.1 # spring x position at rest
- x0 = 0.85 # initial x-coordinate of the block
- k = 25 # spring constant
- m = 20 # block mass
- b = 0.5 # viscosity friction (proportional to velocity)
- dt = 0.15 # time step
- v = vector(0, 0, 0.2) # initial conditions
- x = vector(x0, 0, 0)
- x0 = vector(-0.8, 0, 0)
- xr = vector(L, 0, 0)
- def loop_func(event):
- global v, x
- F = -k * (x - xr) - b * v # force and friction
- a = F / m # acceleration
- v = v + a*dt # velocity
- x = x + v*dt + 1/2 * a * dt**2 # position
- block.pos(x) # update block position and trail
- spr = Spring(x0, x, r1=0.06, thickness=0.01)
- plt.remove("Spring").add(spr).render()
- block = Cube(pos=x, side=0.2).color("tomato")
- spring = Spring(x0, x, r1=0.06, thickness=0.01)
- plt = Plotter(size=(1050, 600))
- plt += Box(pos=(0, -0.1, 0), size=(2.0, 0.02, 0.5)) # floor
- plt += Box(pos=(-0.82, 0.15, 0), size=(0.04,0.50,0.3)) # wall
- plt += [block, spring, __doc__]
- plt.add_callback("timer", loop_func)
- plt.timer_callback("start")
- plt.show().close()
|