| import {Adder} from "d3-array"; |
| import {abs} from "../math.js"; |
| import noop from "../noop.js"; |
|
|
| var areaSum = new Adder(), |
| areaRingSum = new Adder(), |
| x00, |
| y00, |
| x0, |
| y0; |
|
|
| var areaStream = { |
| point: noop, |
| lineStart: noop, |
| lineEnd: noop, |
| polygonStart: function() { |
| areaStream.lineStart = areaRingStart; |
| areaStream.lineEnd = areaRingEnd; |
| }, |
| polygonEnd: function() { |
| areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop; |
| areaSum.add(abs(areaRingSum)); |
| areaRingSum = new Adder(); |
| }, |
| result: function() { |
| var area = areaSum / 2; |
| areaSum = new Adder(); |
| return area; |
| } |
| }; |
|
|
| function areaRingStart() { |
| areaStream.point = areaPointFirst; |
| } |
|
|
| function areaPointFirst(x, y) { |
| areaStream.point = areaPoint; |
| x00 = x0 = x, y00 = y0 = y; |
| } |
|
|
| function areaPoint(x, y) { |
| areaRingSum.add(y0 * x - x0 * y); |
| x0 = x, y0 = y; |
| } |
|
|
| function areaRingEnd() { |
| areaPoint(x00, y00); |
| } |
|
|
| export default areaStream; |
|
|