package cz.agents.agentpolis.darptestbed.siminfrastructure.request.generator.support;
import org.apache.commons.math3.distribution.NormalDistribution;
import org.apache.commons.math3.random.Well19937c;
import cz.agents.agentpolis.darptestbed.siminfrastructure.request.generator.support.GPSPositionGeneratorImpl.LatGeneratorItem;
import cz.agents.agentpolis.darptestbed.siminfrastructure.request.generator.support.GPSPositionGeneratorImpl.LonGeneratorItem;
public class GPSPositionGeneratorWithNormalDistributionFactory implements GPSPositionGeneratorFactory {
private static final double DEVIDE_TO_MIDDLE = 2.0;
private static final double REDUCE_SD_TO_GET_MORE_NORL = 4.0;
private final int seed;
public GPSPositionGeneratorWithNormalDistributionFactory(int seed) {
super();
this.seed = seed;
}
@Override
public GPSPositionGenerator createGPSPositionGenerator(double minLon, double minLat, double maxLon, double maxLat) {
double exLon = minLon + (Math.abs(maxLon - minLon) / DEVIDE_TO_MIDDLE);
double exLat = minLat + (Math.abs(maxLat - minLat) / DEVIDE_TO_MIDDLE);
double sdLon = Math.abs(maxLon - exLon) / REDUCE_SD_TO_GET_MORE_NORL;
double sdLat = Math.abs(maxLat - exLat) / REDUCE_SD_TO_GET_MORE_NORL;
LonGeneratorItem lonGeneratorData = new LonGeneratorItem(new NormalDistribution(new Well19937c(seed), exLon,
sdLon, NormalDistribution.DEFAULT_INVERSE_ABSOLUTE_ACCURACY), minLon, maxLon);
LatGeneratorItem latGeneratorData = new LatGeneratorItem(new NormalDistribution(new Well19937c(
Integer.MAX_VALUE - seed), exLat, sdLat, NormalDistribution.DEFAULT_INVERSE_ABSOLUTE_ACCURACY), minLat,
maxLat);
return new GPSPositionGeneratorImpl(latGeneratorData, lonGeneratorData);
}
}