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); } }
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); } }
/// <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); }
/// <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); } }