View difference between Paste ID: y46tfBXL and m9knmtU7
SHOW: | | - or go back to the newest paste.
1-
from matplotlib import pyplot as plt
1+
#!/usr/bin/env python
2-
from matplotlib import animation
2+
3-
3+
from matplotlib import pyplot as plt
4-
4+
from matplotlib import animation
5-
class Particle:
5+
6-
6+
7-
    def __init__(self, x, y, ang_speed):
7+
class Particle:
8-
        self.x = x
8+
9-
        self.y = y
9+
    def __init__(self, x, y, ang_speed):
10-
        self.ang_speed = ang_speed
10+
        self.x = x
11-
11+
        self.y = y
12-
12+
        self.ang_speed = ang_speed
13-
class ParticleSimulator:
13+
14-
14+
15-
    def __init__(self, particles):
15+
class ParticleSimulator:
16-
        self.particles = particles
16+
17-
17+
    def __init__(self, particles):
18-
    def evolve(self, dt):
18+
        self.particles = particles
19-
        timestep = 0.00001
19+
20-
        nsteps = int(dt / timestep)
20+
    def evolve(self, dt):
21-
21+
        timestep = 0.00001
22-
        for i in range(nsteps):
22+
        nsteps = int(dt / timestep)
23-
            for p in self.particles:
23+
24-
24+
        for i in range(nsteps):
25-
                # 1. calculate the direction
25+
            for p in self.particles:
26-
                norm = (p.x ** 2 + p.y ** 2) ** 0.5
26+
27-
                v_x = (-p.y) / norm
27+
                # 1. calculate the direction
28-
                v_y = p.x / norm
28+
                norm = (p.x ** 2 + p.y ** 2) ** 0.5
29-
29+
                v_x = (-p.y) / norm
30-
                # 2. calculate the displacement
30+
                v_y = p.x / norm
31-
                d_x = timestep * p.ang_speed * v_x
31+
32-
                d_y = timestep * p.ang_speed * v_y
32+
                # 2. calculate the displacement
33-
33+
                d_x = timestep * p.ang_speed * v_x
34-
                p.x += d_x
34+
                d_y = timestep * p.ang_speed * v_y
35-
                p.y += d_y
35+
36-
36+
                p.x += d_x
37-
                # 3. repeat for all the time steps
37+
                p.y += d_y
38-
38+
39-
39+
                # 3. repeat for all the time steps
40-
def visualize(simulator):
40+
41-
    X = [p.x for p in simulator.particles]
41+
42-
    Y = [p.y for p in simulator.particles]
42+
def visualize(simulator):
43-
43+
    X = [p.x for p in simulator.particles]
44-
    fig = plt.figure()
44+
    Y = [p.y for p in simulator.particles]
45-
    ax = plt.subplot(111, aspect='equal')
45+
46-
    line, = ax.plot(X, Y, 'ro')
46+
    fig = plt.figure()
47-
47+
    ax = plt.subplot(111, aspect='equal')
48-
    # Axis limits
48+
    line, = ax.plot(X, Y, 'ro')
49-
    plt.xlim(-1, 1)
49+
50-
    plt.ylim(-1, 1)
50+
    # Axis limits
51-
51+
    plt.xlim(-1, 1)
52-
    # It will be run when the animation starts
52+
    plt.ylim(-1, 1)
53-
    def init():
53+
54-
        line.set_data([], [])
54+
    # It will be run when the animation starts
55-
        return line,
55+
    def init():
56-
56+
        line.set_data([], [])
57-
    def animate(i):
57+
        return line,
58-
        # We let the particle evolve for 0.1 time units
58+
59-
        simulator.evolve(0.01)
59+
    def animate(i):
60-
        X = [p.x for p in simulator.particles]
60+
        # We let the particle evolve for 0.1 time units
61-
        Y = [p.y for p in simulator.particles]
61+
        simulator.evolve(0.01)
62-
62+
        X = [p.x for p in simulator.particles]
63-
        line.set_data(X, Y)
63+
        Y = [p.y for p in simulator.particles]
64-
        return line,
64+
65-
65+
        line.set_data(X, Y)
66-
    # Call the animate function each 10 ms
66+
        return line,
67-
    anim = animation.FuncAnimation(fig, animate,
67+
68-
                                   init_func=init,
68+
    # Call the animate function each 10 ms
69-
                                   blit=True,
69+
    anim = animation.FuncAnimation(fig, animate,
70-
                                   # Efficient animation
70+
                                   init_func=init,
71-
                                   interval=10)
71+
                                   blit=True,
72-
    plt.show()
72+
                                   # Efficient animation
73-
73+
                                   interval=10)
74-
    def test_visualize():
74+
    plt.show()
75-
        particles = [Particle(0.3,  0.5,  +1),
75+
76-
                     Particle(0.0,  -0.5, -1),
76+
    def test_visualize():
77-
                     Particle(-0.1, -0.4, +3)]
77+
        particles = [Particle(0.3,  0.5,  +1),
78-
78+
                     Particle(0.0,  -0.5, -1),
79-
        simulator = ParticleSimulator(particles)
79+
                     Particle(-0.1, -0.4, +3)]
80-
        visualize(simulator)
80+
81-
81+
        simulator = ParticleSimulator(particles)
82-
    if __name__ == '__main__':
82+
        visualize(simulator)
83
84
    if __name__ == '__main__':
85
        test_visualize()