@itwin/ecschema-metadata
Version:
ECObjects core concepts in typescript
72 lines • 2.78 kB
JavaScript
import { Unit } from "../Metadata/Unit";
import { almostEqual } from "@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
*/
export 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 (almostEqual(conversion.offset, 0.0) && 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 (almostEqual(power, 1.0))
return new UnitConversion(this.factor, this.offset);
else if (almostEqual(power, 0.0))
return new UnitConversion(1.0, 0.0);
if (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.isUnit(unitOrConstant))
return new UnitConversion(unitOrConstant.denominator / unitOrConstant.numerator, -unitOrConstant.offset);
return new UnitConversion(unitOrConstant.denominator / unitOrConstant.numerator, 0.0);
}
}
//# sourceMappingURL=UnitConversion.js.map