NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/@antv/scale/src/pow.js
2023-09-14 14:47:11 +08:00

105 lines
2.3 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @fileOverview 使用pow进行度量计算
* @author dxq613@gmail.com
*/
const Base = require('./base');
const Linear = require('./linear');
// 求以a为次幂结果为b的基数如 x^^a = b;求x
function calBase(a, b) {
const e = Math.E;
const value = Math.pow(e, Math.log(b) / a); // 使用换底公式求底
return value;
}
/**
* 度量的Pow计算
* @class Scale.Log
*/
class Pow extends Linear {
_initDefaultCfg() {
super._initDefaultCfg();
this.type = 'pow';
/**
* @override
* pow 的坐标点的个数控制在10个以下
* @type {Number}
*/
this.tickCount = 10;
/**
* 进行pow计算的基数
* @type {Number}
*/
this.exponent = 2;
}
/**
* @override
*/
calculateTicks() {
const self = this;
const exponent = self.exponent;
let min;
let max = Math.ceil(calBase(exponent, self.max));
if (self.min >= 0) {
min = Math.floor(calBase(exponent, self.min));
} else {
min = 0;
}
if (min > max) {
const tmp = max;
max = min;
min = tmp;
}
const count = max - min;
const tickCount = self.tickCount;
const avg = Math.ceil(count / tickCount);
const ticks = [];
for (let i = min; i < max + avg; i = i + avg) {
ticks.push(Math.pow(i, exponent));
}
return ticks;
}
// 获取度量计算时value占的定义域百分比
_getScalePercent(value) {
const max = this.max;
const min = this.min;
if (max === min) {
return 0;
}
const exponent = this.exponent;
const percent = (calBase(exponent, value) - calBase(exponent, min)) / (calBase(exponent, max) - calBase(exponent, min));
return percent;
}
/**
* @override
*/
scale(value) {
const percent = this._getScalePercent(value);
const rangeMin = this.rangeMin();
const rangeMax = this.rangeMax();
return rangeMin + percent * (rangeMax - rangeMin);
}
/**
* @override
*/
invert(value) {
const percent = (value - this.rangeMin()) / (this.rangeMax() - this.rangeMin());
const exponent = this.exponent;
const max = calBase(exponent, this.max);
const min = calBase(exponent, this.min);
const tmp = percent * (max - min) + min;
return Math.pow(tmp, exponent);
}
}
Base.Pow = Pow;
module.exports = Pow;