为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

3 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

假设您要将范围缩放[min,max]到[a,b]。您正在寻找满足的(连续)功能


f(min) = a

f(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 - min

f(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。


希望这可以帮助。


查看完整回答
反对 回复 2019-09-18
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

这里有一些用于复制粘贴的JavaScript(这是烦人的答案):


function scaleBetween(unscaledNum, minAllowed, maxAllowed, min, max) {

  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++) {

  var unscaled = unscaledNums[i];

  var scaled = scaleBetween(unscaled, 0, 100, minRange, maxRange);

  console.log(scaled.toFixed(2));

}

0.00,18.37,48.98,55.10,85.71,100.00


编辑:


我知道我很久以前就回答了这个问题,但是我现在使用的是一个更清洁的功能:


Array.prototype.scaleBetween = function(scaledMin, scaledMax) {

  var max = Math.max.apply(Math, this);

  var min = Math.min.apply(Math, this);

  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]


查看完整回答
反对 回复 2019-09-18
?
慕后森

TA贡献1802条经验 获得超5个赞

为方便起见,这里是Java形式的Irritate算法。根据需要添加错误检查,异常处理和调整。


public class Algorithms { 

    public static double scale(final double valueIn, final double baseMin, final double baseMax, final double limitMin, final double limitMax) {

        return ((limitMax - limitMin) * (valueIn - baseMin) / (baseMax - baseMin)) + limitMin;

    }

}

测试:


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.0

270.0

180.0


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 931 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信