package iamrescue.util.blocks; import iamrescue.belief.IAMWorldModel; import iamrescue.execution.command.IPath; import iamrescue.routing.costs.BlockCheckerUtil; import iamrescue.util.PositionXY; import java.util.ArrayList; import java.util.List; import rescuecore2.misc.geometry.GeometryTools2D; import rescuecore2.misc.geometry.Line2D; import rescuecore2.misc.geometry.Point2D; import rescuecore2.standard.entities.Area; import rescuecore2.standard.entities.Blockade; import rescuecore2.worldmodel.EntityID; public class BlockDetectionUtil { public static List<Blockade> getObstructingBlockades(Area area, PositionXY from, PositionXY to, IAMWorldModel worldModel) { List<Blockade> obstructions = new ArrayList<Blockade>(); if (area.isBlockadesDefined()) { // Line2D path = new Line2D(from.toPoint2D(), to.toPoint2D()); List<EntityID> blockades = area.getBlockades(); for (EntityID id : blockades) { Blockade blockade = (Blockade) worldModel.getEntity(id); if (blockade != null && blockade.isApexesDefined() && blockade.isRepairCostDefined()) { if (BlockCheckerUtil.isBlocking(blockade, from, to)) { obstructions.add(blockade); } /*int[] apexes = blockade.getApexes(); for (int i = 0; i < apexes.length; i = i + 2) { Line2D edge = new Line2D(new Point2D(apexes[i], apexes[i + 1]), new Point2D(apexes[(i + 2) % apexes.length], apexes[(i + 3) % apexes.length])); double intersection1 = edge.getIntersection(path); if (intersection1 >= 0 && intersection1 <= 1) { double intersection2 = path.getIntersection(edge); if (intersection2 >= 0 && intersection2 <= 1) { obstructions.add(blockade); break; } } }*/ } } } return obstructions; } private static double getDistanceToBlockade(PositionXY position, Blockade blockade, double threshold) { PositionXY blockadePosition = new PositionXY(blockade.getX(),blockade.getY()); double bestDistance = position.distanceTo(blockadePosition) ; if (bestDistance <= threshold) { return bestDistance; } for (Line2D line : GeometryTools2D.pointsToLines(GeometryTools2D .vertexArrayToPoints(blockade.getApexes()), true)) { Point2D closest = GeometryTools2D.getClosestPointOnSegment(line, position.toPoint2D()); double distance = GeometryTools2D.getDistance(position.toPoint2D(), closest); if (distance <= threshold) { return distance; } if (bestDistance > distance) { bestDistance = distance; } } return bestDistance; } public static double getDistanceToBlockade(PositionXY position, Blockade blockade) { return getDistanceToBlockade(position, blockade, -1); } public static boolean isWithinDistanceToBlockade(PositionXY position, Blockade blockade, double maxDistance) { return getDistanceToBlockade(position, blockade, maxDistance) <= maxDistance; } public static List<Blockade> findObstructingBlockades(IPath path, IAMWorldModel worldModel) { List<EntityID> locations = path.getLocations(); List<PositionXY> xyPath = path.getXYPath(); assert locations.size() == xyPath.size() - 1; List<Blockade> blockades = new ArrayList<Blockade>(); for (int i = 0; i < locations.size(); i++) { EntityID id = locations.get(i); PositionXY from = xyPath.get(i); PositionXY to = xyPath.get(i + 1); List<Blockade> obstructingBlockades = getObstructingBlockades( (Area) worldModel.getEntity(id), from, to, worldModel); blockades.addAll(obstructingBlockades); } return blockades; } }