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