Example #1
0
        /// <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);
        }
Example #2
0
 /// <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);