public double CalculatePythagoras(DistancePoint point1, DistancePoint point2, MeasureUnit measureUnit)
        {
            var x = (DegreesToRadians(point2.Longitude) - DegreesToRadians(point1.Longitude)) *
                    Math.Cos((DegreesToRadians(point1.Latitude) + DegreesToRadians(point2.Latitude)) / 2);
            var y = DegreesToRadians(point2.Latitude) - DegreesToRadians(point1.Latitude);
            var d = Math.Sqrt(x * x + y * y) * GetEarthRadius(measureUnit);

            return(d);
        }
Exemple #2
0
        public void CalculateDistanceOnSamePointTest()
        {
            var point1 = new DistancePoint {
                Latitude = 1, Longitude = 1
            };
            var result = instanceUnderTest.CalculateDistance(point1, point1, MeasureUnit.Km, DistanceCalculationMethod.GeodesicCurve);

            Assert.AreEqual(0, result);
        }
Exemple #3
0
        public void SamePointCaseTest()
        {
            var point1 = new DistancePoint
            {
                Latitude  = 0,
                Longitude = 0
            };
            var result = instanceUnderTest.CalculateDistance(point1, point1, MeasureUnit.Km);

            Assert.AreEqual(0, result);
        }
        public double CalculateGeodesicCurve(DistancePoint point1, DistancePoint point2, MeasureUnit measureUnit)
        {
            var a    = Geodesics.Domain.Constants.Constants.PointOriginDegrees - point2.Latitude;
            var b    = Geodesics.Domain.Constants.Constants.PointOriginDegrees - point1.Latitude;
            var fi   = point1.Longitude - point2.Longitude;
            var cosP = Math.Cos(DegreesToRadians(a)) * Math.Cos(DegreesToRadians(b)) +
                       Math.Sin(DegreesToRadians(a)) * Math.Sin(DegreesToRadians(b)) * Math.Cos(DegreesToRadians(fi));
            var n = RadiansToDegrees(Math.Acos(cosP));
            var d = Math.PI * n * GetEarthRadius(measureUnit) / 180;

            return(d);
        }
Exemple #5
0
        public void GivenCaseTest()
        {
            var point1 = new DistancePoint {
                Latitude  = 53.297975,
                Longitude = -6.372663
            };
            var point2 = new DistancePoint {
                Latitude  = 41.385101,
                Longitude = -81.440440
            };
            var result = instanceUnderTest.CalculateDistance(point1, point2, MeasureUnit.Km);

            Assert.AreEqual(5536.338682266685, result);
        }
Exemple #6
0
        public void GenerateSDF(ref DistancePoint[,] grid)
        {
            //pass 0
            for (int y = 0; y < _height; y++)
            {
                for (int x = 0; x < _width; x++)
                {
                    DistancePoint p = grid[x, y];

                    Compare(ref grid, ref p, x, y, -1, 0);
                    Compare(ref grid, ref p, x, y, 0, -1);
                    Compare(ref grid, ref p, x, y, -1, -1);
                    Compare(ref grid, ref p, x, y, 1, -1);

                    grid[x, y] = p;
                }

                for (int x = _width - 1; x >= 0; x--)
                {
                    DistancePoint p = grid[x, y];
                    Compare(ref grid, ref p, x, y, 1, 0);
                    grid[x, y] = p;
                }
            }

            //pass 1
            for (int y = _height - 1; y >= 0; y--)
            {
                for (int x = _width - 1; x >= 0; x--)
                {
                    DistancePoint p = grid[x, y];

                    Compare(ref grid, ref p, x, y, 1, 0);
                    Compare(ref grid, ref p, x, y, 0, 1);
                    Compare(ref grid, ref p, x, y, -1, 1);
                    Compare(ref grid, ref p, x, y, 1, 1);

                    grid[x, y] = p;
                }

                for (int x = 0; x < _width; x++)
                {
                    DistancePoint p = grid[x, y];
                    Compare(ref grid, ref p, x, y, -1, 0);
                    grid[x, y] = p;
                }
            }
        }
Exemple #7
0
        public void GivenCaseInMilesTest()
        {
            var point1 = new DistancePoint
            {
                Latitude  = 53.297975,
                Longitude = -6.372663
            };
            var point2 = new DistancePoint
            {
                Latitude  = 41.385101,
                Longitude = -81.440440
            };
            var result = instanceUnderTest.CalculateDistance(point1, point2, MeasureUnit.Mile);

            Assert.AreEqual(Math.Round(5536.338682266685 * 0.62141), Math.Round(result));
        }
Exemple #8
0
        public void PythagorousCaseTest()
        {
            instanceUnderTest = new PythagorousDistanceCalculator();
            var point1 = new DistancePoint
            {
                Latitude  = 90,
                Longitude = 57.295779513082323
            };
            var point2 = new DistancePoint
            {
                Latitude  = -90,
                Longitude = 57.295779513082323
            };
            var result = instanceUnderTest.CalculateDistance(point1, point2, MeasureUnit.Km);

            Assert.AreEqual(Math.Round(20015.08), Math.Round(result));
        }
