Пример #1
0
        /// <summary>
        /// Create Quadrilateral.
        /// </summary>
        /// <param name="a">Lenth of side a.</param>
        /// <param name="b">Lenth of side b.</param>
        /// <param name="ad">AD angle in degrees.</param>
        /// <param name="ba">BA angle in degrees.</param>
        /// <returns>New quadrilateral.</returns>
        public static Quadrilateral WithTwoSidesTwoAngles(double a, double b, double ad, double ba)
        {
            Checks.GreaterThanZero(a, nameof(a));
            Checks.GreaterThanZero(b, nameof(b));
            Checks.Between(ad, 0, 360, nameof(ad));
            Checks.Between(ba, 0, 360, nameof(ba));

            var quad = new Quadrilateral();

            quad.SideA   = a;
            quad.SideB   = b;
            quad.AngleAD = ad;
            quad.AngleBA = ba;

            quad.AngleCB = 270 - quad.AngleAD - quad.AngleBA;
            var bx = Triangle.Right.Opposite(quad.SideB, quad.AngleCB);
            var by = Triangle.Right.Side(quad.SideB, bx);
            var ay = Triangle.Right.Opposite(quad.SideA, quad.AngleAD);

            quad.SideC = Quadrilateral.CalculateC(quad.AngleCB, ay, by);
            var ax = Triangle.Right.Side(quad.SideA, ay);

            quad.SideD = Quadrilateral.CalculateD(quad.AngleAD, ax, bx);

            return(quad);
        }
Пример #2
0
            /// <summary>
            /// Calculate opposite from hypotenuse and angle.
            /// https://keisan.casio.com/exec/system/1273849674.
            /// </summary>
            /// <param name="hypotenuse">Hypotenuse length.</param>
            /// <param name="angle">Angle in degrees.</param>
            /// <returns>Opposite length.</returns>
            public static double Base(double hypotenuse, double angle)
            {
                Checks.GreaterThanZero(hypotenuse, nameof(hypotenuse));
                Checks.Between(angle, -360, 360, nameof(angle));

                var baseSide = hypotenuse * Math.Cos(Converter.DegreesToRadians(angle));

                return(baseSide);
            }
Пример #3
0
            /// <summary>
            /// Calculate opposite from hypotenuse and angle.
            /// https://keisan.casio.com/exec/system/1273849674.
            /// </summary>
            /// <param name="hypotenuse">Hypotenuse length.</param>
            /// <param name="angle">Angle in degrees.</param>
            /// <returns>Opposite length.</returns>
            public static double Opposite(double hypotenuse, double angle)
            {
                Checks.GreaterThanZero(hypotenuse, nameof(hypotenuse));
                Checks.Between(angle, -360, 360, nameof(angle));

                var opposite = hypotenuse * Math.Sin(Converter.DegreesToRadians(angle));

                return(opposite);
            }
Пример #4
0
        /// <summary>
        /// Calculates opposite side when angle and two sides are known.
        /// </summary>
        /// <param name="sideA">Side length.</param>
        /// <param name="sideB">Side length.</param>
        /// <param name="angle">Angle in degrees.</param>
        /// <returns>Opposite side to an angle length.</returns>
        public static double Opposite(double sideA, double sideB, double angle)
        {
            Checks.GreaterThanZero(sideA, nameof(sideA));
            Checks.GreaterThanZero(sideB, nameof(sideB));
            Checks.Between(angle, 0, 180, nameof(angle));

            var opposite = Math.Sqrt(sideA * sideA + sideB * sideB - 2 * sideA * sideB * Math.Cos(Converter.DegreesToRadians(angle)));

            return(opposite);
        }
Пример #5
0
        /// <summary>
        /// Calculate d side.
        /// </summary>
        /// <param name="ad">AD angle in degrees.</param>
        /// <param name="ax">Lenth of side a_x.</param>
        /// <param name="bx">Lenth of side b_x.</param>
        /// <returns></returns>
        private static double CalculateD(double ad, double ax, double bx)
        {
            Checks.Between(ad, -90, 180, nameof(ad));
            Checks.GreaterThanZero(ax, nameof(ax));
            Checks.GreaterThanZero(bx, nameof(bx));

            if (ad < 90)
            {
                var d = bx + ax;
                return(Math.Abs(d));
            }
            else if (ad == 90)
            {
                var d = bx;
                return(Math.Abs(d));
            }
            else // alpha > 90
            {
                var d = bx - ax;
                return(Math.Abs(d));
            }
        }
Пример #6
0
        /// <summary>
        /// Calculate c side.
        /// </summary>
        /// <param name="cb">CB angle in degrees.</param>
        /// <param name="ay">Lenth of side a_y.</param>
        /// <param name="by">Lenth of side b_y.</param>
        /// <returns></returns>
        private static double CalculateC(double cb, double ay, double by)
        {
            Checks.Between(cb, -90, 180, nameof(cb));
            Checks.GreaterThanZero(ay, nameof(ay));
            Checks.GreaterThanZero(by, nameof(by));

            if (cb < 90)
            {
                var c = ay + by;
                return(Math.Abs(c));
            }
            else if (cb == 90)
            {
                var c = ay;
                return(Math.Abs(c));
            }
            else // beta > 90
            {
                var c = ay - by;
                return(Math.Abs(c));
            }
        }