UNPKG

@itwin/ecschema-metadata

Version:

ECObjects core concepts in typescript

76 lines 3.04 kB
"use strict"; 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