Exemple #9
0
        public void CalculateDistanceWithNoCalculatorsTest()
        {
            var point1 = new DistancePoint {
                Latitude = 1, Longitude = 1
            };
            var point2 = new DistancePoint {
                Latitude = 1, Longitude = 2
            };

            try
            {
                var result = instanceUnderTest.CalculateDistance(point1, point2, MeasureUnit.Km, DistanceCalculationMethod.GeodesicCurve);
            }
            catch (ArgumentNullException) {
                Assert.Pass();
            }
            Assert.Fail();
        }
Exemple #10
0
        public ActionResult <DistanceResponse> Get(DistanceCalculationMethod distanceMethod, MeasureUnit measureUnit,
                                                   [FromQuery][Range(-90, 90, ErrorMessage = "Must be in [-90, 90] interval")] double point1Latitude,
                                                   [FromQuery][Range(-180, 180, ErrorMessage = "Must be in [-180, 180] interval")] double point1Longitude,
                                                   [FromQuery][Range(-90, 90, ErrorMessage = "Must be in [-90, 90] interval")] double point2Latitude,
                                                   [FromQuery][Range(-180, 180, ErrorMessage = "Must be in [-180, 180] interval")] double point2Longitude)
        {
            var point1 = new DistancePoint
            {
                Latitude  = point1Latitude,
                Longitude = point1Longitude
            };
            var point2 = new DistancePoint
            {
                Latitude  = point2Latitude,
                Longitude = point2Longitude
            };

            return(new ActionResult <DistanceResponse>(new DistanceResponse
            {
                Distance = _distanceStrategy.CalculateDistance(point1, point2, measureUnit, distanceMethod)
            }));
        }
Exemple #11
0
        public void CalculateDistanceWithMatchingCalculatorTest()
        {
            //setup
            var point1 = new DistancePoint {
                Latitude = 1, Longitude = 1
            };
            var point2 = new DistancePoint {
                Latitude = 1, Longitude = 2
            };
            var inputList      = new List <IDistanceCalculator>();
            var mockCalculator = new Mock <IDistanceCalculator>();

            mockCalculator.Setup(x => x.DistanceCalculationMethod).Returns(DistanceCalculationMethod.GeodesicCurve);
            mockCalculator.Setup(x => x.CalculateDistance(point1, point2, MeasureUnit.Km)).Returns(1);
            inputList.Add(mockCalculator.Object);
            instanceUnderTest = new DistanceCalculationStrategy(inputList);

            //execution
            var result = instanceUnderTest.CalculateDistance(point1, point2, MeasureUnit.Km, DistanceCalculationMethod.GeodesicCurve);

            Assert.AreEqual(1, result);
        }
Exemple #12
0
        public void Compare(ref DistancePoint[,] grid, ref DistancePoint point, int x, int y, int offsetX, int offsetY)
        {
            DistancePoint other = new DistancePoint();

            if (x + offsetX > 0 && y + offsetY > 0 && x + offsetX < grid.GetLength(0) && y + offsetY < grid.GetLength(1))
            {
                other.dx = grid[x + offsetX, y + offsetY].dx + offsetX;
                other.dy = grid[x + offsetX, y + offsetY].dy + offsetY;
            }
            else
            {
                other = new DistancePoint()
                {
                    dx = infinity, dy = infinity
                };
            }

            if (other.distSq() < point.distSq())
            {
                point.dx = other.dx;
                point.dy = other.dy;
            }
        }
Exemple #13
0
        public ActionResult <DistanceResponse> Get([EnumDataType(typeof(DistanceMethod))] DistanceMethod distanceMethod, [EnumDataType(typeof(MeasureUnit))] MeasureUnit measureUnit,
                                                   [FromQuery][Required][Range(-90, 90)] double point1Latitude, [FromQuery][Required][Range(-180, 180)] double point1Longitude,
                                                   [FromQuery][Required][Range(-90, 90)] double point2Latitude, [FromQuery][Required][Range(-180, 180)] double point2Longitude)
        {
            //Validates the model
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            //Initialises the distance point values.
            var point1 = new DistancePoint(point1Latitude, point1Longitude);
            var point2 = new DistancePoint(point2Latitude, point2Longitude);


            //Gets the type of distance calculation method service from the factory
            var distanceCalculationMethod = _distanceCalculatorFactory.GetDistanceCalculationStrategy(distanceMethod);

            //Returns the response
            return(new ActionResult <DistanceResponse>(new DistanceResponse
            {
                Distance = distanceCalculationMethod.CalculateDistance(point1, point2, measureUnit)
            }));
        }