Изменение значения по синусоиде с заданным углом

Есть формула для расчета координаты 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 шт):

Автор решения: Pak Uula

Кинематика вашей задачи выглядит несложно. Вы знаете, как должна изменяться скорость. Тогда координата изменяется как интеграл от скорости.

Например, 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

график x при width = 1

→ Ссылка