1

好吧,我有一个轻微的性能瓶颈。

基本上我有一个由屏幕 div(“屏幕”)和图表 div(“图表”)组成的图表,当这个图表完成渲染时,它会检查它需要在图表上设置什么比例才能获得图表适合屏幕内部。问题是我想出的任何比例都必须是 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;
}
4

1 回答 1

2

我的数学技能生疏了,所以如果我在这里偏离了真理之路,那就放轻松吧。

基本上你想知道什么幂y等于1.2某个给定的数字x。虽然该log函数似乎没有帮助,因为它告诉您e将等于您的 numberx的幂,但实际上您可以使用一些疯狂的对数技能来到达您想去的地方:

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

赔率非常好,y不会是整数,我认为这是你想要的,所以如果你继续前进Math.floor(y),你应该已经准备好了。

于 2013-03-08T02:22:26.077 回答