/// <summary> /// Gets new collection of coordinated for a circle in a given coordinate space, size and precision. /// </summary> /// <param name="centroid">Center point.</param> /// <param name="radius">Radius in kilometers for the Earth space or in pixels for the Device space.</param> /// <param name="numberOfPoints">Precision as a number of circle contour points.</param> /// <returns>A list of <see cref="ISimpleCoordinate"/>.</returns> static IList <ISimpleCoordinate> GetCircleCoordinates(ISimpleCoordinate centroid, double radius, int numberOfPoints) { IList <ISimpleCoordinate> circleCoordinates = new List <ISimpleCoordinate>(); // Draw a circular zone. double pointAngle = Math.PI / numberOfPoints * 2; // Radius in degrees along latitude or longitude at Equator; // 20037 = Half of EarthDistance along the equator in kilometers radius /= 20037.707072954225 / 180; for (int i = 0; i < numberOfPoints; i++) { float y = (float)(Math.Cos(i * pointAngle) * radius + centroid.Y); float xOffset = (float)(Math.Sin(i * pointAngle) * radius); // Mind that we are not at Equator. xOffset = (float)(xOffset / Math.Abs(Math.Cos(y * Math.PI / 180))); float x = xOffset + (float)centroid.X; circleCoordinates.Add(new Coordinate(x, y)); } return(circleCoordinates); }
/// <summary> /// Gets the distance squared between 2 points. /// </summary> /// <param name="source">The source.</param> /// <param name="destination">The destination.</param> /// <returns>distance</returns> static double GetDistanceSquared(ISimpleCoordinate source, ISimpleCoordinate destination) => (destination.X - source.X) * (destination.X - source.X) + (destination.Y - source.Y) * (destination.Y - source.Y);