猿问

如何缩小具有已知最小值和最大值的数字范围

因此,我试图找出如何获取一系列数字并将值缩小到适合范围。想要这样做的原因是我试图在java swing jpanel中绘制省略号。我希望每个椭圆的高度和宽度在1-30的范围内。我有从我的数据集中找到最小值和最大值的方法,但是直到运行时才会有min和max。是否有捷径可寻?



holdtom
浏览 932回答 3
3回答

慕雪6442864

假设您要将范围缩放[min,max]到[a,b]。您正在寻找满足的(连续)功能f(min) = af(max) = b在你的情况下,a将是1,b将是30,但让我们从更简单的东西开始,并尝试映射[min,max]到范围[0,1]。把min成函数获得了0可以与实现f(x) = x - min   ===>   f(min) = min - min = 0这几乎就是我们想要的。但是当我们真正想要时,投入max会给我们max - min1.所以我们必须扩展它:        x - min                                  max - minf(x) = ---------   ===>   f(min) = 0;  f(max) =  --------- = 1       max - min                                 max - min这就是我们想要的。所以我们需要进行翻译和缩放。现在,如果不是我们想要得到的任意值a和b,我们需要一些更复杂的:       (b-a)(x - min)f(x) = --------------  + a          max - min您可以验证投入min对x现在给a,并把在max给b。您可能还会注意到,这(b-a)/(max-min)是新范围大小与原始范围大小之间的缩放系数。因此,其实我们是第一平移x通过-min,它扩展到了正确的因素,然后再翻译回最多的新的最小值a。希望这可以帮助。

哈士奇WWW

这里有一些用于复制粘贴的JavaScript(这是烦人的答案):function scaleBetween(unscaledNum, minAllowed, maxAllowed, min, max) {&nbsp; return (maxAllowed - minAllowed) * (unscaledNum - min) / (max - min) + minAllowed;}像这样应用,将范围10-50缩放到0-100之间的范围。var unscaledNums = [10, 13, 25, 28, 43, 50];var maxRange = Math.max.apply(Math, unscaledNums);var minRange = Math.min.apply(Math, unscaledNums);for (var i = 0; i < unscaledNums.length; i++) {&nbsp; var unscaled = unscaledNums[i];&nbsp; var scaled = scaleBetween(unscaled, 0, 100, minRange, maxRange);&nbsp; console.log(scaled.toFixed(2));}0.00,18.37,48.98,55.10,85.71,100.00编辑:我知道我很久以前就回答了这个问题,但是我现在使用的是一个更清洁的功能:Array.prototype.scaleBetween = function(scaledMin, scaledMax) {&nbsp; var max = Math.max.apply(Math, this);&nbsp; var min = Math.min.apply(Math, this);&nbsp; return this.map(num => (scaledMax-scaledMin)*(num-min)/(max-min)+scaledMin);}应用如下:[-4, 0, 5, 6, 9].scaleBetween(0, 100);[0,30.76923076923077,69.23076923076923,76.92307692307692,100]

慕后森

为方便起见,这里是Java形式的Irritate算法。根据需要添加错误检查,异常处理和调整。public class Algorithms {&nbsp;&nbsp; &nbsp; public static double scale(final double valueIn, final double baseMin, final double baseMax, final double limitMin, final double limitMax) {&nbsp; &nbsp; &nbsp; &nbsp; return ((limitMax - limitMin) * (valueIn - baseMin) / (baseMax - baseMin)) + limitMin;&nbsp; &nbsp; }}测试:final double baseMin = 0.0;final double baseMax = 360.0;final double limitMin = 90.0;final double limitMax = 270.0;double valueIn = 0;System.out.println(Algorithms.scale(valueIn, baseMin, baseMax, limitMin, limitMax));valueIn = 360;System.out.println(Algorithms.scale(valueIn, baseMin, baseMax, limitMin, limitMax));valueIn = 180;System.out.println(Algorithms.scale(valueIn, baseMin, baseMax, limitMin, limitMax));90.0270.0180.0
随时随地看视频慕课网APP
我要回答