public Triangle(double side1, double side2, double side3, double angle3, TriangleDescriptors descriptors = TriangleDescriptors.None) : this() { Descriptors = descriptors; (AngleA, AngleB) = LawOfSines(SideC, AngleC, SideA, SideB, out double d); CircumcircleDiameter = d; Initialize(); }
/*[Flags] * private enum Sides * { * None, * SideA = 1, * SideB = 2, * SideC = 4 * }; * * [Flags] * private enum Angles * { * None, * AngleA = 1, * AngleB = 2, * AngleC = 4 * }; * * public Triangle( * Tuple<double, double, double> sides, * Tuple<Angle, Angle, Angle> angles, * TriangleDescriptors descriptors * ) { * Sides sidesUnavailable = Sides.None; * Angles anglesUnavailable = Angles.None; * int numSidesUnavailable = 0; * int numAnglesUnavailable = 0; * if (sides.Item1 <= 0) * { * sidesUnavailable |= Sides.SideA; ++numSidesUnavailable; * } * if (sides.Item2 <= 0) * { * sidesUnavailable |= Sides.SideB; ++numSidesUnavailable; * } * if (sides.Item3 <= 0) * { * sidesUnavailable |= Sides.SideC; ++numSidesUnavailable; * } * * if (angles.Item1.IsNull) * { * anglesUnavailable |= Angles.AngleA; ++numAnglesUnavailable; * } * if (angles.Item2.IsNull) * { * anglesUnavailable |= Angles.AngleB; ++numAnglesUnavailable; * } * if (angles.Item3.IsNull) * { * anglesUnavailable |= Angles.AngleC; ++numAnglesUnavailable; * } * * if (numSidesUnavailable == 0) * { * if (numAnglesUnavailable == ) * } * }*/ public Triangle(double side1, double side2, double angle3, TriangleDescriptors descriptors) : this( side1, side2, descriptors == TriangleDescriptors.Right ? Math.Sqrt((side1 * side1) + (side2 * side2)) : LawOfCosines(side1, side2, angle3), angle3, descriptors ) { }
private void Initialize() { if (Descriptors == TriangleDescriptors.None) { bool acute = true; foreach (var angle in new Angle[] { AngleA, AngleB, AngleC }) { if (angle.Degrees > 90) { acute = false; Descriptors |= TriangleDescriptors.Obtuse; } else if (angle.Degrees == 90) { acute = false; Descriptors |= TriangleDescriptors.Right; } } if (acute) { Descriptors |= TriangleDescriptors.Acute; } if (AngleA.Degrees == AngleB.Degrees || AngleB.Degrees == AngleC.Degrees || AngleC.Degrees == AngleA.Degrees) { if (AngleA.Degrees == AngleB.Degrees && AngleB.Degrees == AngleC.Degrees) { Descriptors |= TriangleDescriptors.Equilateral; } else { Descriptors |= TriangleDescriptors.Isoscoles; } } } Area = GetArea(SideA, SideB, SideC); CircumcircleDiameter = SideA / Math.Sin(AngleA.Radians); }