示例#1
0
        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;
        }
示例#3
0
        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));
        }
示例#4
0
 protected bool Equals(SquareTile other)
 {
     return XSize.Equals(other.XSize);
 }
示例#5
0
 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));
 }