public List<INavigableVessel> getShipsInSegment(Point2D location) { int[] index = calculateIndices(location); List<WeakReference<INavigableVessel>> references = segments[index[0]][index[1]]; ArrayList<INavigableVessel> copyList = new ArrayList<>(); for (WeakReference<INavigableVessel> reference : references) { if (reference.get() != null) { copyList.add(reference.get()); } } return copyList; }
public void add(INavigableVessel ship) { int[] index = calculateIndices(ship.getLocation()); segments[index[0]][index[1]].add(new WeakReference(ship)); }
public void remove(INavigableVessel ship) { int[] index = calculateIndices(ship.getLocation()); if (!segments[index[0]][index[1]].removeIf(wr -> ship.equals(wr.get()))) { LOGGER.warn("The ship {} could not be found and removed in segment {}", ship, index); } }
public List<INavigableVessel> getShipsInSegments(Point2D location, int radius) { int[] index = calculateIndices(location); final Point2D locationBefore = pointInterner.intern(getPointOnMap(location.getX() - radius, location.getY())); int[] indexBefore = calculateIndices(locationBefore); final Point2D locationAfter = pointInterner.intern(getPointOnMap(location.getX() + radius, location.getY())); int[] indexAfter = calculateIndices(locationAfter); Set<INavigableVessel> set = new HashSet<>(); if (indexBefore != index) { set.addAll(getShipsInSegment(locationBefore)); } set.addAll(getShipsInSegment(location)); if (indexAfter != index) { set.addAll(getShipsInSegment(locationAfter)); } return new ArrayList<>(set); }
@Subscribe public void handleShipMove(ShipPositionUpdateEvent event) { if (event.getFromLocation().getX() != event.getToLocation().getX() || event.getFromLocation().getY() != event.getToLocation().getY()) { int[] oldIndex = calculateIndices(event.getFromLocation()); int[] newIndex = calculateIndices(event.getToLocation()); if (!Arrays.equals(oldIndex, newIndex)) { segments[oldIndex[0]][oldIndex[1]].removeIf(wr -> event.getShip().equals(wr.get())); segments[newIndex[0]][newIndex[1]].add(new WeakReference<>(event.getShip())); } } }