Изменение значения по синусоиде с заданным углом
Есть формула для расчета координаты x. width - ширина экрана, а progressAnimation линейно меняется во времени от 0 до 1:
val x = width * progressAnimation
Необходимо доработать формулу так, чтобы x менялась не линейно, а по синусоиде, сперва медленно, затем быстрее к середине, а затем к конце снова медленнее.
val x = width * (0.5 * (1 - cos(progressAnimation * Math.PI)))
Но в данном случае скорость изменения x - как в графике синусоиды от 0 до 180 градусов, то есть такая:
А необходимо, чтобы x соответствовала синусоиде от 30 до 150 градусов:
Подскажите, пожалуйста, куда в мою формулу подставить эти данные, чтобы изменение учитывало это.
Ответы (1 шт):
Кинематика вашей задачи выглядит несложно. Вы знаете, как должна изменяться скорость. Тогда координата изменяется как интеграл от скорости.
Например, v(t) = A*sin(t), t \in [pi/6, 5pi/6]
, где A - амплитуда. Мы узнаем её из соотношения x(5pi/6) = width
Тогда x(t) = A*(-cos(t) + B), t \in [pi/6, 5pi/6]
. Слагаемое В узнаем из соотношения x(pi/6) = 0
Получаем:
B = cos(pi/6) = sqrt(3)/2
width = A*(sqrt(3)/2 - cos(5pi/6)) = A*sqrt(3)
, то естьA = width/sqrt(3)
Итого x(t) = width/sqrt(3)*(sqrt(3)/2 - cos(t)), t \in [pi/6, 5pi/6]
Если вам нужно пересчитать x
как функцию прогресса p
(меняется от 0 до 1), то нужно подставить t = pi/6 + p*2*pi/3