/// <summary> /// Метод для вычисления максимальных и минимальных значений осей R и U /// </summary> public void GetAxisScale() { try { var maxRealV = RVData.Select(item => item.CellVoltage).Max(); // получаем максимальное значение напряжения var minRealV = RVData.Where(item => // получаем минимальное значение напряжения, с условием, { // что ононе меньше 50% от максимального значения if (item.CellVoltage < maxRealV * 0.5) { return(false); } else { return(true); } }).Select(item => item.CellVoltage).Min(); var maxScaleV = maxRealV * 1.06; // добавляем к максимальному знач. напряж. 6% сверху var minScaleV = minRealV * 0.1; // "подрезаем" минимальное значение на 10% снизу var scaleRangeV = maxScaleV - minScaleV; // вычисляем отображаемый диапазон напряжения IntervalV = 0; // scaleRangeV / 10; // обнуляем за ненадобностью double maxScaleR = MaxScaleR; double minScaleR = MinScaleR; if (IsFixYRange.Equals(false)) { var maxRealR = RVData.Select(item => item.CellResistance).Max(); // получаем максимальное значение сопротивления (угла) var minRealR = RVData.Select(item => item.CellResistance).Min(); // получаем минимальное значение сопротивления (угла) minScaleR = minRealR > 0 ? minRealR * 0.3 : minRealR * 1.05; // "подрезаем" положительное минимальное значение на 30% снизу или // добавляем к отрицательному минимальному знач. 5% снизу if (maxRealR > 0) { if (minRealR > 0) { maxScaleR = maxRealR // подгоняем макс. положит. знач. сопрот. так, чтобы оно зизуально было меньше / ((minRealV - minScaleV) / scaleRangeV - 0.05); // мин. знач. напряж. на 5% от отображаемого диапазона или } else { maxScaleR = (maxRealR - minScaleR) // если мин. значение сопрот отрицательное, то подгоняем макс. знач. сопрот. так, / ((minRealV - minScaleV) / scaleRangeV - 0.05) // чтобы оно визуально было меньше мин. знач. напряж. на 5% от отображаемого диапазона или - Math.Abs(minScaleR); } } else { maxScaleR = Math.Abs(minScaleR * 0.12); // добавляем к отрицательному максимальному знач. 12% сверху } IntervalR = (maxScaleR - minScaleR) / 10; // вычисляем величину интервала между линиями сетки (10 линий сетки) } // Логика исключающая случаи, когда MaxScaleR(V) меньше MinScaleR(V) if (MinScaleR > maxScaleR || MinScaleV > maxScaleV) { MinScaleR = minScaleR; MaxScaleR = maxScaleR; MinScaleV = minScaleV; MaxScaleV = maxScaleV; } else { MaxScaleR = maxScaleR; MinScaleR = minScaleR; MaxScaleV = maxScaleV; MinScaleV = minScaleV; } // Задаем ширину графика, исходя из количества элементов (столбцов гистогрвммы) WidthOfChart = RVData.Count() * 50 + 120; // Но ширина графика не должна быть меньше 320 if (WidthOfChart <= 320) { WidthOfChart = 320; } } catch (Exception ex) { throw new Exception(ex.Message); } }
/// <summary> /// Метод для вычисления моды из выборки сопротивлений (+построение линии уровня (моды)) /// </summary> public void GetModa() { try { if (RVData.Count() > 1) { var minValue = RVData.Select(item => item.CellResistance).Min(); var maxValue = RVData.Select(item => item.CellResistance).Max(); int numOfIntervals = (int)Math.Round(1 + 3.322 * Math.Log10(RVData.Count())); var Interval = Math.Abs((maxValue - minValue) / numOfIntervals); if (Interval > Math.Abs(minValue) && 0 != minValue) { Interval = 0.1 * Math.Abs(minValue); numOfIntervals = (int)Math.Abs(Math.Round((maxValue - minValue) / Interval)); } var frequencyArray = Enumerable.Range(1, numOfIntervals).Select(i => { return(RVData.Select(item => item.CellResistance).ToList().FindAll(item => item >= (minValue + (Interval * (i - 1))) && item <= (minValue + (Interval * i))).Count()); }).ToArray(); var maxFreqIndex = frequencyArray.ToList().IndexOf(frequencyArray.Max()); var minLimitInterval = minValue + ((Interval * maxFreqIndex)); if (maxFreqIndex == 0) { var temp = frequencyArray.ToList(); temp.Insert(0, 0); frequencyArray = temp.ToArray(); maxFreqIndex++; } else { if (maxFreqIndex == frequencyArray.Count() - 1) { var temp = frequencyArray.ToList(); temp.Add(0); frequencyArray = temp.ToArray(); } } Moda = minLimitInterval + Interval * ((double)(frequencyArray[maxFreqIndex] - frequencyArray[maxFreqIndex - 1]) / (double)((frequencyArray[maxFreqIndex] - frequencyArray[maxFreqIndex - 1]) + (frequencyArray[maxFreqIndex] - frequencyArray[maxFreqIndex + 1]))); } else { Moda = RVData.Count == 0 ? 0 : RVData.Select(item => item.CellResistance).Max(); } LLPoint = RVData.Select(item => new LevelLinePoint() { PointX = item.CellName, PointY = Moda }).ToList(); } catch (Exception ex) { throw new Exception(ex.Message); } }