@openhps/core
Version:
Open Hybrid Positioning System - Core component
121 lines (112 loc) • 3.2 kB
JavaScript
import { clamp } from './MathUtils.js';
/**
* This class can be used to represent points in 3D space as
* [Spherical coordinates]{@link https://en.wikipedia.org/wiki/Spherical_coordinate_system}.
*/
class Spherical {
/**
* Constructs a new spherical.
*
* @param {number} [radius=1] - The radius, or the Euclidean distance (straight-line distance) from the point to the origin.
* @param {number} [phi=0] - The polar angle in radians from the y (up) axis.
* @param {number} [theta=0] - The equator/azimuthal angle in radians around the y (up) axis.
*/
constructor(radius = 1, phi = 0, theta = 0) {
/**
* The radius, or the Euclidean distance (straight-line distance) from the point to the origin.
*
* @type {number}
* @default 1
*/
this.radius = radius;
/**
* The polar angle in radians from the y (up) axis.
*
* @type {number}
* @default 0
*/
this.phi = phi;
/**
* The equator/azimuthal angle in radians around the y (up) axis.
*
* @type {number}
* @default 0
*/
this.theta = theta;
}
/**
* Sets the spherical components by copying the given values.
*
* @param {number} radius - The radius.
* @param {number} phi - The polar angle.
* @param {number} theta - The azimuthal angle.
* @return {Spherical} A reference to this spherical.
*/
set(radius, phi, theta) {
this.radius = radius;
this.phi = phi;
this.theta = theta;
return this;
}
/**
* Copies the values of the given spherical to this instance.
*
* @param {Spherical} other - The spherical to copy.
* @return {Spherical} A reference to this spherical.
*/
copy(other) {
this.radius = other.radius;
this.phi = other.phi;
this.theta = other.theta;
return this;
}
/**
* Restricts the polar angle [page:.phi phi] to be between `0.000001` and pi -
* `0.000001`.
*
* @return {Spherical} A reference to this spherical.
*/
makeSafe() {
const EPS = 0.000001;
this.phi = clamp(this.phi, EPS, Math.PI - EPS);
return this;
}
/**
* Sets the spherical components from the given vector which is assumed to hold
* Cartesian coordinates.
*
* @param {Vector3} v - The vector to set.
* @return {Spherical} A reference to this spherical.
*/
setFromVector3(v) {
return this.setFromCartesianCoords(v.x, v.y, v.z);
}
/**
* Sets the spherical components from the given Cartesian coordinates.
*
* @param {number} x - The x value.
* @param {number} y - The x value.
* @param {number} z - The x value.
* @return {Spherical} A reference to this spherical.
*/
setFromCartesianCoords(x, y, z) {
this.radius = Math.sqrt(x * x + y * y + z * z);
if (this.radius === 0) {
this.theta = 0;
this.phi = 0;
} else {
this.theta = Math.atan2(x, z);
this.phi = Math.acos(clamp(y / this.radius, -1, 1));
}
return this;
}
/**
* Returns a new spherical with copied values from this instance.
*
* @return {Spherical} A clone of this instance.
*/
clone() {
return new this.constructor().copy(this);
}
}
export { Spherical };