2012-06-13 3 views
4

Я хочу, чтобы функция ослабления была эквивалентна UIViewAnimationCurveEaseInOut, но не вижу, что Apple раскрывает это как функцию.Функция Ease-In Ease-Out

Я пробовал the easeInOutQuad function posted here без успеха. Моя Objective-C версия этой функции:

-(float) getEaseInOutValueWithElapsedMillis: (float) t startValue: (float) b endValue: (float) c andTotalMillis: (float) d { 
    float value =0.0f; 

    if ((t/=d/2.0f) <1.0f) 
     value =c/2.0f*t*t + b; 
    else 
     value =-c/2.0f * ((--t)*(t-2.0f) - 1.0f) + b; 

    debug(@"t=%f b=%f c=%f d=%f value=%f", t, b, c, d, value); 
    return value; 
} 

И регистрируемые результаты:

Когда начальное значение меньше конечного значения:

t=0.066467 b=110.000000 c=225.000000 d=500.000000 value=110.497017 
t=0.133133 b=110.000000 c=225.000000 d=500.000000 value=111.993996 
t=0.199799 b=110.000000 c=225.000000 d=500.000000 value=114.490944 
... 
t=0.999786 b=110.000000 c=225.000000 d=500.000000 value=222.451935 
t=0.066452 b=110.000000 c=225.000000 d=500.000000 value=236.954926 
t=0.133118 b=110.000000 c=225.000000 d=500.000000 value=250.457932 
... (note that value shot right past c) 
t=0.866440 b=110.000000 c=225.000000 d=500.000000 value=332.993195 
t=0.933105 b=110.000000 c=225.000000 d=500.000000 value=334.496582 
t=0.999771 b=110.000000 c=225.000000 d=500.000000 value=335.000000 

, а значение 100% заканчивается как b + c, а не c.

Когда начальное значение больше конечного значения:

t=0.047389 b=225.000000 c=110.000000 d=700.000000 value=225.123520 
t=0.095008 b=225.000000 c=110.000000 d=700.000000 value=225.496460 
... 
t=0.904504 b=225.000000 c=110.000000 d=700.000000 value=334.498413 
t=0.952122 b=225.000000 c=110.000000 d=700.000000 value=334.873932 
t=0.999740 b=225.000000 c=110.000000 d=700.000000 value=335.000000 

Опять же, значение 100% заканчивается как Ь + с, а не с.

Возможно, я исказил код. Как я могу достичь надлежащей легкости в облегчении?

+0

Есть ли у JavaScript одинаковый приоритет оператора как C? Я начну с распаковки некоторых из этих вычислений в промежуточные значения и покроя некоторые круглые скобки вокруг. 'if ((t/= d/2))' просто грубо. –

+0

Хорошее предложение. Я не знаю, является ли приоритет операторов одинаковым для двух языков.Как бы то ни было, согласно зарегистрированному результату, t кажется правильным. – user371320

+0

Интересный факт. Спецификация языка ECMAScript, похоже, не упоминает приоритет оператора. – user371320

ответ

1

Немного поздно, но вот оно, быстро.

Выполнить это так, на игровых площадках:

import UIKit 

var sValue: CGFloat = 0 
var eValue: CGFloat = 100 
var tDuration: CGFloat = 100 
var eTime: CGFloat = 0 

var currentValue: CGFloat = 0 

func easeInOutQuad (percentComplete: CGFloat, elapsedTimeMs: CGFloat, startValue: CGFloat, endValue: CGFloat, totalDuration: CGFloat) -> CGFloat { 
    var newElapsedTimeMs = elapsedTimeMs 
    newElapsedTimeMs /= totalDuration/2 

    if newElapsedTimeMs < 1 { 
     return endValue/2*newElapsedTimeMs*newElapsedTimeMs + startValue 
    } 
    newElapsedTimeMs = newElapsedTimeMs - 1 
    return -endValue/2 * ((newElapsedTimeMs)*(newElapsedTimeMs-2) - 1) + startValue 
} 

for i in eTime...tDuration { 
    currentValue = easeInOutQuad(0, CGFloat(i), sValue, eValue, tDuration) 
} 
+0

не работает с быстрым 2.2 – brainray

1

Я хотел облегчаться функцию, эквивалентную UIViewAnimationCurveEaseInOut, но не видят, что компания Apple выставляет что как функция.

компании Apple выставляет CAMediaTimingFunction через [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut], на котором вы можете вызвать getControlPointAtIndex:values: получить контрольные точки. Вы узнаете, что это кубический безье с контрольными точками (0, 0), (0,42, 0), (0,58, 1), (1, 1).

Это дает вам функцию Безье f(n), которая изображает 2d-диаграмму value, вдоль y, против time, вдоль x. Поэтому, чтобы получить правильное значение, просто решите для n где x = time и считайте значение.

В частности, в этой функции:

f.x(n) = (1-n)^3 * 0 + 3(1-n)^2 * n * 0.42 + 3(1-n) * n^2 * 0.58 + n^3 * 1 
     = 3(1-n)^2 * n * 0.42 + 3(1-n) * n^2 * 0.58 + n^3 
     = 1.26(1 - 2n + n^2) * n + 1.74 (1 - n) * n^2 + n^3 
     = 1.26n - 2.52n^2 + 1.26n^3 + 1.74n^2 - 1.74n^3 + n^3 
     = 1.26n - 0.78n^2 + 0.52n^3 

(Отказ от ответственности: выписанного экспромтом, пожалуйста, проверьте)

Чтобы получить значение в момент времени 0,5, решения для п в:

0.5 = 1.26n - 0.78n^2 + 0.52n^3 

Затем подключите его к эквиваленту f.y(n). There's a formula to solve a cubic, но вхождение в это слегка связано с тем, чтобы (i) прочитать статью в Википедии и использовать формулу; или (ii) записать числовой решатель, например. путем двоичного поиска. Эта конкретная куба очень хорошо себя ведет, имея только одно решение за каждый раз.

Смежные вопросы