@Override public Double load(final Position dest) { if (env instanceof MapEnvironment<?>) { return ((MapEnvironment<Object>) env).computeRoute(node, dest).length(); } return getDevicePosition().getDistanceTo(dest); } });
@Override protected boolean nodeShouldBeAdded(final Node<Double> node, final Position p) { final boolean isWithinLimits = super.nodeShouldBeAdded(node, p); if (isWithinLimits) { if (node instanceof CellWithCircularArea) { final CellWithCircularArea thisNode = (CellWithCircularArea) node; double range = getMaxDiameterAmongCellWithCircularShape(); if (thisNode.getDiameter() > range) { range = thisNode.getDiameter(); } final double nodeRadius = thisNode.getRadius(); return isWithinLimits && (range <= 0 || !getNodesWithinRange(p, range).stream() .filter(n -> n instanceof CellWithCircularArea) .map(n -> (CellWithCircularArea) n) .filter(n -> getPosition(n).getDistanceTo(p) < nodeRadius + n.getRadius()) .findFirst() .isPresent()); } else { return true; } } else { return false; } }
private Position findNearestFreePosition(final CellWithCircularArea nodeToMove, final Position originalPos, final Position requestedPos) { final double distanceToReq = originalPos.getDistanceTo(requestedPos); if (maxDiameter == 0d || distanceToReq == 0) { return requestedPos; .filter(Optional::isPresent) .map(Optional::get) .min((p1, p2) -> Double.compare(p1.getDistanceTo(originalPos), p2.getDistanceTo(originalPos))) .orElse(requestedPos);
@Override public Field nbrRange() { final boolean useRoutesAsDistances = env instanceof MapEnvironment<?> && node.contains(USE_ROUTES_AS_DISTANCES); return buildFieldWithPosition(p -> { if (useRoutesAsDistances) { if (node.contains(APPROXIMATE_NBR_RANGE)) { try { final double tolerance = (double) node.getConcentration(APPROXIMATE_NBR_RANGE); final double currTime = env.getSimulation().getTime().toDouble(); if (currTime > nbrRangeTimeout) { nbrRangeTimeout = currTime + tolerance; precalcdRoutingDistance = routingDistance(p); } assert !Double.isNaN(precalcdRoutingDistance); return precalcdRoutingDistance; } catch (final ClassCastException e) { throw new IllegalStateException(APPROXIMATE_NBR_RANGE + " should be associated with a double concentration", e); } } return routingDistance(p); } return getDevicePosition().getDistanceTo(p); }); }
final double cat = intersection.getDistanceTo(possibleObstaclePosition); final double distToSum = originalPos.getDistanceTo(intersection) - cat2; final Position versor = new Continuous2DEuclidean((xIntersect - xo) / module, (yIntersect - yo) / module);
private boolean selectNodes(final CellWithCircularArea node, final CellWithCircularArea nodeToMove, final Position origin, final Position requestedPos, final double xVer, final double yVer) { // testing if node is between requested position and original position final Position nodePos = getPosition(node); final Position nodeOrientationFromOrigin = new Continuous2DEuclidean(nodePos.getCoordinate(0) - origin.getCoordinate(0), nodePos.getCoordinate(1) - origin.getCoordinate(1)); final double scalarProductResult1 = xVer * nodeOrientationFromOrigin.getCoordinate(0) + yVer * nodeOrientationFromOrigin.getCoordinate(1); // testing if node is near enough to requested position to be an obstacle final Position oppositeVersor = new Continuous2DEuclidean(-xVer, -yVer); final Position nodeOrientationFromReq = new Continuous2DEuclidean(nodePos.getCoordinate(0) - requestedPos.getCoordinate(0), nodePos.getCoordinate(1) - requestedPos.getCoordinate(1)); final double scalarProductResult2 = oppositeVersor.getCoordinate(0) * nodeOrientationFromReq.getCoordinate(0) + oppositeVersor.getCoordinate(1) * nodeOrientationFromReq.getCoordinate(1); if (scalarProductResult2 <= 0) { return (nodePos.getDistanceTo(requestedPos) < node.getRadius() + nodeToMove.getRadius()) && scalarProductResult1 >= 0; } return scalarProductResult1 >= 0; }