@openhps/core
Version:
Open Hybrid Positioning System - Core component
195 lines • 6.39 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AbsolutePosition = void 0;
const tslib_1 = require("tslib");
const unit_1 = require("../../utils/unit");
const Velocity_1 = require("../values/Velocity");
const Orientation_1 = require("./Orientation");
const decorators_1 = require("../decorators");
const TimeService_1 = require("../../service/TimeService");
const Accuracy_1 = require("../values/Accuracy");
const Accuracy1D_1 = require("../values/Accuracy1D");
const utils_1 = require("../../utils");
/**
* An absolute position of a {@link DataObject}.
* @category Position
*/
let AbsolutePosition = class AbsolutePosition {
constructor() {
/**
* Position recording timestamp
*/
this.timestamp = TimeService_1.TimeService.now();
/**
* Velocity at recorded position
*/
this.velocity = new Velocity_1.Velocity();
/**
* Position unit
*/
this.unit = unit_1.LengthUnit.METER;
}
/**
* Get the position probability
* @returns {number} Probability between 0 and 1
*/
get probability() {
if (!this._probability) {
return 1 / this.accuracy.valueOf();
}
return this._probability;
}
set probability(value) {
if (value > 1 || value < 0) {
throw new Error(`${this.constructor.name} should be between 0 and 1.`);
}
this._probability = value;
}
/**
* Position accuracy
* @returns {Accuracy} Position accuracy
*/
get accuracy() {
if (!this._accuracy) {
this._accuracy = new Accuracy1D_1.Accuracy1D(1, this.unit);
}
return this._accuracy;
}
set accuracy(value) {
if (!value) {
throw new Error(`Accuracy can not be undefined!`);
}
this._accuracy = value;
}
/**
* Get the linear velocity
* @returns {LinearVelocity} Linear velocity
*/
get linearVelocity() {
if (!this.velocity) {
return undefined;
}
return this.velocity.linear;
}
/**
* Set the linear velocity
*/
set linearVelocity(value) {
if (!this.velocity) {
this.velocity = new Velocity_1.Velocity();
}
this.velocity.linear = value;
}
/**
* Get the angular velocity
* @returns {AngularVelocity} Angular velocity
*/
get angularVelocity() {
if (!this.velocity) {
return undefined;
}
return this.velocity.angular;
}
/**
* Set the angular velocity
*/
set angularVelocity(value) {
if (!this.velocity) {
this.velocity = new Velocity_1.Velocity();
}
this.velocity.angular = value;
}
/**
* Set the orientation of the position
* @param {Orientation} orientation orientation
* @returns {AbsolutePosition} instance
*/
setOrientation(orientation) {
this.orientation = orientation;
return this;
}
/**
* Set the accuracy of the absolute position
* @param {number | Accuracy} accuracy Accuracy object or number
* @param {Unit} [unit] Optional unit
* @returns {AbsolutePosition} instance
*/
setAccuracy(accuracy, unit) {
if (typeof accuracy === 'number') {
this.accuracy = new Accuracy1D_1.Accuracy1D(accuracy, unit || this.unit);
}
else {
this.accuracy = accuracy;
}
return this;
}
/**
* Get the distance from this location to a destination
* @param {AbsolutePosition} destination Destination location
* @param {DistanceFn} [distanceFunction] Distance function to use (default EUCLIDEAN distance)
* @returns {number} Distance between this point and destination
*/
distanceTo(destination, distanceFunction = utils_1.EUCLIDEAN) {
return distanceFunction(this.toVector3().toArray(), destination.toVector3().toArray());
}
equals(position) {
return this.toVector3(this.unit).equals(position.toVector3(this.unit));
}
/**
* Clone the position
* @returns {AbsolutePosition} Cloned position
*/
clone() {
const position = new this.constructor();
position.unit = this.unit;
position._accuracy = this._accuracy ? this._accuracy.clone() : undefined;
position.orientation = this.orientation ? this.orientation.clone() : undefined;
position.velocity = this.velocity ? this.velocity.clone() : undefined;
position.timestamp = this.timestamp;
position.referenceSpaceUID = this.referenceSpaceUID;
return position;
}
};
exports.AbsolutePosition = AbsolutePosition;
tslib_1.__decorate([
(0, decorators_1.SerializableMember)({
index: true,
numberType: decorators_1.NumberType.LONG,
}),
tslib_1.__metadata("design:type", Number)
], AbsolutePosition.prototype, "timestamp", void 0);
tslib_1.__decorate([
(0, decorators_1.SerializableMember)(),
tslib_1.__metadata("design:type", Velocity_1.Velocity)
], AbsolutePosition.prototype, "velocity", void 0);
tslib_1.__decorate([
(0, decorators_1.SerializableMember)(),
tslib_1.__metadata("design:type", Orientation_1.Orientation)
], AbsolutePosition.prototype, "orientation", void 0);
tslib_1.__decorate([
(0, decorators_1.SerializableMember)(),
tslib_1.__metadata("design:type", unit_1.LengthUnit)
], AbsolutePosition.prototype, "unit", void 0);
tslib_1.__decorate([
(0, decorators_1.SerializableMember)({
index: true,
}),
tslib_1.__metadata("design:type", String)
], AbsolutePosition.prototype, "referenceSpaceUID", void 0);
tslib_1.__decorate([
(0, decorators_1.SerializableMember)({
name: 'accuracy',
}),
tslib_1.__metadata("design:type", Accuracy_1.Accuracy)
], AbsolutePosition.prototype, "_accuracy", void 0);
tslib_1.__decorate([
(0, decorators_1.SerializableMember)({
name: 'probability',
numberType: decorators_1.NumberType.DECIMAL,
}),
tslib_1.__metadata("design:type", Number)
], AbsolutePosition.prototype, "_probability", void 0);
exports.AbsolutePosition = AbsolutePosition = tslib_1.__decorate([
(0, decorators_1.SerializableObject)()
], AbsolutePosition);
//# sourceMappingURL=AbsolutePosition.js.map