Производительность функции проверки масштаба Javascript

Ладно, ребята, у меня небольшое узкое место в производительности.

В основном у меня есть график, который состоит из блока экрана («экран») и раздела диаграммы («диаграмма»), когда этот график заканчивает рендеринг, он проверяет, какой масштаб ему нужно установить на диаграмме, чтобы иметь диаграмму помещается внутри экрана. Проблема в том, что любой масштаб, который я придумал, должен быть в степени 1,2. Другими словами, вам нужно получить число новой шкалы, возведя 1,2 в степень некоторого числа.

Эта функция вычисляет нужный мне масштаб.

fitScale = function (width, height)
{
  var scale = 1,
      gWidth = graph.element.offsetWidth,
      gHeight = graph.element.offsetHeight;
  while (gWidth > width * scale && gHeight > height * scale)
    scale *= 1.2;
  while (gWidth < width * scale || gHeight < height * scale)
    scale /= 1.2;
  return 900 / scale;
}

Проблема в том, что это отстой...

Что он делает, так это получает размер диаграммы (width, height) и размер экрана (gWidth, gHeight) и перебирает новую шкалу, пока не достигнет нужного числа.

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

Затем он возвращается, чтобы убедиться, что оба размера диаграммы * шкалы хотя бы немного меньше экрана.

Я хотел бы выполнить это действие с помощью всего одного математического вычисления. Может быть, вычислив плотное прилегание, а затем округлив в меньшую сторону, но я не могу понять, как округлить до степени 1,2.

-исправить-

Вот результирующая рабочая версия...

fitScale = function (width, height)
{
  var wScale = graph.element.offsetWidth / width,
      hScale = graph.element.offsetHeight / height,
      snugg = wScale < hScale ? wScale : hScale,
      exp = Math.log(snugg) / Math.log(1 / 1.2),
      scale = Math.pow(1 / 1.2, Math.ceil(exp));
  return 900 / scale;
}

person R Esmond    schedule 08.03.2013    source источник
comment
Вот почему Бог создал логарифмы, а Брендан Эйх создал функцию log.   -  person ultranaut    schedule 08.03.2013
comment
Да, но как бы я их использовал?   -  person R Esmond    schedule 08.03.2013
comment
Ну, черт возьми, это выглядит правильно. Я знал, что должен быть способ. Почему больше людей не знают, как это сделать?   -  person R Esmond    schedule 08.03.2013
comment
Итак, как мне использовать логарифмическую функцию, чтобы найти свою шкалу?   -  person R Esmond    schedule 08.03.2013
comment
regentsprep.org/Regents/math/algtrig/ATE8/   -  person Alex Wayne    schedule 08.03.2013
comment
Но нахождение натурального логарифма мне не очень помогает.   -  person R Esmond    schedule 08.03.2013
comment
Как вы пришли к значению 1,2?   -  person QuentinUK    schedule 08.03.2013
comment
Я выбрал значение, что происходит, когда кто-то использует колесико мыши, график масштабируется вверх и вниз, 1,2 кажется подходящим. Но всякий раз, когда шкала просто устанавливается на какое-то число, оно должно быть в несколько раз больше множителя, который я использую. Таким образом, пользователь может прокручивать вверх или вниз, и множитель в какой-то момент вернет его к шкале 1.   -  person R Esmond    schedule 08.03.2013


Ответы (1)


Мои математические способности заржавели, так что полегче, если я сойду с Пути Истины здесь.

По сути, вы хотите знать, какая степень y числа 1.2 равна некоторому заданному числу x. Хотя функция log кажется бесполезной, поскольку она говорит вам, какая степень e будет равна вашему числу x, с некоторыми безумными навыками логарифмирования вы можете использовать ее, чтобы добраться туда, куда хотите:

var y = Math.log(x) / Math.log(1.2);

Вероятность того, что y не будет целым числом, довольно высока, и я думаю, что вы этого хотите, так что если вы просто продолжите и Math.floor(y), все будет готово.

person ultranaut    schedule 08.03.2013