/// <summary>
        /// calculate the angle from the location to the "centre" of the racetrack
        /// </summary>
        /// <param name="location">location on the racetrack</param>
        /// <returns></returns>
        public double GetAngleToCentre(JLocation location)
        {
            if (location is null)
            {
                throw new ArgumentNullException(nameof(location));
            }

            double latDelta = location.Lat - Centre.Lat;
            double lonDelta = location.Lon - Centre.Lon;

            return(Math.Atan2(latDelta, lonDelta) * (180 / Math.PI));
        }
        /// <summary>
        /// Calculates the angle to a location taking into account a bendy bit of the track
        /// where all locations are adjusted to be equal
        /// </summary>
        /// <param name="location">the location</param>
        /// <returns>the angle to the location, adjusted if necessary for bendy bits of the track</returns>
        internal double GetAngleForPosition(JLocation location)
        {
            double angle = GetAngleToCentre(location);

            if (BendyBit[0] < angle && angle < BendyBit[1])
            {
                // position by angle is unreliable in the bendy bit of the track
                // so use the angle to the start for all cars on the bend(s)
                angle = BendyBit[0];
            }
            return(angle);
        }
 private RaceTrack(string name, JLocation centre, JLocation startFinish, JLocation[] bendyBit)
 {
     Name   = name;
     Centre = centre;
     // convert all other locations to angles relative to the centre
     BendyBit = new double[bendyBit.Length];
     for (int i = 0; i < bendyBit.Length; i++)
     {
         BendyBit[i] = GetAngleToCentre(bendyBit[i]);
     }
     StartFinishAngle = GetAngleToCentre(startFinish);
 }
 /// <summary>
 /// copy constructor
 /// </summary>
 /// <param name="location">location value</param>
 public JLocation(JLocation location)
     : this(location.Lat, location.Lon)
 {
 }