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))
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
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