Example #1
0
        /// <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);
        }
Example #2
0
        /// <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
                {
                    ;
                }
            }
        }