public static bool CollisionCheckWithCoin(this SquareTile square, double coinCenterX, double coinCenterY, double radius) { bool bIsCrossed = coinCenterX + radius > square.XSize || coinCenterY + radius > square.YSize || coinCenterX - radius < 0.0 || coinCenterY - radius < 0.0; return(bIsCrossed); }
public MCSimulationResults(long iteration, long numberOfHits, Coin coin, SquareTile squareTile, SamplingMethod samplingMethod) { if (iteration <= 0) { throw new ArgumentOutOfRangeException(nameof(iteration)); } if (numberOfHits <= 0) { throw new ArgumentOutOfRangeException(nameof(numberOfHits)); } Iteration = iteration; NumberOfHits = numberOfHits; Probability = (double)NumberOfHits / Iteration; Coin = coin; SquareTile = squareTile; SamplingMethod = samplingMethod; }
public void Run(Coin coin, SquareTile squareTile, SamplingMethod method) { if (coin == null) { throw new ArgumentNullException(nameof(coin)); } if (squareTile == null) { throw new ArgumentNullException(nameof(squareTile)); } var samplingEngine = Random2DEngineService.GetEngine(method); if (samplingEngine == null) { throw new ArgumentException("Sampling method cannot be found!"); } var samples = samplingEngine.GetDoubles().Take(this.SimulationSettings.NumberTrials); long nNumberOfHits = 0; long nIterations = 0; foreach (Tuple <double, double> xySample in samples) { ++nIterations; var coordinateOnSquareTile = squareTile.TransformCoordinates(xySample); var dX = coordinateOnSquareTile.Item1; var dY = coordinateOnSquareTile.Item2; if (squareTile.CollisionCheckWithCoin(dX, dY, coin.Radius)) { ++nNumberOfHits; if (nIterations % SimulationSettings.ReportEveryIteration == 0) { OnResultsUpdated(new MCSimulationResults(nIterations, nNumberOfHits, coin, squareTile, method)); } } } var probability = (double)nNumberOfHits / nIterations; OnFinished(new MCSimulationResults(nIterations, nNumberOfHits, coin, squareTile, method)); }
protected bool Equals(SquareTile other) { return XSize.Equals(other.XSize); }
public static Tuple <double, double> TransformCoordinates(this SquareTile square, Tuple <double, double> xy) { return(new Tuple <double, double>(square.XSize * xy.Item1, square.YSize * xy.Item2)); }