Example #1
0
 def __init__(self, pos, charge, mass, radius, color, vel, fixed,
              negligible):
     """ Creates a new particle with specified properties (in SI units)
             pos: XYZ starting position of the particle, in meters
             charge: charge of the particle, in Coulombs
             mass: mass of the particle, in kg
             radius: radius of the particle, in meters. No effect on simulation
             color: color of the particle. If None, a default color will be chosen
             vel: initial velocity vector, in m/s
             fixed: if True, particle will remain fixed in place
             negligible: assume charge is small wrt other charges to speed up calculation
     """
     self.pos = vector(pos)
     self.radius = radius
     self.charge = charge
     self.mass = mass
     self.vel = vector(vel)
     self.fixed = fixed
     self.negligible = negligible
     self.color = color
     if vp:
         self.vsphere = vp.add(Sphere(
             pos, r=radius, c=color))  # Sphere representing the particle
         # vp.addTrail(alpha=0.4, maxlength=1, n=50)
         # Add a trail behind the particle
         self.vsphere.addTrail(alpha=0.4, maxlength=1, n=50)
Example #2
0
    def __init__(self, songname=''):

        self.KB = dict()
        self.vp = None
        self.rightHand = None
        self.leftHand = None
        self.vpRH = None
        self.vpLH = None
        self.playsounds = True
        self.verbose = True
        self.songname = songname
        self.t0 = 0  # keep track of how many seconds to play
        self.dt = 0.1
        self.speedfactor = 1
        self.engagedfingersR = [False] * 6  # element 0 is dummy
        self.engagedfingersL = [False] * 6
        self.engagedkeysR = []
        self.engagedkeysL = []
        self.tcoords = [
            [-10., -15.],  # texture
            [11., -15.],
            [-10., 16.],
            [11., 16.],
            [10., -15.],
            [-11., -15.],
            [10., 16.],
            [-11., 16.],
            [5., 10.],
            [5., -11.],
            [-6., 10.],
            [-6., -11.],
            [-5., 10.],
            [-5., -11.],
            [6., 10.],
            [6., -11.],
            [5., -15.],
            [-6., -15.],
            [5., 16.],
            [-6., 16.],
            [-5., -15.],
            [6., -15.],
            [-5., 16.],
            [6., 16.]
        ]
        self.tcoords = vector(self.tcoords) / 12 + 0.44

        self.build_keyboard()
Example #3
0
 def simulate(self):
     """ Runs the particle simulation. Simulates one time step, dt, of the particle motion.
         Calculates the force between each pair of particles and updates particles' motion accordingly
     """
     # Main simulation loop
     for i in range(self.iterations):
         for a in self.particles:
             if a.fixed:
                 continue
             ftot = vector(0, 0, 0)  # total force acting on particle a
             for b in self.particles:
                 if a.negligible and b.negligible or a == b:
                     continue
                 ab = a.pos - b.pos
                 ftot += ((K_COULOMB * a.charge * b.charge) /
                          mag2(ab)) * versor(ab)
             a.vel += ftot / a.mass * self.dt  # update velocity and position of a
             a.pos += a.vel * self.dt
             a.vsphere.pos(a.pos)
         if vp:
             vp.show(zoom=1.2)
             vp.camera.Azimuth(0.1)  # rotate camera
Example #4
0
 def simulate(self):
     """
     Runs the particle simulation. Simulates one time step, dt, of the particle motion.
     Calculates the force between each pair of particles and updates their motion accordingly
     """
     # Main simulation loop
     for i in range(self.iterations):
         for a in self.particles:
             if a.fixed:
                 continue
             ftot = vector(0, 0, 0)  # total force acting on particle a
             for b in self.particles:
                 if a.negligible and b.negligible or a == b:
                     continue
                 ab = a.pos - b.pos
                 ftot += ((K_COULOMB * a.charge * b.charge) /
                          mag2(ab)) * versor(ab)
             a.vel += ftot / a.mass * self.dt  # update velocity and position of a
             a.pos += a.vel * self.dt
             a.vsphere.pos(a.pos)
         if plt:
             plt.show(resetcam=not i, azimuth=1)
             if plt.escaped: break  # if ESC is hit during the loop
Example #5
0
        x_dot[k] -= Dt * Ks * (bob_x_m[k] - bob_x_m[k + 1]) * factor
        y_dot[k] -= Dt * Ks * (bob_y_m[k] - bob_y_m[k + 1]) * factor

    # Check to see if they are colliding
    for i in range(1, N):
        for j in range(i + 1, N + 1):
            dist2 = (bob_x[i] - bob_x[j])**2 + (bob_y[i] - bob_y[j])**2
            if dist2 < DiaSq:  # are colliding
                Ddist = np.sqrt(dist2) - 2 * R
                tau = versor([bob_x[j] - bob_x[i], bob_y[j] - bob_y[i], 0])
                DR = Ddist / 2 * tau
                bob_x[i] += DR[0]  # DR.x
                bob_y[i] += DR[1]  # DR.y
                bob_x[j] -= DR[0]  # DR.x
                bob_y[j] -= DR[1]  # DR.y
                Vji = vector(x_dot[j] - x_dot[i], y_dot[j] - y_dot[i])
                DV = np.dot(Vji, tau) * tau
                x_dot[i] += DV[0]  # DV.x
                y_dot[i] += DV[1]  # DV.y
                x_dot[j] -= DV[0]  # DV.x
                y_dot[j] -= DV[1]  # DV.y

    # Update the loations of the bobs and the stretching of the springs
    for k in range(1, N + 1):
        bob[k].pos([bob_x[k], bob_y[k], 0])
        link[k - 1].stretch(bob[k - 1].pos(), bob[k].pos())

    plt.show()
    if plt.escaped: break  # if ESC is hit during the loop

plt.close()