2015-09-02 11 views
5

Vorrei una funzione per calcolare la durata di un'animazione in modo tale che anche quando la distanza cambia, la velocità rimane costante.Durata di attenuazione calcolata in funzione della distanza

==================================== 
|         | 
|<============ width =============>| 
|         | 
|   <====== distance1 ======>| 
|         | 
|    <=== distance2 ===>| 
|         | 
=================================== 

Questo è banale da realizzare quando si tratta di allentamento lineare,

function getDuration (width, distance, duration) { 
    return duration * (1 - distance/width); 
} 

Tuttavia, questo diventa molto più complesso quando si utilizza non lineare funzioni di andamento, come easeInOutQuad (Un esempio di questo problema: http://jsfiddle.net/Wexcode/rdrbm8et/3/).

Dato una funzione di andamento, come ad esempio easeInOutQuad, come si calcola la durata in modo che la velocità per qualsiasi distanza rimanga costante?

easeInOutQuad: function (t) { return t<.5 ? 2*t*t : -1+(4-2*t)*t }, 

Fonte: https://gist.github.com/gre/1650294

easeInOutQuad

Fonte: http://api.jqueryui.com/easings/

+0

guardando da un punto di vista matematico, si dovrebbe differenziare la curva? Domanda interessante :) +1 –

+0

Prova la registrazione facilita in Excel, guarda cosa puoi trovare. Forse puoi mettere insieme una formula: D Ecco come ho risolto la mia domanda ruotando la saturazione del colore in RGB. –

+0

Non capisco esattamente cosa stai chiedendo. Se hai un andamento non lineare, la velocità non è costante. Quindi * quale * velocità vuoi rimanere costante quando cambi la distanza? – Bergi

risposta

0

Si dovrebbe utilizzare alcuni matematica avanzata per la lunghezza calcolare dell'arco generato dalla formula.

Una buona spiegazione è here. Si dovrebbe usare sotto formula

enter image description here

+0

il vero problema è, come si fa una differenziazione in js. non è come se esistesse un metodo 'Math.ddx()'. Comunque, ho trovato questo sito, potrebbe essere utile: http://oldhorse.hubpages.com/hub/drawing-calculus-numberical-integration-and-differentiation-in-javascript-part-6-in-a-series –

+0

Se la funzione è stata definita 'easeInOutQuad: function (t) {return t <.5? 2 * t * t: -1+ (4-2 * t) * t}, 'è possibile calcolare la differenziazione su carta e utilizzare solo la formula che si ottiene da quello – suvroc

+0

Ma OP ovviamente voleva calcolare la facilità variabile. Altrimenti, l'OP non avrebbe chiesto. –

1

Data una funzione y = f(t), dove y è la distanza e t è il tempo semplicemente risolvere per donna, e utilizzare la funzione t = g(y) per determinare il tempo necessario per arrivare a un data la distanza.

Ad esempio, nel easeInOutQuad easing, -1+(4-2*t)*t possono essere risolti:

Solved equation

Fonte: http://www.wolframalpha.com/input/?i=Solve%28y+%3D+-1%2B%284-2*t%29*t%2C+t%29

In pratica, si dovrebbe moltiplicare t volte la duration per ottenere la vostra nuova durata.

var ratio = distance/width; 
if (ratio <= .5) { 
    return duration * Math.sqrt(ratio * 1/2); 
} else if (ratio <= 1) { 
    return duration * (1 - Math.sqrt(1-ratio)/Math.sqrt(2)); 
} 

http://jsfiddle.net/Wexcode/rdrbm8et/6/

+0

Ah, intendevi ridimensionarlo in modo tale che una certa distanza venga raggiunta in un dato momento. – Bergi

Problemi correlati