Source code for logic.collision_detector

import numpy as np

from logic.signal import Signal
from logic.radar import Radar
from objects.aircraft import Aircraft


[docs] class CollisionDetector: """ The collision detectors class Provides logic for calculating collisions of objects and signals """ def __init__(self, radar: Radar): """ The CollisionDetector class initializer. :param radar: The radar object :type radar: Radar """ self.radar: Radar = radar
[docs] def scan_objects(self, signals: list[Signal], objects: list[Aircraft], time: int) -> list[Signal]: """ A method that search for collision between objects and signals. :param signals: List of signals that will be checked :type signals: list[Signal] :param objects: List of objects that will be checked :type objects: list[Aircraft] :param time: Current time in the simulation :return: List of signals that collided with objects :rtype: list[Signal] """ return_signals = set() for signal in signals: for obj in objects: if signal.position(time).z <= 0: signal.reflect(time) if not signal.check_depth() and np.sqrt(np.sum(( signal.position( time) - obj.position) ** 2)) < obj.reflection_radius: signal.update(obj.position, -signal.speed, time + 2) return_signals.add(signal) elif ((not signal.check_depth()) and np.sqrt(np.sum((signal.position(time)) ** 2)) >= self.radar.emitter.range_of_action): return_signals.add(signal) return list(return_signals)
[docs] def scan_radar(self, signals: list[Signal], time: int) -> list[Signal]: """ A method that search for collision between radar and reflected signals :param signals: List of signals that will be checked :type signals: list[Signal] :param time: Current time in the simulation :type time: int :return: List of signals that collided with radar :rtype: list[Signal] """ return list(filter( lambda x: x.reflected and np.sqrt(np.sum( (x.position(time) - self.radar.receiver.position) ** 2)) <= self.radar.receiver.radius, signals) )
[docs] def scan_floor(self, signals: list[Signal], time): return_signals = [] for signal in signals: if signal.position(time).z <= 0: signal.reflect(time) return return_signals