我正在想象城市的泡沫,如果城市有更大的价值,那就更大了。例如:
London: 14500
New York: 100
Tokyo: 1100
值范围从~100-15000
我在创建一个会返回合理值的函数时遇到问题,因此100个值的气泡不会太小。我能想到的唯一方法是设置最小尺寸,例如:
if (size < 5) { size = 5 }
但是,这会导致值大约为100的城市与价值约为1000的城市非常相似。我希望大约0-15000的值返回0.5到1之间的值(或类似的东西)。怎么会这样做?
这是我到目前为止所拥有的,但就像我说它导致100的值和1000的值都低于最小值:
var minBulletSize = 7.5;
var maxBulletSize = 20;
var maxSquare = maxBulletSize * maxBulletSize * 2 * Math.PI;
var minSquare = minBulletSize * minBulletSize * 2 * Math.PI;
// create circle for each location
for (var i = 0; i < mapData.length; i++) {
var dataItem = mapData[i];
var value = dataItem.value;
// calculate size of a bubble
var square = (value/1000 - minBulletSize) / (maxBulletSize - minBulletSize) * (maxSquare - minSquare) + minSquare;
if (square < minSquare) {
square = minSquare;
}
if (square > maxSquare) {
square = maxSquare;
}
var size = Math.sqrt(square / (Math.PI * 2));
var id = dataItem.code;
}
答案 0 :(得分:1)
我已经看过如何使对数函数看起来像对数&#34;在0.5和1的限制范围内:
Math.log10(x / 0.8 + 1) / 3 + 0.5
其中x介于0到24.5之间。
这纯粹是一个对我来说看起来很好的功能,你可以尽早获得非常动态的数字,尽管可以看到更大数量的明显增长。
随意乱搞数字,这是非常主观的。
接下来,您需要在0到24.5范围内适应100~15000范围。
我只需要x = (x - 100) / 608.16
来使你的范围在0到24.5之间。
var minBulletSize = 7.5;
var maxBulletSize = 20;
var maxSquare = maxBulletSize * maxBulletSize * 2 * Math.PI;
var minSquare = minBulletSize * minBulletSize * 2 * Math.PI;
// create circle for each location
for (var i = 0; i < mapData.length; i++) {
var dataItem = mapData[i];
var value = dataItem.value;
// assuming value is in between 100 and 15000
value = (value - 100) / 608.16;
value = Math.log10(value / 0.8 + 1) / 3.0 + 0.5;
// value will be in between 0.5 and 1 on a logarithmic scale.
// Do what you want with it :)
}
修改函数中的值,直到找到适合自己的曲线。