Example #1
0
    def add_point(self, point):
        # add point
        if (len(self.points) == 0):
            self.__insert_point(point, 0)
        else:
            add_dist = vector.get_distance(point, self.points[0])
            if add_dist >= self.min_point_dist:
                self.__insert_point(point, add_dist)

        # remove points if trail is too long
        while self.__current_length > self.max_length and len(self.points) > 1:
            self.__current_length -= vector.get_distance(
                self.points[-1], self.points[-2])
            self.points.pop(-1)
    def update(self, elapsed_time, particles):
        # Eat particles
        index = 0
        while index < len(particles):
            p = particles[index]
            if not p.is_positive and vector.get_distance(
                    self.position, p.position) < self.get_radius():
                self.eat_particle(p)
                particles.pop(index)
            index += 1

        # Updates all particles and removes them if they have reached
        # the center of the black hole.
        index = 0
        while index < len(self.eaten_particles):
            p = self.eaten_particles[index]
            if self.__should_be_removed(p):
                self.eaten_particles.pop(index)
                self.mass -= self.mass_los_per_particle
            else:
                index += 1

            pf = self.calculate_particle_force(p)
            max_vel = vector.get_length(pf) / 2
            # limit particle velocity to pervent infinit orbit
            # around black hole
            if vector.get_length(p.velocity) > max_vel:
                p.velocity = vector.change_length(p.velocity, max_vel)
            p.update(elapsed_time, pf)
 def calculate_particle_force(self, particle):
     return (vector.change_length(
         vector.point_from_to(particle.position, self.position),
         formulas.gravitational_force(
             self.mass, particle.mass,
             vector.get_distance(self.position, particle.position)) *
         self.scale))
Example #4
0
    def collide(particle1, particle2):
        # only particles with different charge can colide
        if particle1.is_positive == particle2.is_positive:
            return False

        distance = vector.get_distance(particle1.position, particle2.position)
        return distance < particle.radius * 2
Example #5
0
    def __calculate_force(self, other_particle):
        distance = vector.get_distance(self.position, other_particle.position)

        if distance < self.radius * 2:
            distance = self.radius * 2

        force_strength = self.force_constant / distance

        # invert force if the other particle has the same charge
        if self.is_positive == other_particle.is_positive:
            force_strength *= -1

        # vector pointing from this particle to the other particle
        force_vector = vector.point_from_to(self.position,
                                            other_particle.position)

        return vector.change_length(force_vector, force_strength)
 def is_position_on_horizon(self, position):
     margin = 100
     radius = self.get_radius()
     distance = vector.get_distance(self.position, position)
     return True
     return radius - margin < distance < radius + margin
 def __should_be_removed(self, particle):
     min_dist = 10
     return vector.get_distance(self.position, particle.position) < min_dist