public static ActivityFacilities createHexagonLayer(double minX, double minY, double maxX, double maxY, int maxDiameter_m) {
LOG.info("Start creating measure points on a hexagon pattern.");
double inRadius_m = Math.sqrt(3) / 4 * maxDiameter_m;
int skippedPoints = 0;
int setPoints = 0;
ActivityFacilitiesImpl measuringPoints = (ActivityFacilitiesImpl) FacilitiesUtils.createActivityFacilities("accessibility measuring points");
int columnNumber = 1;
for (double x = minX; x < (maxX - 1./2 * maxDiameter_m); x += (3./4 * maxDiameter_m)) {
for (double y = minY; y <= maxY; y += (2 * inRadius_m)) {
double centerX = x;
double centerY;
if (columnNumber % 2 != 0) {
centerY = y;
} else {
centerY = y + inRadius_m;
}
if (centerX <= maxX && centerX >= minX && centerY <= maxY && centerY >= minY) {
Coord center = new Coord(centerX, centerY);
measuringPoints.createAndAddFacility(Id.create(setPoints, ActivityFacility.class), center);
setPoints++;
}
else skippedPoints++;
}
columnNumber++;
}
LOG.info("Created " + setPoints + " inside the boundary. " + skippedPoints + " lie outside.");
LOG.info("Finished creating measure points on a hexagon pattern.");
return measuringPoints;
}