d3-jsnext
Version:
d3, but futuristic
125 lines (105 loc) • 3.09 kB
JavaScript
import { d3_identity } from '../core/identity';
import { d3_svg_lineStepBefore, d3_svg_lineStepAfter, d3_svg_lineLinear, d3_svg_lineInterpolators } from './line';
import { d3_functor } from '../core/functor';
import { d3_true } from '../core/true';
import { d3_geom_pointY, d3_geom_pointX } from '../geom/point';
import { d3$svg } from './svg';
var d3$svg$area;
function d3_svg_area(projection) {
var x0 = d3_geom_pointX,
x1 = d3_geom_pointX,
y0 = 0,
y1 = d3_geom_pointY,
defined = d3_true,
interpolate = d3_svg_lineLinear,
interpolateKey = interpolate.key,
interpolateReverse = interpolate,
L = "L",
tension = .7;
function area(data) {
var segments = [],
points0 = [],
points1 = [],
i = -1,
n = data.length,
d,
fx0 = d3_functor(x0),
fy0 = d3_functor(y0),
fx1 = x0 === x1 ? function() { return x; } : d3_functor(x1),
fy1 = y0 === y1 ? function() { return y; } : d3_functor(y1),
x,
y;
function segment() {
segments.push("M", interpolate(projection(points1), tension),
L, interpolateReverse(projection(points0.reverse()), tension),
"Z");
}
while (++i < n) {
if (defined.call(this, d = data[i], i)) {
points0.push([x = +fx0.call(this, d, i), y = +fy0.call(this, d, i)]);
points1.push([+fx1.call(this, d, i), +fy1.call(this, d, i)]);
} else if (points0.length) {
segment();
points0 = [];
points1 = [];
}
}
if (points0.length) segment();
return segments.length ? segments.join("") : null;
}
area.x = function(_) {
if (!arguments.length) return x1;
x0 = x1 = _;
return area;
};
area.x0 = function(_) {
if (!arguments.length) return x0;
x0 = _;
return area;
};
area.x1 = function(_) {
if (!arguments.length) return x1;
x1 = _;
return area;
};
area.y = function(_) {
if (!arguments.length) return y1;
y0 = y1 = _;
return area;
};
area.y0 = function(_) {
if (!arguments.length) return y0;
y0 = _;
return area;
};
area.y1 = function(_) {
if (!arguments.length) return y1;
y1 = _;
return area;
};
area.defined = function(_) {
if (!arguments.length) return defined;
defined = _;
return area;
};
area.interpolate = function(_) {
if (!arguments.length) return interpolateKey;
if (typeof _ === "function") interpolateKey = interpolate = _;
else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
interpolateReverse = interpolate.reverse || interpolate;
L = interpolate.closed ? "M" : "L";
return area;
};
area.tension = function(_) {
if (!arguments.length) return tension;
tension = _;
return area;
};
return area;
}
d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;
d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;
d3$svg$area = function() {
return d3_svg_area(d3_identity);
};
export { d3$svg$area, d3_svg_area };