Пример #1
0
        private static List <double> GetResultBreakPoints(PiecewiseFunction f, PiecewiseFunction g)
        {
            // добавить обработку полюсов
            var fBreaks = f.GetBreakPoints();
            var gBreaks = g.GetBreakPoints();

            // вычисляем произведения точек разрыва, оставляем только уникальные
            var breakPointProducts = new List <double>();

            foreach (var fBreak in fBreaks)
            {
                foreach (var gBreak in gBreaks)
                {
                    var product = fBreak * gBreak;
                    if (!double.IsNaN(product) && !breakPointProducts.Contains(product)) // добавить проверку на мин. значение произведения
                    {
                        breakPointProducts.Add(product);
                    }
                }
            }

            breakPointProducts.Sort();

            return(breakPointProducts);
        }
        private static PiecewiseFunction GetSplittedPiecewiseFunction(PiecewiseFunction function)
        {
            var breaks = function.GetBreakPoints();

            // непонятное условие
            //if (breaks.First() > 0 || breaks.Last() < 0)
            //{
            //    return function;
            //}

            if (!breaks.Contains(0))
            {
                breaks.Add(0);
            }

            breaks.Sort();

            var index = breaks.IndexOf(0);

            if (index == breaks.Count - 2) // предпоследний
            {
                if (double.IsInfinity(breaks[index + 1]) && !breaks.Contains(-1))
                {
                    breaks.Add(-1);
                }
                else
                {
                    var valueToInsert = breaks[index + 1] / 2;
                    if (!breaks.Contains(valueToInsert))
                    {
                        breaks.Add(valueToInsert);
                    }
                }
            }

            if (index == 1) // второй
            {
                if (double.IsInfinity(breaks[index - 1]) && !breaks.Contains(-1))
                {
                    breaks.Add(-1);
                }
                else
                {
                    var valueToInsert = breaks[index - 1] / 2;
                    if (!breaks.Contains(valueToInsert))
                    {
                        breaks.Add(valueToInsert);
                    }
                }
            }

            breaks.Sort();

            return(function.SplitByPoints(breaks));
        }