Source code for logic.signal

import numpy as np
import glm


[docs] class Signal: """ The Signal class Provides methods for signal modeling """ def __init__(self, departure_time: int, direction: 'glm.vec3', speed: 'glm.vec3', power_multiply: int): self.direction: 'glm.vec3' = direction self.speed: 'glm.vec3' = speed self.power_multiply: int = power_multiply self.reflected: bool = False self.init_power: float = 150000 * 40 * 0.95 # init power self.power: float = self.init_power self.reflection_depth: int = 3 self.departure_time = departure_time
[docs] def update(self, new_direction, new_speed, new_time: int): """ Update signal if it collides with object :param new_direction: vector of new direction of signal :param new_speed: vector of new signal speed :param new_time: time when signal reflected """ self.power = self.power / np.sum(self.position(new_time) ** 2) self.direction = new_direction self.speed = new_speed self.departure_time = new_time self.reflected += 1
# reflect from earth
[docs] def reflect(self, new_time: int): if self.check_depth(): return if self.position(new_time).z < 0.01: self.power = self.power else: self.power = self.power / np.sum(self.position(new_time) ** 2) self.direction = self.position(new_time) self.reflected += 1 self.departure_time = new_time
# check if signal hit reflection depth
[docs] def check_depth(self): return self.reflected == self.reflection_depth
[docs] def position(self, time: int) -> 'glm.vec3': """ Returns the position of the signal depending on the time. :param time: time in the simulation """ if self.reflected % 2 == 1: return self.direction - self._position(time) return self.direction + self._position(time)
def _position(self, time: int) -> 'glm.vec3': """ Return the position based on speed (does not take into account the direction of the signal) :param time: time in the simulation :type time: int :return: vector of position :rtype: glm.vec3 """ return abs(time - self.departure_time) * self.speed