2015-10-11 3 views
0

Je suis en train d'écrire un script pour prendre en charge une application Web pour afficher des images et permettre à l'utilisateur d'effectuer un zoom ou un panoramique pour afficher plus de détails. Le script, écrit en JavaScript, prend en charge un niveau de zoom par défaut compris entre 0% et 100%, où 0% représente la taille de l'image après réduction dans la fenêtre du navigateur et 100% représente l'image en pleine résolution. La formule suivante est utilisée pour prendre un pourcentage donné et afficher l'image en utilisant le bon niveau de zoom par défaut. Ci-dessous la formule sont quelques calculs que j'ai utilisés pour s'assurer qu'il fonctionne correctement. Notez que les ratios représentent la différence de taille entre les images.Convertir le pourcentage en pourcentage à l'aide de JavaScript

X/(((Y - 1) * Z) + 1) 

X = Ratio 1 
Y = Ratio 2 
Z = Percentage as Decimal 

3.29/(((3.29 - 1) * 000.00) + 1) = 3.29 
3.29/(((3.29 - 1) * 000.01) + 1) = 3.22 
3.29/(((3.29 - 1) * 000.10) + 1) = 2.67 
3.29/(((3.29 - 1) * 000.90) + 1) = 1.07 
3.29/(((3.29 - 1) * 001.00) + 1) = 1.00 
3.29/(((3.29 - 1) * 001.50) + 1) = 0.74 
3.29/(((3.29 - 1) * 002.00) + 1) = 0.58 
3.29/(((3.29 - 1) * 003.00) + 1) = 0.42 
3.29/(((3.29 - 1) * 004.00) + 1) = 0.32 
3.29/(((3.29 - 1) * 005.00) + 1) = 0.26 
3.29/(((3.29 - 1) * 010.00) + 1) = 0.13 
3.29/(((3.29 - 1) * 025.00) + 1) = 0.05 
3.29/(((3.29 - 1) * 050.00) + 1) = 0.03 
3.29/(((3.29 - 1) * 075.00) + 1) = 0.02 
3.29/(((3.29 - 1) * 100.00) + 1) = 0.01 

Mon problème est que je veux afficher brièvement le niveau de zoom si l'utilisateur change, mais ont besoin de convertir les rapports en pourcentages. La partie difficile est que tout est inversé, où 1 (fixe) représente toujours l'image pleine taille parce que son rapport de taille est de 1: 1. Le plus grand nombre représente la différence de taille entre les deux images, exprimée comme un ratio (variable) converti en une décimale. Enfin, j'ai cherché intensivement des réponses, mais en vain. Quelqu'un peut-il m'aider à trouver une solution?

Mise à jour: Je suis proche d'une réponse, sauf que les résultats sont inversés. Dans cette application, moins est de plus en plus moins, en raison des ratios utilisés dans les calculs. De plus, ce n'était pas clair dans mon premier exemple, mais Y et Z sont variables et X est fixe. Puisque Y représente le rapport d'image variable, il est toujours le même que X lors de l'initialisation car la taille de l'image n'a pas encore été modifiée par l'utilisateur.

Dans l'exemple suivant X = 3,290 et Y varie entre 1 et 3,290, où 3,290 devrait représenter de 0% et 1 doit représenter 100%

(Y - 1)/(X - 1) = Z 

(3.290 - 1)/(3.290 - 1) * 100 = 100.0% 
(3.235 - 1)/(3.290 - 1) * 100 = 097.5% 
(2.280 - 1)/(3.290 - 1) * 100 = 055.8% 
(2.230 - 1)/(3.290 - 1) * 100 = 053.7% 
(2.145 - 1)/(3.290 - 1) * 100 = 050.0% 
(1.830 - 1)/(3.290 - 1) * 100 = 036.2% 
(1.660 - 1)/(3.290 - 1) * 100 = 028.8% 
(1.100 - 1)/(3.290 - 1) * 100 = 004.3% 
(1.010 - 1)/(3.290 - 1) * 100 = 000.4% 
(1.000 - 1)/(3.290 - 1) * 100 = 000.0% 
+0

Votre formule est supérieure 'X/(((Y - 1) * Z) + 1) = N' si vous connaissez N, X et Y, Z =' ((X/N) - 1)/(Y - 1) 'est-ce que cela répond à votre question? –

+0

Merci de votre réponse. En buvant ma deuxième tasse de café, je teste votre formule suggérée et elle semble être valide.Cependant, il existe une variation étrange dans les deux formules que je ne peux pas expliquer. C'est extrêmement petit et je l'attribue à la logique d'arrondi d'ordinateur. – David

+0

J'ai bien peur d'avoir parlé trop tôt. Les résultats de la formule suggérée semblaient bons jusqu'à ce que j'arrive à l'une ou l'autre extrémité du spectre, où elle a échoué. – David

Répondre

0

Il suffit de résoudre X/(((Y - 1) * Z) + 1) = N pour Z est complètement correct mais pas beaucoup d'aide car vos résultats, c'est-à-dire N sont arrondis.

Prenons le dernier par exemple:

3,29/(((3,29 - 1) * 100,00) + 1) = 0,01

Ce n'est pas correct, le résultat est 329/23000 ou décimal: 0.014 30434782608695652173913043478260869565217391 (la suite après que l'espace se répète infiniment), donc (X - N)/(N * (Y - 1)) avec N = 0.01 donne 32800/229 ou environ 143.2314410 en décimal qui est de votre part de l'attendu 100,0, près de 50%!

Il n'y a pas de solution simple pour cela. Probablement le plus simple serait d'utiliser plus de chiffres pour les listes et arrondir à deux chiffres de précision (par exemple: avec toFixed()) pour l'utilisateur à dégoûter. Le plus compliqué serait d'utiliser des rationnels partout et c'est, je l'admets librement et sans aucune honte, la façon dont je le ferais.

+0

C'est correct après l'arrondissement. Où 3.29/(((3.29 - 1) * 100) + 1) = 0.01430434782608695652174 est la réponse réelle, au moins au niveau de précision que je suis capable de le calculer. L'espace entre 1 et 0 est infini, mais un niveau de précision élevé n'est pas requis pour mon application. – David

0

J'ai résolu mon problème en calculant l'inverse du pourcentage en utilisant la formule suivante.

((X - 1) - (Y - 1))/(X - 1) * 100 = Z 

((3.290 - 1) - (3.290 - 1))/(3.290 - 1) * 100 = 000.0% 
((3.290 - 1) - (3.235 - 1))/(3.290 - 1) * 100 = 002.4% 
((3.290 - 1) - (2.280 - 1))/(3.290 - 1) * 100 = 044.1% 
((3.290 - 1) - (2.230 - 1))/(3.290 - 1) * 100 = 046.3% 
((3.290 - 1) - (2.145 - 1))/(3.290 - 1) * 100 = 050.0% 
((3.290 - 1) - (1.830 - 1))/(3.290 - 1) * 100 = 063.8% 
((3.290 - 1) - (1.660 - 1))/(3.290 - 1) * 100 = 071.2% 
((3.290 - 1) - (1.100 - 1))/(3.290 - 1) * 100 = 095.6% 
((3.290 - 1) - (1.010 - 1))/(3.290 - 1) * 100 = 099.6% 
((3.290 - 1) - (1.000 - 1))/(3.290 - 1) * 100 = 100.0%