Advertisement
eLVik

Plot Composition Formula

Nov 9th, 2021
770
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.48 KB | None | 0 0
  1.     public class FormulaElementWithoutAgeView
  2.     {
  3.         public short OrdinalNumber { get; set; }
  4.         public string Stock { get; set; }
  5.         public short Value { get; set; }
  6.         public double Delta { get; set; }
  7.     }
  8.  
  9.  
  10.  
  11. public class Utils
  12. {
  13.  
  14.         /// <summary>
  15.         /// Получение формула состава на делянку
  16.         /// </summary>
  17.         /// <param name="pineVolume">Объем сосны.</param>
  18.         /// <param name="firVolume">Объем ели.</param>
  19.         /// <param name="silverFirVolume">Объем пихты.</param>
  20.         /// <param name="larchVolume">Объем лиственницы.</param>
  21.         /// <param name="birchVolume">Объем березы.</param>
  22.         /// <param name="aspenVolume">Объем осины.</param>
  23.         /// <returns></returns>
  24.         public string GetCompositionFormula(double pineVolume, double firVolume, double silverFirVolume, double larchVolume, double birchVolume, double aspenVolume)
  25.         {
  26.             double totalVolume = pineVolume + firVolume + silverFirVolume + larchVolume + birchVolume + aspenVolume;
  27.             if (totalVolume == 0) return "---";
  28.             double pinePercent = pineVolume / totalVolume * 10;
  29.             double firPercent = firVolume / totalVolume * 10;
  30.             double silverFirPercent = silverFirVolume / totalVolume * 10;
  31.             double larchPercent = larchVolume / totalVolume * 10;
  32.             double birchPercent = birchVolume / totalVolume * 10;
  33.             double aspenPercent = aspenVolume / totalVolume * 10;
  34.  
  35.             string compositionFormula = String.Empty;
  36.             string compositionFormulaEnd = String.Empty;
  37.             List<FormulaElementWithoutAgeView> formula = new List<FormulaElementWithoutAgeView>();
  38.             #region Сосна
  39.             FormulaElementWithoutAgeView pElement = new FormulaElementWithoutAgeView();
  40.             pElement.OrdinalNumber = 1;
  41.             pElement.Stock = "С";
  42.             pElement.Value = Convert.ToInt16(Math.Round(pinePercent, 0));
  43.             pElement.Delta = pElement.Value - pinePercent;
  44.             formula.Add(pElement);
  45.             #endregion
  46.             #region Ель
  47.             FormulaElementWithoutAgeView fElement = new FormulaElementWithoutAgeView();
  48.             fElement.OrdinalNumber = 2;
  49.             fElement.Stock = "Е";
  50.             fElement.Value = Convert.ToInt16(Math.Round(firPercent, 0));
  51.             fElement.Delta = fElement.Value - firPercent;
  52.             formula.Add(fElement);
  53.             #endregion
  54.             #region Пихта
  55.             FormulaElementWithoutAgeView sfElement = new FormulaElementWithoutAgeView();
  56.             sfElement.OrdinalNumber = 3;
  57.             sfElement.Stock = "П";
  58.             sfElement.Value = Convert.ToInt16(Math.Round(silverFirPercent, 0));
  59.             sfElement.Delta = sfElement.Value - silverFirPercent;
  60.             formula.Add(sfElement);
  61.             #endregion
  62.             #region Лиственница
  63.             FormulaElementWithoutAgeView lElement = new FormulaElementWithoutAgeView();
  64.             lElement.OrdinalNumber = 4;
  65.             lElement.Stock = "Л";
  66.             lElement.Value = Convert.ToInt16(Math.Round(larchPercent, 0));
  67.             lElement.Delta = lElement.Value - larchPercent;
  68.             formula.Add(lElement);
  69.             #endregion
  70.             #region Береза
  71.             FormulaElementWithoutAgeView bElement = new FormulaElementWithoutAgeView();
  72.             bElement.OrdinalNumber = 5;
  73.             bElement.Stock = "Б";
  74.             bElement.Value = Convert.ToInt16(Math.Round(birchPercent, 0));
  75.             bElement.Delta = bElement.Value - birchPercent;
  76.             formula.Add(bElement);
  77.             #endregion
  78.             #region Осина
  79.             FormulaElementWithoutAgeView aElement = new FormulaElementWithoutAgeView();
  80.             aElement.OrdinalNumber = 6;
  81.             aElement.Stock = "Ос";
  82.             aElement.Value = Convert.ToInt16(Math.Round(aspenPercent, 0));
  83.             aElement.Delta = aElement.Value - aspenPercent;
  84.             formula.Add(aElement);
  85.             #endregion
  86.  
  87.             //Балансировка значений
  88.             if (formula.Sum(x => x.Value) != 10)
  89.             {
  90.                 switch (formula.Sum(x => x.Value))
  91.                 {
  92.                     case 11:
  93.                         formula = formula.Where(x => x.Value != 0).ToList();
  94.                         formula.OrderBy(x => x.Delta);
  95.                         formula[formula.Count - 1].Value -= 1;
  96.                         break;
  97.                     case 9:
  98.                         formula.OrderBy(x => x.Delta);
  99.                         formula[0].Value += 1;
  100.                         break;
  101.                 }
  102.             }
  103.  
  104.             //Составление формулы
  105.             for (int i = 1; i <= 6; i++)
  106.             {
  107.                 FormulaElementWithoutAgeView fe = formula.Where(x => x.OrdinalNumber == i).FirstOrDefault();
  108.                 if (fe == null) continue;
  109.                 if (fe.Value != 0) compositionFormula += String.Format("{0}{1}", fe.Value, fe.Stock);
  110.                 else
  111.                 {
  112.                     if (fe.Delta < 0 && fe.Delta >= -0.3) compositionFormulaEnd += String.Format("+ед.{0}", fe.Stock);
  113.                     else if (fe.Delta != 0) compositionFormulaEnd += String.Format("+{0}", fe.Stock);
  114.                 }
  115.             }
  116.             return compositionFormula + compositionFormulaEnd;
  117.         }
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement