gpt4 book ai didi

java - 数学和 Java - 从比例值中找到可用索引

转载 作者:行者123 更新时间:2023-11-30 07:27:47 24 4
gpt4 key购买 nike

再次为糟糕的标题道歉 - 很难描述。

我使用了 Java 标签,因为这是我在这个项目中使用的语言,但这确实适用于任何语言。

为了清楚起见,我将使用一个简化的示例。

假设我正在显示一个可以“缩放”的图形,并且我可以访问表示比例的 0 到 1 之间的 float 。

现在假设同一张图片有不同的版本,“特写”越多的版本显示出越精细的细节,而距离越远的版本显然只显示重要的特征。

这些版本中的每一个都是下一个更大版本的一半大小。最特写相当于缩放级别 1。

可能有任意数量的版本,每个版本代表一个 View ,其大小是上一个的一半。

因此,当用户缩放图形时,我需要检查他们是否已达到显示不同版本更好的程度。如果他们还没有达到那个点,我只会展示上一级别的缩小(缩小)版本。

例如,假设有 5 个不同的版本(尽管可以是任意数量),在一个数组中,从最小到最大(尽管如果更容易的话我可以倒过来),所以版本 [4] 是最大的并且versions[0] 是最小的。

例如,

  • 缩放 1,显示版本[4]
  • 缩放 0.5,显示版本[3]
  • 在 0.25,显示版本[2]
  • 在 0.125,显示版本[1]
  • 在 0.0625,显示版本[0]

由于没有版本[0] 的一半可用,我仍会显示版本[0],但尺寸减半。如果添加了另一个版本,它会在整体比例(缩放)为 0.03125 或更小时显示。

对于介于两者之间的比例,我应该显示下一个最大的图像,但尺寸缩小了。

例如,

  • 在缩放 1 时,我会显示最大的(版本 [4]),未缩放。
  • 在 0.8 的缩放下,仍然显示最大但在 0.8 比例下
  • 缩放 0.5,显示未缩放的版本[3]
  • 在 0.3 的缩放比例下,以 0.6 比例显示版本[3]
  • 缩放比例为 0.2,以 0.8 比例显示版本[2]
  • 缩放比例为 0.1,以 0.8 比例显示版本[1]

我可能可以将其与条件语句、链接和 Math.abs 等一起破解,但我敢打赌,有一种非常优雅、高效的方法可以用纯数学来处理这个问题——这让我难以理解。如果没有,我们也欢迎任何关于使用干净、可预测代码的方法的建议。

重申 - 目标是找到要显示的版本的版本(数组索引),以及它应该显示的相对比例,完全基于“全局”比例。

TYIA。

最佳答案

int indexToUse = 0-Math.round(Math.log(zoom)/Math.log(2));
double zoomToUse = zoom/Math.pow(2, -indexToUse);

这使用的信息是每张图片正好是前一张图片的 2 倍大。这是一个指数尺度,因此它的倒数,即对数,用于查找要使用的索引。

之后,您对索引取 2 次方以获得它实际的缩放级别,并将所需的缩放级别除以实际缩放级别以获得您的系数。

(由于您使用的缩放比例始终介于 0 和 1 之间,因此对数将始终为负数,因此我继续将其取反。重新排序图像以适应它可能更容易,或者您可能只想减去从长度获取您要使用的实际索引。)

BigMoMo指出Java的Math.log是自然对数。此外,正如他所指出的,您可以通过将自然对数除以 2 的自然对数来获得 log2。我已经在示例代码中反射(reflect)了这一点。

为了解决您的次要问题,

double getZoom(int index, double zoomOnImage){
return Math.pow(2, -index) * zoomOnImage;
}

关于java - 数学和 Java - 从比例值中找到可用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9481228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com