d3-jsnext
Version:
d3, but futuristic
43 lines (35 loc) • 1.17 kB
JavaScript
import { abs } from '../math/abs';
import { d3_noop } from '../core/noop';
// TODO Unify this code with d3.geom.polygon area?
var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {
point: d3_noop,
lineStart: d3_noop,
lineEnd: d3_noop,
// Only count area for polygon rings.
polygonStart: function() {
d3_geo_pathAreaPolygon = 0;
d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;
},
polygonEnd: function() {
d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;
d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);
}
};
function d3_geo_pathAreaRingStart() {
var x00, y00, x0, y0;
// For the first point, …
d3_geo_pathArea.point = function(x, y) {
d3_geo_pathArea.point = nextPoint;
x00 = x0 = x, y00 = y0 = y;
};
// For subsequent points, …
function nextPoint(x, y) {
d3_geo_pathAreaPolygon += y0 * x - x0 * y;
x0 = x, y0 = y;
}
// For the last point, return to the start.
d3_geo_pathArea.lineEnd = function() {
nextPoint(x00, y00);
};
}
export { d3_geo_pathAreaRingStart, d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea };