Class SpatialManager

java.lang.Object
epidemic.service.SpatialManager

public class SpatialManager extends Object
Optymalizuje zapytania przestrzenne w symulacji poprzez implementację struktury podziału przestrzennego (Grid Spatial Partitioning / Bin-Lattice). Dzieli mapę na logiczną siatkę komórek, co pozwala na błyskawiczne znajdowanie agentów w zadanym promieniu, drastycznie redukując złożoność obliczeniową z O(N^2) do wartości bliskich O(N) poprzez eliminację konieczności iterowania po całej populacji świata.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private final double
     
    private final int
     
    private final List<Agent>[][]
     
    private final int
     
  • Constructor Summary

    Constructors
    Constructor
    Description
    SpatialManager(double worldWidth, double worldHeight, double cellSize)
    Inicjalizuje nową siatkę wyszukiwań przestrzennych.
  • Method Summary

    Modifier and Type
    Method
    Description
    private double
     
    getNearbyAgents(Agent centerAgent, double radius)
    Wyszukuje wszystkich żywych agentów przebywających w określonym promieniu od wskazanego agenta docelowego.
    getNearbyAgentsAtPos(Point2D centerPos, double radius)
    Wyszukuje agentów w określonym promieniu bazując na abstrakcyjnym punkcie na mapie, a nie na konkretnym agencie.
    void
    rebuild(WorldMap worldMap)
    Czyści siatkę i od nowa przypisuje żywych agentów do odpowiednich komórek na podstawie ich zaktualizowanych koordynatów.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • cellSize

      private final double cellSize
    • cols

      private final int cols
    • rows

      private final int rows
    • grid

      private final List<Agent>[][] grid
  • Constructor Details

    • SpatialManager

      public SpatialManager(double worldWidth, double worldHeight, double cellSize)
      Inicjalizuje nową siatkę wyszukiwań przestrzennych.
      Parameters:
      worldWidth - Całkowita szerokość mapy świata.
      worldHeight - Całkowita wysokość mapy świata.
      cellSize - Rozmiar pojedynczej komórki siatki. Powinien być skorelowany z maksymalnym promieniem wyszukiwania (np. promieniem zakażenia), aby zoptymalizować liczbę odpytywanych komórek sąsiadujących.
  • Method Details

    • rebuild

      public void rebuild(WorldMap worldMap)
      Czyści siatkę i od nowa przypisuje żywych agentów do odpowiednich komórek na podstawie ich zaktualizowanych koordynatów. Wywoływane obowiązkowo raz na epokę po zakończeniu fazy przemieszczania się wszystkich jednostek.
      Parameters:
      worldMap - Mapa świata zawierająca aktualną listę agentów.
    • getNearbyAgents

      public List<Agent> getNearbyAgents(Agent centerAgent, double radius)
      Wyszukuje wszystkich żywych agentów przebywających w określonym promieniu od wskazanego agenta docelowego. Optymalizuje proces badając tylko komórki siatki pokrywające się z obszarem wyznaczonego promienia (Bounding Box).
      Parameters:
      centerAgent - Agent stanowiący środek okręgu wyszukiwania. Wynik naturalnie wyklucza tego agenta.
      radius - Promień wyszukiwania w jednostkach miary przestrzeni mapy.
      Returns:
      Lista znalezionych sąsiadów w zasięgu.
    • getNearbyAgentsAtPos

      public List<Agent> getNearbyAgentsAtPos(Point2D centerPos, double radius)
      Wyszukuje agentów w określonym promieniu bazując na abstrakcyjnym punkcie na mapie, a nie na konkretnym agencie. Przydatne np. do weryfikacji zagęszczenia tłumu w danym sektorze.
      Parameters:
      centerPos - Dokładny punkt centralny obszaru wyszukiwania.
      radius - Promień wyszukiwania.
      Returns:
      Lista jednostek w zasięgu zadanego punktu.
    • calculateDistance

      private double calculateDistance(Point2D p1, Point2D p2)