Пример #1
0
        public void RegionCoverageTest_Precision_6_7_8()
        {
            var area = new NarrowcastArea
            {
                BeginTimestamp = 0,
                EndTimestamp   = 1,
                RadiusMeters   = 1000,
            };

            {
                area.Location = new Coordinates {
                    Latitude = 40.99999, Longitude = -73.999999
                };
                var regions = RegionHelper.GetRegionsCoverage(area, 8).ToList();
                Assert.AreEqual(4, regions.Count);
            }

            {
                area.Location = new Coordinates {
                    Latitude = 40.99999, Longitude = -73.999999
                };
                var regions = RegionHelper.GetRegionsCoverage(area, 7).ToList();
                Assert.AreEqual(2, regions.Count);
            }

            {
                area.Location = new Coordinates {
                    Latitude = 40.99999, Longitude = -73.999999
                };
                var regions = RegionHelper.GetRegionsCoverage(area, 6).ToList();
                Assert.AreEqual(1, regions.Count);
            }
        }
Пример #2
0
        public void RegionCoverageTest_Precision1()
        {
            var area = new NarrowcastArea
            {
                BeginTimestamp = 0,
                EndTimestamp   = 1,
                RadiusMeters   = 1000,
            };

            int precision = 1;

            {
                area.Location = new Coordinates {
                    Latitude = 0.0001, Longitude = 0.0001
                };
                var regions = RegionHelper.GetRegionsCoverage(area, precision).ToList();
                Assert.AreEqual(1, regions.Count);
            }

            {
                area.Location = new Coordinates {
                    Latitude = 89.99999, Longitude = 0.0001
                };
                var regions = RegionHelper.GetRegionsCoverage(area, precision).ToList();
                Assert.AreEqual(2, regions.Count);
            }

            {
                area.Location = new Coordinates {
                    Latitude = -0.0001, Longitude = 179.99999
                };
                var regions = RegionHelper.GetRegionsCoverage(area, precision).ToList();
                Assert.AreEqual(2, regions.Count);
            }

            {
                area.Location = new Coordinates {
                    Latitude = -89.9999, Longitude = 0.0001
                };
                var regions = RegionHelper.GetRegionsCoverage(area, precision).ToList();
                Assert.AreEqual(2, regions.Count);
            }

            {
                area.Location = new Coordinates {
                    Latitude = -0.0001, Longitude = -179.99999
                };
                var regions = RegionHelper.GetRegionsCoverage(area, precision).ToList();
                Assert.AreEqual(2, regions.Count);
            }

            {
                area.Location = new Coordinates {
                    Latitude = 89.99999, Longitude = -179.99999
                };
                var regions = RegionHelper.GetRegionsCoverage(area, precision).ToList();
                Assert.AreEqual(3, regions.Count);
            }
        }
Пример #3
0
        /// <summary>
        /// Enumerates all <see cref="Region"/>s of given precision covering given areas/>
        /// </summary>
        /// <param name="area"><see cref="NarrowcastArea"/>s</param>
        /// <param name="precisionStart">Minimal precision. Any integer number</param>
        /// <param name="precisionEnd">Maximal precision. Any integer number larger than precisionStart</param>
        /// <returns>Collection of <see cref="Region"/>s</returns>

        public static IEnumerable <Region> GetRegionsCoverage(NarrowcastArea area, int precisionStart, int precisionEnd)
        {
            var result = new List <Region>();

            for (int p = precisionStart; p <= precisionEnd; ++p)
            {
                result.AddRange(GetRegionsCoverage(area, p));
            }
            return(result);
        }
Пример #4
0
        /// <summary>
        /// Enumerates all <see cref="Region"/>s of given precision covering given area/>
        /// Current implementation only returns single region associated with area center.
        /// Under assumption of radius of area to be significantly below precision resolution and usage of extension >= 1 in search,
        /// that is enough
        /// </summary>
        /// <param name="area"><see cref="NarrowcastArea"/></param>
        /// <param name="precision">Precision. Any integer number</param>
        /// <returns>Collection of <see cref="Region"/>s</returns>

        public static IEnumerable <Region> GetRegionsCoverage(NarrowcastArea area, int precision)
        {
            double latAbs  = Math.Abs(area.Location.Latitude);
            double lonAbs  = Math.Abs(area.Location.Longitude);
            int    latSign = Math.Sign(area.Location.Latitude);
            int    lonSign = Math.Sign(area.Location.Longitude);

            // Get connected regions from first quadrant
            var regionsPositive = GetRegionCoveragePositive(new Coordinates {
                Latitude = latAbs, Longitude = lonAbs
            }, area.RadiusMeters, precision);

            //returning them back to original quadrants
            foreach (var region in regionsPositive)
            {
                region.LatitudePrefix  *= latSign;
                region.LongitudePrefix *= lonSign;
                yield return(region);
            }
        }