in src/geo/Transform.ts [438:488]
private _bearingToSfm(bearing: number[]): number[] {
if (isSpherical(this._cameraType)) {
let x: number = bearing[0];
let y: number = bearing[1];
let z: number = bearing[2];
let lng: number = Math.atan2(x, z);
let lat: number = Math.atan2(-y, Math.sqrt(x * x + z * z));
return [lng / (2 * Math.PI), -lat / (2 * Math.PI)];
} else if (isFisheye(this._cameraType)) {
if (bearing[2] > 0) {
const [x, y, z]: number[] = bearing;
const r: number = Math.sqrt(x * x + y * y);
let theta: number = Math.atan2(r, z);
if (theta > this._radialPeak) {
theta = this._radialPeak;
}
const distortion: number = 1.0 + theta ** 2 * (this._ck1 + theta ** 2 * this._ck2);
const s: number = this._focal * distortion * theta / r;
return [s * x, s * y];
} else {
return [
bearing[0] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
bearing[1] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
];
}
} else {
if (bearing[2] > 0) {
let [xn, yn]: number[] = [bearing[0] / bearing[2], bearing[1] / bearing[2]];
let r2: number = xn * xn + yn * yn;
const rp2: number = this._radialPeak ** 2;
if (r2 > rp2) {
r2 = rp2;
}
const d: number = 1 + this._ck1 * r2 + this._ck2 * r2 ** 2;
return [
this._focal * d * xn,
this._focal * d * yn,
];
} else {
return [
bearing[0] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
bearing[1] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
];
}
}
}