Ладно, ребята, у меня небольшое узкое место в производительности.
В основном у меня есть график, который состоит из блока экрана («экран») и раздела диаграммы («диаграмма»), когда этот график заканчивает рендеринг, он проверяет, какой масштаб ему нужно установить на диаграмме, чтобы иметь диаграмму помещается внутри экрана. Проблема в том, что любой масштаб, который я придумал, должен быть в степени 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;
}
log
. - person ultranaut   schedule 08.03.2013