Package epidemic.service
Class SpatialManager
java.lang.Object
epidemic.service.SpatialManager
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 -
Constructor Summary
ConstructorsConstructorDescriptionSpatialManager(double worldWidth, double worldHeight, double cellSize) Inicjalizuje nową siatkę wyszukiwań przestrzennych. -
Method Summary
Modifier and TypeMethodDescriptionprivate doublecalculateDistance(Point2D p1, Point2D p2) 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.voidCzyści siatkę i od nowa przypisuje żywych agentów do odpowiednich komórek na podstawie ich zaktualizowanych koordynatów.
-
Field Details
-
cellSize
private final double cellSize -
cols
private final int cols -
rows
private final int rows -
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
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
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
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
-