/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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)); } }
/// <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)); } }