Entwickler-Ecke

Sonstiges (Delphi) - Ease-Out Algorithmus/Funktion gesucht


Ares - Mi 20.07.11 14:32
Titel: Ease-Out Algorithmus/Funktion gesucht
Hallo!

Ich bastel jetzt schon eine Ganze weile daran, und bekomme es einfach nicht vernünftig hin:
In einem Label wird ein Dezimalwert angezeigt (4 Nachkommastellen). Dieser soll nun auf einen neuen Wert geändert werden wobei die Änderung im Label angezeigt wird. Der aktuelle Wert soll also bis zum neuen Wert rauf oder runter gezählt werden. Das reine rauf oder runter Zählen ist mit hilfe eines Timers kein Problem.

Es sieht aber nicht schön aus, wenn "linear" gezählt wird, sich der Wert also in jedem Schritt um den gleichen Betrag ändert. Das Zählen zu verlangsamen, also die Abstände zwischen den Timeraufrufen zu verlängenr sieht ebenfalls nicht gut aus. Daher würde ich gerne einen "Ease-out" Effekt beim Zählen verwenden. Die Differenz zwischen neuem und aktuellem Wert soll also erst in sehr großen Schritten abnehmen und die Schritte dann immer kleiner werden. Egal wie groß die Differenz ist, die Änderung soll immer gleich lange dauern. Wie mache ich das?

Vor langer Zeit war ich gar nicht mal so schlecht in Mathe aber jetzt stelle ich fest, dass ich quasi nichts mehr kann :-)

Ich brauche also eien Funktion die zunächst schnell fällt und sich dann abflacht. Aber sah so eine Funktion noch mal aus? S-Funktionen, die also ein "Ease-Out" UND ein "Ease-In" haben, sind mir schon genug eingefallen. Aber ein reines Ease-Out will mir nicht gelingen.

Weiß jemand Hilfe?
Besten Dank
Ares

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Ach ja, die Funktion benötige ich in Delphi und dann auch in einem C# Programm. Ich kann also keine Funktionen verwenden die aus irgendeiner fertigen Bibliothek stammen (wie z.B. smoothstep bei Python).


Gammatester - Mi 20.07.11 14:47

user profile iconAres hat folgendes geschrieben Zum zitierten Posting springen:

Ich brauche also eien Funktion die zunächst schnell fällt und sich dann abflacht. Aber sah so eine Funktion noch mal aus?

Das ist alles ziemlich subjektiv und unspezifisch, aber im Prinzip sollten doch Funktionen wie f(x) = exp(-x) oder f(x) = 1/(1+x*x) geeignet sein. Es kommt halt auch auf die Argumente und deren Skalierung an.


mandras - Mi 20.07.11 15:02

Wie wärs mit folgendem:

n mal (per Timer):

Labelwert := Labelwert+(gewünschter Wert-Labelwert)/2

und zum Schluß:
Labelwert := gewünschter Wert

Bei n=10 ist beim letzten Durchlauf der Unterschied Labelwert/gewünschter Wert
schon recht gering (tausendstel)


Kha - Mi 20.07.11 15:20

Geeignete Funktionen sollten sich nach kurzer Suche in Hülle und Fülle finden lassen: http://sol.gfxile.net/interpolation/