@itwin/ecschema-metadata
Version:
ECObjects core concepts in typescript
76 lines • 3.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.UnitConversion = void 0;
const Unit_1 = require("../Metadata/Unit");
const core_quantity_1 = require("@itwin/core-quantity");
/**
* Class used for storing calculated conversion between two Units [[UnitConverter.calculateConversion]] and converting values from one Unit to another [[UnitConverter.evaluate]]
* @internal
*/
class UnitConversion {
factor;
offset;
constructor(factor = 1.0, offset = 0.0) {
this.factor = factor;
this.offset = offset;
}
/**
* Converts x using UnitConversion
* @param x Input magnitude to be converted
* @returns Output magnitude after conversion
*/
evaluate(x) {
return this.factor * x + this.offset;
}
/**
* Used to invert source's UnitConversion so that it can be composed with target's UnitConversion cleanly
* @internal
*/
inverse() {
const inverseFactor = 1.0 / this.factor;
return new UnitConversion(inverseFactor, -this.offset * inverseFactor);
}
/**
* Combines two UnitConversions
* Used to combine source's UnitConversion and target's UnitConversion for a final UnitConversion that can be evaluated
* @internal
*/
compose(conversion) {
return new UnitConversion(this.factor * conversion.factor, conversion.factor * this.offset + conversion.offset);
}
/**
* Multiples two UnitConversions together to calculate factor during reducing
* @internal
*/
multiply(conversion) {
if ((0, core_quantity_1.almostEqual)(conversion.offset, 0.0) && (0, core_quantity_1.almostEqual)(this.offset, 0.0))
return new UnitConversion(this.factor * conversion.factor, 0.0);
throw new Error("Cannot multiply two maps with non-zero offsets");
}
/**
* Raise UnitConversion's factor with power exponent to calculate factor during reducing
* @internal
*/
raise(power) {
if ((0, core_quantity_1.almostEqual)(power, 1.0))
return new UnitConversion(this.factor, this.offset);
else if ((0, core_quantity_1.almostEqual)(power, 0.0))
return new UnitConversion(1.0, 0.0);
if ((0, core_quantity_1.almostEqual)(this.offset, 0.0))
return new UnitConversion(this.factor ** power, 0.0);
throw new Error("Cannot raise map with non-zero offset");
}
/** @internal */
static identity = new UnitConversion();
/**
* Returns UnitConversion with unit's numerator and denominator in factor and unit's offset in offset for reducing
* @internal
*/
static from(unitOrConstant) {
if (Unit_1.Unit.isUnit(unitOrConstant))
return new UnitConversion(unitOrConstant.denominator / unitOrConstant.numerator, -unitOrConstant.offset);
return new UnitConversion(unitOrConstant.denominator / unitOrConstant.numerator, 0.0);
}
}
exports.UnitConversion = UnitConversion;
//# sourceMappingURL=UnitConversion.js.map