/// <summary>
 /// Инициализирует данные треугольника по массиву его сторон
 /// </summary>
 /// <param name="sides">Массив сторон треугольника</param>
 private void _InitTriangleData(double[] sides)
 {
     // сортируем стороны по длине
     Array.Sort(sides);
     // треугольник может быть равносторонним
     if (GeometryCalcs.TriangleIsEquilateral(sides[0], sides[1], sides[2]))
     {
         this.data = new EquilateralTriangleData(sides[0]);
     }
     // треугольник может быть прямоугольным (первые два элемента после сортировки — катеты)
     else if (GeometryCalcs.TriangleIsRightAngled(sides[0], sides[1], sides[2]))
     {
         this.data = new RightAngledTriangleData(sides[0], sides[1], sides[2]);
     }
     // обычный треугольник, задаваемый сторонами
     else
     {
         this.data = new SemiScaleneTriangleData(sides[0], sides[1], sides[2]);
     }
 }
 /// <summary>
 /// Инициализирует данные треугольника по массиву его сторон
 /// </summary>
 /// <param name="sides">Массив сторон треугольника</param>
 private void _InitTriangleData(double[] sides)
 {
     // сортируем стороны по длине
     Array.Sort(sides);
     // треугольник может быть равносторонним
     if (GeometryCalcs.TriangleIsEquilateral(sides[0], sides[1], sides[2]))
         this.data = new EquilateralTriangleData(sides[0]);
     // треугольник может быть прямоугольным (первые два элемента после сортировки — катеты)
     else if (GeometryCalcs.TriangleIsRightAngled(sides[0], sides[1], sides[2]))
         this.data = new RightAngledTriangleData(sides[0], sides[1], sides[2]);
     // обычный треугольник, задаваемый сторонами
     else
         this.data = new SemiScaleneTriangleData(sides[0], sides[1], sides[2]);
 }