1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- 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;
- }
|