public static void extrudeObstacleCluster(Cluster cluster, ObstacleExtrusionDistanceCalculator calculator)
{
ObstacleExtrusionDistanceCalculator nonNavigableCalculator = (p, h) -> calculator.computeExtrusionDistance(p, h) - NAV_TO_NON_NAV_DISTANCE;
ObstacleExtrusionDistanceCalculator navigableCalculator = calculator;
int numberOfExtrusionsAtEndpoints = 5;
switch (cluster.getType())
{
case LINE:
case MULTI_LINE:
cluster.addNonNavigableExtrusionsInLocal(extrudeMultiLine(cluster, nonNavigableCalculator, numberOfExtrusionsAtEndpoints));
cluster.addNavigableExtrusionsInLocal(extrudeMultiLine(cluster, navigableCalculator, numberOfExtrusionsAtEndpoints));
break;
case POLYGON:
boolean extrudeToTheLeft = cluster.getExtrusionSide() != ExtrusionSide.INSIDE;
try
{
cluster.addNonNavigableExtrusionsInLocal(extrudePolygon(extrudeToTheLeft, cluster, nonNavigableCalculator));
}
catch(Exception e)
{
e.printStackTrace();
return;
}
cluster.addNavigableExtrusionsInLocal(extrudePolygon(extrudeToTheLeft, cluster, navigableCalculator));
break;
default:
throw new RuntimeException("Unhandled cluster type: " + cluster.getType());
}
cluster.updateBoundingBox();
}