/// <summary> /// Найти ближайшие реперные (узловые) точки /// </summary> /// <param name="nameAlg">Наименование функции</param> /// <param name="x">Аргумент функции, относительно которой производится поиск</param> /// <param name="fRunk">Ранг аргумента</param> /// <returns>Массив точек</returns> private RangePOINT getNearby(string nameAlg, float x, FRUNK fRunk, ListLIMIT listLimit) { RangePOINT rangeRes = null; INDEX_NEAR indxNearby = INDEX_NEAR.UNKNOWN; //Получить диапазон аргументов, значений rangeRes = getRange(nameAlg, fRunk, listLimit); //Определитть порядок назначения ближайших соседних реперных точек if ((!(x < rangeRes.Left.X(fRunk))) && (!(x > rangeRes.Right.X(fRunk)))) { // точка внутри диапазона - использовать интерполяцию indxNearby = INDEX_NEAR.COUNT; } else // точка вне диапазона if (x < rangeRes.Left.X(fRunk)) { // точка "слева" от диапазона - требуется уточнение правой границы indxNearby = INDEX_NEAR.LEFT; // левая - не изменяется } else if (x > rangeRes.Right.X(fRunk)) { // точка "справа" от диапазона - требуется уточнение левой границы indxNearby = INDEX_NEAR.RIGHT; // правая - не изменяется } else { ; } //Назначить ближайшие соседние реперные точки if (indxNearby == INDEX_NEAR.COUNT) { // внутри диапазона interpolation(nameAlg, x, fRunk, ref rangeRes, listLimit); } else { // вне диапазона extrapolation(nameAlg, x, fRunk, ref rangeRes, indxNearby, listLimit); } return(rangeRes); }
/// <summary> /// Возвратить диапазон точек по указанному рангу аргумента (кол-во точек должно быть - не меньше 1-ой) /// </summary> /// <param name="nameAlg">Наименование функции</param> /// <param name="fRunk">Ранг аргумента</param> /// <returns>Массив точек</returns> private RangePOINT getRange(string nameAlg, FRUNK fRunk, ListLIMIT listLimit) { RangePOINT rangeRes = new RangePOINT(); //Результат float x = -1F //Аргумент функции , min = float.MaxValue, max = float.MinValue; foreach (POINT pt in m_dictValues[nameAlg]) { if (listLimit.IsAllowedPoint(pt) == true) { x = pt.X(fRunk); if (x < min) { min = x; rangeRes.Left = pt; } else { ; } if (x > max) { max = x; rangeRes.Right = pt; } else { ; } } else { ; } } return(rangeRes); }
/// <summary> /// Уточнить диапазон соседних реперных (узловых) точек к указанному значению аргумента /// </summary> /// <param name="nameAlg">Наименование функции</param> /// <param name="xValue">Значение аргумента</param> /// <param name="fRunk">Ранг аргумента</param> /// <param name="arNearby">Массив с реперными точками, требующий уточнения (приближение к значению)</param> /// <param name="indxConstNearby">Граница диапазона, остающейся постоянной</param> private void extrapolation(string nameAlg, float xValue, FRUNK fRunk, ref RangePOINT rangeNearby, INDEX_NEAR indxConstNearby, ListLIMIT listLimit) { float min = -1F, max = -1F , x = -1F; min = float.MaxValue; //rangeNearby.Left.X(fRunk); max = float.MinValue; //rangeNearby.Right.X(fRunk); foreach (POINT pt in m_dictValues[nameAlg]) { if (listLimit.IsAllowedPoint(pt) == true) { x = pt.X(fRunk); if (min == float.MaxValue) { min = x; rangeNearby.Left = pt; continue; } else { ; } if ((max == float.MinValue) && (!(min == x))) { max = x; rangeNearby.Right = pt; continue; } else { ; } if ((!(min == float.MaxValue)) && (!(max == float.MinValue))) { if ((Math.Abs(xValue - x) < Math.Abs(xValue - min)) && (!(x == max))) { if ((xValue - min) < (xValue - max)) { max = min; rangeNearby.Right = rangeNearby.Left; } else { ; } min = x; rangeNearby.Left = pt; } else { ; } } else if ((Math.Abs(xValue - x) < Math.Abs(xValue - max)) && (!(x == min))) { max = x; rangeNearby.Right = pt; } else { ; } } else { ; } } }
/// <summary> /// Уточнить диапазон соседних реперных (узловых) точек к указанному значению аргумента /// </summary> /// <param name="nameAlg">Наименование функции</param> /// <param name="xValue">Значение аргумента</param> /// <param name="fRunk">Ранг аргумента</param> /// <param name="arNearby">Массив с реперными точками, требующий уточнения (приближение к значению)</param> private void interpolation(string nameAlg, float xValue, FRUNK fRunk, ref RangePOINT rangeNearby, ListLIMIT listLimit) { float x = -1F , min = rangeNearby.Left.X(fRunk), max = rangeNearby.Right.X(fRunk); foreach (POINT pt in m_dictValues[nameAlg]) { if (listLimit.IsAllowedPoint(pt) == true) { x = pt.X(fRunk); if (((xValue - x) < (xValue - min)) && (!((xValue - x) < 0)) && (!(x == max))) { min = x; rangeNearby.Left = pt; continue; } else { ; } if (((x - xValue) < (max - xValue)) && (!((x - xValue) < 0)) && (!(x == min))) { max = x; rangeNearby.Right = pt; } else { ; } } else { ; } } }