2010-10-27 35 views
2

J'ai un graphique, généré par une fonction, et il se zoome automatiquement en fonction de la valeur de la fonction. J'ai déjà les outils graphiques et je peux afficher n'importe quel x, y, largeur, hauteur à haute résolution.Quel algorithme dois-je utiliser pour zoomer un graphique ou mapper en douceur?

J'ai essayé juste claquant au bon endroit:

x = target_x 
y = target_y 
width = target_width 
height = target_height 

Mais il est trop nerveux. Il est difficile de dire quelle partie a été agrandie/désactivée.

J'ai aussi essayé de faire ceci:

orig_x = x //ditto for y, width, height, etc 
for i=1 to 10 
    x = i/10*new_x + i/10*orig_x 
    wait 25ms 

Il est plus lisse, mais la première étape est encore trop nerveux. Si orig_x vaut 10 et new_x vaut 1 million, alors le premier saut est trop grand, proche de 1 000 000%. Le dernier saut est seulement de 10%, cependant. Une progression géométrique est encore meilleure mais si je dois changer de direction à mi-zoom, les étapes sont sautillantes.

Quel serait le meilleur effet à utiliser?

Répondre

0

Je peux essayer

xDiff = new_x - orig_x 
stepCount = 10 

for i=1 to stepCount 
    x = orig_x + i/stepCount * xDiff 
    wait 25ms 
+0

Ce zoom créé par cet algorithme s'exécutera dans différentes quantités de temps dans différents environnements. –

+0

@NickLarsen, puis-je demander pourquoi? – tafa

+0

C'est identique à ce que j'ai écrit. – Eyal

2

Vous souhaitez effectuer un zoom/décentrement un pourcentage fixe de la dernière fenêtre pour chaque étape. Cela signifie que votre zoom sera une courbe exponentielle, et votre décalage sera lié à votre zoom. Quelque chose comme ce qui suit devrait être une amélioration:

width_ratio = new_width/old_width 
width_ratio_log = log(width_ratio) 

x_diff = new_x - old_x 
x_factor = x_diff/(width_ratio - 1) 
-- warning: need to handle width_ratio near 1 the old way! 

for i=1 to steps 
    width_factor = exp(width_ratio_log * i/steps) 
    width = old_width * width_factor 
    x = old_x + x_factor * (width_factor - 1) 

    -- similarly for y and height...