/// <summary>
        ///     Gets the possible sides for the given label and the given derivative point.
        /// </summary>
        /// <returns>An enumeration of the possible sides (-1 or 1).</returns>
        static double[] GetPossibleSides(Label.PlacementSide side, Point derivative)
        {
            if (derivative.Length == 0)
            {
                side = Label.PlacementSide.Any;
            }

            switch (side)
            {
            case Label.PlacementSide.Port:
                return(new double[] { -1 });

            case Label.PlacementSide.Starboard:
                return(new double[] { 1 });

            case Label.PlacementSide.Top:
                if (ApproximateComparer.Close(derivative.X, 0))
                {
                    // If the line is vertical, Top becomes Left
                    return(GetPossibleSides(Label.PlacementSide.Left, derivative));
                }
                return(new double[] { derivative.X < 0 ? 1 : -1 });

            case Label.PlacementSide.Bottom:
                if (ApproximateComparer.Close(derivative.X, 0))
                {
                    // If the line is vertical, Bottom becomes Right
                    return(GetPossibleSides(Label.PlacementSide.Right, derivative));
                }
                return(new double[] { derivative.X < 0 ? -1 : 1 });

            case Label.PlacementSide.Left:
                if (ApproximateComparer.Close(derivative.Y, 0))
                {
                    // If the line is horizontal, Left becomes Top
                    return(GetPossibleSides(Label.PlacementSide.Top, derivative));
                }
                return(new double[] { derivative.Y < 0 ? -1 : 1 });

            case Label.PlacementSide.Right:
                if (ApproximateComparer.Close(derivative.Y, 0))
                {
                    // If the line is horizontal, Right becomes Bottom
                    return(GetPossibleSides(Label.PlacementSide.Bottom, derivative));
                }
                return(new double[] { derivative.Y < 0 ? 1 : -1 });

            default:
                return(new double[] { -1, 1 });
            }
        }
        private static IEnumerable <double> GetPossibleSides(Label.PlacementSide side, Point derivative)
        {
            MethodInfo methodInfo = typeof(EdgeLabelPlacement).GetMethod("GetPossibleSides", BindingFlags.Static | BindingFlags.NonPublic);

            return((IEnumerable <double>)methodInfo.Invoke(null, new object[] { side, derivative }));
        }