Accord.Math.Geometry.Line.GetAngleBetweenLines C# (CSharp) Method

GetAngleBetweenLines() public method

Calculate minimum angle between this line and the specified line measured in [0, 90] degrees range.
public GetAngleBetweenLines ( Line secondLine ) : float
secondLine Line The line to find angle between.
return float
        public float GetAngleBetweenLines(Line secondLine)
        {
            float k2 = secondLine.k;

            bool isVertical1 = IsVertical;
            bool isVertical2 = secondLine.IsVertical;

            // check if lines are parallel
            if ((k == k2) || (isVertical1 && isVertical2))
                return 0;

            float angle = 0;

            if ((!isVertical1) && (!isVertical2))
            {
                float tanPhi = ((k2 > k) ? (k2 - k) : (k - k2)) / (1 + k * k2);
                angle = (float)Math.Atan(tanPhi);
            }
            else
            {
                // one of the lines is parallel to Y axis

                if (isVertical1)
                {
                    angle = (float)(Math.PI / 2 - Math.Atan(k2) * Math.Sign(k2));
                }
                else
                {
                    angle = (float)(Math.PI / 2 - Math.Atan(k) * Math.Sign(k));
                }
            }

            // convert radians to degrees
            angle *= (float)(180.0 / Math.PI);

            if (angle < 0)
            {
                angle = -angle;
            }

            return angle;
        }

Usage Example

Example #1
0
        /// <summary>
        /// Calculate minimum angle between two lines measured in [0, 90] degrees range.
        /// </summary>
        ///
        /// <param name="a1">A point on the first line.</param>
        /// <param name="a2">Another point on the first line.</param>
        /// <param name="b1">A point on the second line.</param>
        /// <param name="b2">Another point on the second line.</param>
        ///
        /// <returns>Returns minimum angle between two lines.</returns>
        ///
        /// <remarks><para><note>It is preferred to use <see cref="Line.GetAngleBetweenLines"/> if it is required to calculate angle
        /// multiple times for one of the lines.</note></para></remarks>
        ///
        /// <exception cref="ArgumentException"><paramref name="a1"/> and <paramref name="a2"/> are the same,
        /// -OR- <paramref name="b1"/> and <paramref name="b2"/> are the same.</exception>
        ///
        public static float GetAngleBetweenLines(Point a1, Point a2, Point b1, Point b2)
        {
            Line line1 = Line.FromPoints(a1, a2);

            return(line1.GetAngleBetweenLines(Line.FromPoints(b1, b2)));
        }