2015-10-11 1 views
0

Я работаю над написанием сценария для поддержки веб-приложения для отображения изображений и позволяет пользователю увеличивать/панорамировать, чтобы просмотреть более подробную информацию. Сценарий, написанный с использованием JavaScript, поддерживает уровень масштабирования по умолчанию от 0% до 100%, где 0% представляет размер изображения после его уменьшения в соответствии с окном браузера, а 100% представляет изображение с полным разрешением. Следующая формула используется для получения заданного процента и отображения изображения с использованием правильного уровня масштабирования по умолчанию. Ниже формулы - некоторые вычисления, которые я использовал для обеспечения правильной работы. Обратите внимание, что отношения представляют собой разницу в размерах между изображениями.Преобразование отношения к проценту с помощью 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 

Моя проблема заключается в том, что я хочу кратко отобразить уровень масштабирования, если пользователь изменяет его, но нужно преобразовать отношения в процентах. Сложная часть состоит в том, что все меняется на противоположное, где 1 (фиксированный) всегда представляет полноразмерное изображение, потому что это соотношение размеров 1: 1. Большее число представляет собой разницу в размерах между двумя изображениями, выраженную как отношение (изменяется), преобразованное в десятичную.

Case 1: 
3.290 = 0% (no zoom) 
2.145 = 50% 
1.000 = 100% (max zoom) 
------------ 
1.183 = ? 

Case 2: 
5.470 = 0% 
3.235 = 50% 
1.000 = 100% 
------------ 
4.680 = ? 

Case 3: 
7.630 = 0% 
4.317 = 50% 
1.000 = 100% 
------------ 
3.745 = ? 

Наконец, я много раз искал ответы, но безуспешно. Может ли кто-нибудь помочь мне найти решение?

Обновление: Я близко к ответу, за исключением того, что результаты инвертированы. В этой заявке меньше все больше и больше меньше из-за коэффициентов, используемых в расчетах. Кроме того, в моем первом примере это было неясно, но Y и Z являются переменными и X фиксирован. Поскольку Y представляет собой отношение переменных изображений, он всегда совпадает с X во время инициализации, потому что размер изображения еще не был изменен пользователем.

В следующем примере Х = 3,290 и Y изменяется между 1 и 3.290, где 3,290 должны представлять 0% и 1 должна представлять 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

Ваша главная формула 'X/(((Y - 1) * Z) + 1) = N', если вы знаете, N, X и Y, то' Z = ((X/N) - 1)/(Y - 1) 'это отвечает на ваш вопрос? –

+0

Спасибо, что ответили. Когда я выпиваю вторую чашку кофе, я тестирую вашу предложенную формулу, и она кажется действительной.Однако в обеих формулах существует странная вариация, которую я не могу объяснить. Это очень мало, и я отношу его к логике компьютерного округления. – David

+0

Боюсь, я слишком скоро заговорил. Результаты предложенной формулы выглядели хорошо, пока я не дошел до конца спектра, где он не удался. – David

ответ

0

Просто решение Х/(((Y - 1) * Z) + 1) = N для Z является полностью правильным, но не очень помогает, потому что ваши результаты, то есть N, округлены.

Давайте возьмем последний, например:

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

Это не правильно, то результат 329/23000 или десятичная: 0,014 30434782608695652173913043478260869565217391 (последовательность после пробела бесконечно повторяется), поэтому (X - N)/(N * (Y - 1)) с N = 0,01 дает 32800/229 или около 143,2314410 в десятичной форме, которая имеет ваш путь от ожидаемый 100,0, почти 50%!

Для этого нет простого решения. Вероятно, самым простым было бы использовать больше цифр для списков и точность до двух цифр (например: toFixed()), чтобы пользователь мог отвратить.

Самым сложным было бы использовать рациональные решения во всем, и это значит, я допускаю это свободно и без какого-либо стыда, как бы я это сделал.

+0

Это правильно после округления. Где 3.29/(((3.29 - 1) * 100) + 1) = 0.01430434782608695652174 - это реальный ответ, по крайней мере, до уровня точности, который я могу вычислить. Пространство между 1 и 0 бесконечно, но для моего приложения не требуется высокий уровень точности. – David

0

Я решил свою проблему, вычислив обратный процент, используя следующую формулу.

((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% 
Смежные вопросы