site/node_modules/d3-geo/src/length.js
2024-10-14 08:09:33 +02:00

54 lines
1.3 KiB
JavaScript

import {Adder} from "d3-array";
import {abs, atan2, cos, radians, sin, sqrt} from "./math.js";
import noop from "./noop.js";
import stream from "./stream.js";
var lengthSum,
lambda0,
sinPhi0,
cosPhi0;
var lengthStream = {
sphere: noop,
point: noop,
lineStart: lengthLineStart,
lineEnd: noop,
polygonStart: noop,
polygonEnd: noop
};
function lengthLineStart() {
lengthStream.point = lengthPointFirst;
lengthStream.lineEnd = lengthLineEnd;
}
function lengthLineEnd() {
lengthStream.point = lengthStream.lineEnd = noop;
}
function lengthPointFirst(lambda, phi) {
lambda *= radians, phi *= radians;
lambda0 = lambda, sinPhi0 = sin(phi), cosPhi0 = cos(phi);
lengthStream.point = lengthPoint;
}
function lengthPoint(lambda, phi) {
lambda *= radians, phi *= radians;
var sinPhi = sin(phi),
cosPhi = cos(phi),
delta = abs(lambda - lambda0),
cosDelta = cos(delta),
sinDelta = sin(delta),
x = cosPhi * sinDelta,
y = cosPhi0 * sinPhi - sinPhi0 * cosPhi * cosDelta,
z = sinPhi0 * sinPhi + cosPhi0 * cosPhi * cosDelta;
lengthSum.add(atan2(sqrt(x * x + y * y), z));
lambda0 = lambda, sinPhi0 = sinPhi, cosPhi0 = cosPhi;
}
export default function(object) {
lengthSum = new Adder();
stream(object, lengthStream);
return +lengthSum;
}