Как построить плавно возрастающий график?
Хочу сгенерировать данные для построения графика следующего вида:
Область 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. Суть вопроса в следующем: как, зная:
- точку начала кривой (x1, y1)
- значение производной в точке (x1, y1) = 0
- координату x2 точки, где кривая должна заканчиваться
- значение производной кривой в точке x2
построить плавно возрастающую кривую?
Ответы (2 шт):
Нужно вписать часть окружности в угол образованный из двух прямых так чтобы эти прямые оказались касательными к окружности. Тогда и будет у вас будет плавный переход.
Обновлено. Можно также использовать кривые Безье
Если из самого условия не следует что-то получше, можно воспользоваться кубическим полиномом
Далее мы просто подставляем значения переменных и получаем
Далее просто решаем эту систему уравнений - численно, или аналитически - например, с помощью Wolfram Mathematica
(простите уж, переводить в красивые формулы не стану... думаю, вы и сами сможете перевести, если нужно будет), а потом по этой формуле просчитать с тем шагом x, который вам нужен, значения y...




