示例#1
0
        /// <summary>
        /// Create Quadrilateral.
        /// </summary>
        /// <param name="a">Lenth of side a.</param>
        /// <param name="b">Lenth of side b.</param>
        /// <param name="c">Lenth of side c.</param>
        /// <param name="d">Lenth of side d.</param>
        /// <returns>New quadrilateral.</returns>
        public static Quadrilateral WithFourSides(double a, double b, double c, double d)
        {
            Checks.GreaterThanZero(a, nameof(a));
            Checks.GreaterThanZero(b, nameof(b));
            Checks.GreaterThanZero(c, nameof(c));
            Checks.GreaterThanZero(d, nameof(d));

            var quad = new Quadrilateral();

            quad.SideA = a;
            quad.SideB = b;
            quad.SideC = c;
            quad.SideD = d;

            var e   = Triangle.Right.Hypotenuse(c, d);
            var ad1 = Converter.RadiansToDegrees(Math.Asin(c / e));
            var cb1 = 90 - ad1;
            var ad2 = Triangle.Angle(quad.SideA, e, quad.SideB);
            var cb2 = Triangle.Angle(quad.SideB, e, quad.SideA);

            quad.AngleAD = ad1 + ad2;
            quad.AngleCB = cb1 + cb2;
            quad.AngleBA = 270 - quad.AngleAD - quad.AngleCB;

            return(quad);
        }
示例#2
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);
        }
示例#3
0
            /// <summary>
            /// Calculates hypotenuse of right triangle from sides using Pythagorean theorem.
            /// https://en.wikipedia.org/wiki/Pythagorean_theorem.
            /// </summary>
            /// <param name="sideA">Opposite side length.</param>
            /// <param name="sideB">Side length.</param>
            /// <returns>Hypotenuse length.</returns>
            public static double Hypotenuse(double sideA, double sideB)
            {
                Checks.GreaterThanZero(sideA, nameof(sideA));
                Checks.GreaterThanZero(sideB, nameof(sideB));

                var hypotenuse = Math.Sqrt(sideA * sideA + sideB * sideB);

                return(hypotenuse);
            }
示例#4
0
            /// <summary>
            /// Calculates side of right triangle from hypotenuse and side using Pythagorean theorem.
            /// https://en.wikipedia.org/wiki/Pythagorean_theorem.
            /// </summary>
            /// <param name="hypotenuse">Hypotenuse length.</param>
            /// <param name="side">Adjacent side length.</param>
            /// <returns>Another side length.</returns>
            public static double Side(double hypotenuse, double side)
            {
                Checks.GreaterThanZero(hypotenuse, nameof(hypotenuse));
                Checks.GreaterThanZero(side, nameof(side));

                var anotherSide = Math.Sqrt(hypotenuse * hypotenuse - side * side);

                return(anotherSide);
            }
示例#5
0
            /// <summary>
            /// Calculate angle from hypotenuse and opposite.
            /// </summary>
            /// <param name="hypotenuse">Hypotenuse length.</param>
            /// <param name="opposite">Opposite length.</param>
            /// <returns>Angle in degrees.</returns>
            public static double Angle(double hypotenuse, double opposite)
            {
                Checks.GreaterThanZero(hypotenuse, nameof(hypotenuse));
                Checks.GreaterThanZero(hypotenuse, nameof(opposite));

                var angle = Converter.RadiansToDegrees(Math.Asin(hypotenuse / opposite));

                return(angle);
            }
示例#6
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);
            }
示例#7
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);
            }
示例#8
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);
        }
示例#9
0
        /// <summary>
        /// Calculates angle when all sides are known.
        /// </summary>
        /// <param name="sideA">Side length.</param>
        /// <param name="sideB">Side length.</param>
        /// <param name="opposite">Opposite side to an angle length.</param>
        /// <returns>Angle in degrees.</returns>
        public static double Angle(double sideA, double sideB, double opposite)
        {
            Checks.GreaterThanZero(sideA, nameof(sideA));
            Checks.GreaterThanZero(sideB, nameof(sideB));
            Checks.GreaterThanZero(opposite, nameof(opposite));

            var radians = Math.Acos((sideA * sideA + sideB * sideB - opposite * opposite) / (2 * sideA * sideB));
            var angle   = Converter.RadiansToDegrees(radians);

            return(angle);
        }
示例#10
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));
            }
        }
示例#11
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));
            }
        }