54 lines
1.3 KiB
JavaScript
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;
|
||
|
}
|