Вывести экспоненциальное значение из индекса l oop - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть коллекция объектов, которые будут анимироваться на экране. Я хочу, чтобы случайная задержка каждой анимации постепенно увеличивалась в зависимости от того, где находится элемент в коллекции.

В настоящий момент я могу сделать это довольно легко линейно, как это происходит (Swift).

let proportionThroughContents = CGFloat(Double(idx) / Double(allNodes.count))
let delayRandomiserBaseValue: CGFloat = 40
let delayRandomiserGrowthValue: CGFloat = 60
let delayRandomiserValue = UInt32(delayRandomiserBaseValue + (delayRandomiserGrowthValue * proportionThroughContents))

Я на самом деле хочу, чтобы какая-то математическая функция дала мне эффект хоккейной клюшки, когда предметы в середине все еще имеют низкие значения, но предметы в самом конце получают гораздо более высокие значения.

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

1 Ответ

0 голосов
/ 01 февраля 2020

Есть много возможных вариантов. Самым простым, вероятно, является квадратичный c, такой как x^2 + b x + c, где x - ваша пропорция, а a, b, c - соответствующие константы. В коде вам нужно написать это как a*x*x + b*x + c.

Для истинных экспоненциальных функций вы хотите k exp(l x) в коде k * Math.exp(l*x).

Выбор констант - самый сложный момент. Чтобы получить одинаковые начальные ставки для квадратиков c, просто выберите b = delayRandomiserGrowthValue и c = delayRandomiserBaseValue. Затем вы можете выбрать значение a в зависимости от того, как долго вы задерживаетесь. a + b + c даст вам максимальную задержку.

let proportionThroughContents = CGFloat(Double(idx) / Double(allNodes.count))
let delayRandomiserBaseValue: CGFloat = 40           // c
let delayRandomiserGrowthValue: CGFloat = 60         // b
let delayRandomiserQuadraticValue: CGFloat = 60      // a
let delayRandomiserValue = UInt32(delayRandomiserBaseValue
       + delayRandomiserGrowthValue * proportionThroughContents 
       + delayRandomiserQuadraticValue * proportionThroughContents * proportionThroughContents  )

Для экспоненты k - начальное значение, а l*k - начальная скорость роста. Окончательная задержка будет k e^l.

let proportionThroughContents = CGFloat(Double(idx) / Double(allNodes.count))
let delayRandomiserBaseValue: CGFloat = 40           // k
let delayRandomiserGrowthValue: CGFloat = 60         // 
let l: CGFloat = delayRandomiserGrowthValue / delayRandomiserBaseValue  // l
let delayRandomiserValue = UInt32(delayRandomiserBaseValue * Math.exp(l*proportionThroughContents))

При этих значениях l = 60/40 = 1.5 максимальная задержка будет 40*exp(1.5) = 179.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...