Beispiel #1
0
            /// <summary>
            /// Draws line from the initial or last drawn point.
            /// </summary>
            /// <param name="d">Distance</param>
            /// <param name="bearingChange">Bearing change in degrees</param>
            /// <example>
            /// The following example draws a 5 km square in the USA.
            /// <code>
            /// //Create a coordinate with EagerLoading off for efficiency during drawing.
            /// Coordinate c = new Coordinate(31.65, -84.02, new EagerLoad(false));
            ///
            /// //Create the GeoFence Drawer, specifying an ellipsoidal earth
            /// //shape with a start bearing / direction faced of 0 degrees.
            /// GeoFence.Drawer gd = new GeoFence.Drawer(c, Shape.Ellipsoid, 0);
            ///
            /// //Draw the first line using the initial bearing (0 means no change in heading)
            /// gd.Draw(new Distance(5), 0);
            /// //Draw the next to line by changing 90 degrees at each point.
            /// gd.Draw(new Distance(5), 90);
            /// gd.Draw(new Distance(5), 90);
            /// //Close the shape by drawing from the line end point to the initial coordinate.
            /// gd.Close();
            /// </code>
            /// </example>
            public void Draw(Distance d, double bearingChange)
            {
                //Store reference point for reverse bearing lookup
                referenceCoordinate = new Coordinate(initialCoordinate.Latitude.ToDouble(), initialCoordinate.Longitude.ToDouble(), new EagerLoad(false));

                //Get new bearing
                //This formula will account for bearing changes of distance and offset the next movement
                bearing = (finalBearing - bearing + bearing + bearingChange) % 360;
                initialCoordinate.Move(d, bearing, shape);
                finalBearing = (new Distance(initialCoordinate, referenceCoordinate, shape).Bearing + 180) % 360;

                Coordinate nc = new Coordinate(initialCoordinate.Latitude.ToDouble(), initialCoordinate.Longitude.ToDouble(), initialCoordinate.GeoDate, initialCoordinate.EagerLoadSettings);

                nc.equatorial_radius  = initialCoordinate.equatorial_radius;
                nc.inverse_flattening = initialCoordinate.inverse_flattening;

                points.Add(nc);
            }