it.unibo.alchemist.model.linkingrules.ObstaclesBreakConnection Maven / Gradle / Ivy
Show all versions of alchemist-implementationbase Show documentation
/*
* Copyright (C) 2010-2023, Danilo Pianini and contributors
* listed, for each module, in the respective subproject's build.gradle.kts file.
*
* This file is part of Alchemist, and is distributed under the terms of the
* GNU General Public License, with a linking exception,
* as described in the file LICENSE in the Alchemist distribution's top directory.
*/
package it.unibo.alchemist.model.linkingrules;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import it.unibo.alchemist.model.neighborhoods.Neighborhoods;
import it.unibo.alchemist.model.Environment;
import it.unibo.alchemist.model.EnvironmentWithObstacles;
import it.unibo.alchemist.model.Neighborhood;
import it.unibo.alchemist.model.Node;
import it.unibo.alchemist.model.Position;
import it.unibo.alchemist.model.geometry.Vector;
/**
* Similar to {@link ConnectWithinDistance}, but if the environment has obstacles,
* the links are removed.
*
* @param position type
* @param concentration type
*/
public final class ObstaclesBreakConnection & Vector> extends ConnectWithinDistance {
private static final long serialVersionUID = -3279202906910960340L;
/**
* @param radius
* connection range
*/
public ObstaclesBreakConnection(final Double radius) {
super(radius);
}
@Override
public Neighborhood computeNeighborhood(final Node center, final Environment environment) {
Neighborhood normal = super.computeNeighborhood(center, environment);
if (!normal.isEmpty() && environment instanceof EnvironmentWithObstacles) {
final P centerPosition = environment.getPosition(center);
final EnvironmentWithObstacles, T, P> environmentWithObstacles =
(EnvironmentWithObstacles, T, P>) environment;
environmentWithObstacles.intersectsObstacle(
environmentWithObstacles.getPosition(center),
environmentWithObstacles.getPosition(center)
);
final Iterable> neighbors = StreamSupport.stream(normal.spliterator(), false)
.filter(node -> !environmentWithObstacles
.intersectsObstacle(centerPosition, environmentWithObstacles.getPosition(node))
).collect(Collectors.toList());
normal = Neighborhoods.make(environmentWithObstacles, center, neighbors);
}
return normal;
}
}