Как построить плавно возрастающий график?

Хочу сгенерировать данные для построения графика следующего вида:

График

Область 1 и 3 я легко строю, а вот область 2 не могу правильно построить. Мой алгоритм построения участка 2 сводится к следующему:

зная уравнение прямой y = ax + b я плавно изменяю коэффициент a от 0 до нужного мне значения, соответствующего заданному углу наклона прямой (участок 3).

Получился такой метод:

private static void FillAsRiseLine(double[] data, int from, int to, double fromA, double toA, double deviation)
{
    var a = fromA;
    var stepA = (toA - fromA) / (to - from);

    for (var x = from; x <= to; x++)
    {
        var b = data[from] - a * from;
        data[x] = x * a + GetRandDouble(b - deviation, b + deviation);
        a += stepA;
    }
}

Все вроде бы хорошо, но график выглядит не так, как хотелось. Ниже выводится полученный результат (красный пунктир - это для наглядности добавил):

введите сюда описание изображения

Как видно, наклон кривой участка №2 стал слишком большим. И теперь я в тупике и ищу помощи тех, кто хорошо разбирается в геометрии. Как можно построить участок №2 таким образом, чтобы кривая на выходе имела угол наклона равный углу наклон прямой участка №3?

UPD. Суть вопроса в следующем: как, зная:

  1. точку начала кривой (x1, y1)
  2. значение производной в точке (x1, y1) = 0
  3. координату x2 точки, где кривая должна заканчиваться
  4. значение производной кривой в точке x2

построить плавно возрастающую кривую?


Ответы (2 шт):

Автор решения: Aziz Umarov

Нужно вписать часть окружности в угол образованный из двух прямых так чтобы эти прямые оказались касательными к окружности. Тогда и будет у вас будет плавный переход.

Обновлено. Можно также использовать кривые Безье

→ Ссылка
Автор решения: Harry

Если из самого условия не следует что-то получше, можно воспользоваться кубическим полиномом

введите сюда описание изображения

Далее мы просто подставляем значения переменных и получаем

введите сюда описание изображения

Далее просто решаем эту систему уравнений - численно, или аналитически - например, с помощью Wolfram Mathematica

введите сюда описание изображения

(простите уж, переводить в красивые формулы не стану... думаю, вы и сами сможете перевести, если нужно будет), а потом по этой формуле просчитать с тем шагом x, который вам нужен, значения y...

→ Ссылка