Add x0 & x1 accessors to d3.svg.area.

Thanks for the inspiration, @strongh!
This commit is contained in:
Mike Bostock 2011-06-23 20:03:27 -07:00
Родитель b5465489e7
Коммит 906e7eefc3
5 изменённых файлов: 101 добавлений и 41 удалений

61
d3.js поставляемый
Просмотреть файл

@ -3111,51 +3111,68 @@ function d3_svg_lineMonotone(points) {
d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));
}
d3.svg.area = function() {
var x = d3_svg_lineX,
var x0 = d3_svg_lineX,
x1 = d3_svg_lineX,
y0 = 0,
y1 = d3_svg_lineY,
interpolate = "linear",
interpolator = d3_svg_lineInterpolators[interpolate],
tension = .7;
// TODO horizontal / vertical / radial orientation
function area(d) {
if (d.length < 1) return null;
var points1 = d3_svg_linePoints(this, d, x, y1),
points0 = d3_svg_linePoints(this, d, d3_svg_areaX(points1), y0).reverse();
var points0 = d3_svg_linePoints(this, d, x0, y0),
points1 = d3_svg_linePoints(this, d, x0 === x1 ? d3_svg_areaX(points0) : x1, y0 === y1 ? d3_svg_areaY(points0) : y1);
return "M" + interpolator(points1, tension)
+ "L" + interpolator(points0, tension)
+ "L" + interpolator(points0.reverse(), tension)
+ "Z";
}
area.x = function(v) {
if (!arguments.length) return x;
x = v;
area.x = function(x) {
if (!arguments.length) return x1;
x0 = x1 = x;
return area;
};
area.y0 = function(v) {
if (!arguments.length) return y0;
y0 = v;
area.x0 = function(x) {
if (!arguments.length) return x0;
x0 = x;
return area;
};
area.y1 = function(v) {
area.x1 = function(x) {
if (!arguments.length) return x1;
x1 = x;
return area;
};
area.y = function(y) {
if (!arguments.length) return y1;
y1 = v;
y0 = y1 = y;
return area;
};
area.interpolate = function(v) {
area.y0 = function(y) {
if (!arguments.length) return y0;
y0 = y;
return area;
};
area.y1 = function(y) {
if (!arguments.length) return y1;
y1 = y;
return area;
};
area.interpolate = function(x) {
if (!arguments.length) return interpolate;
interpolator = d3_svg_lineInterpolators[interpolate = v];
interpolator = d3_svg_lineInterpolators[interpolate = x];
return area;
};
area.tension = function(v) {
area.tension = function(x) {
if (!arguments.length) return tension;
tension = v;
tension = x;
return area;
};
@ -3164,7 +3181,13 @@ d3.svg.area = function() {
function d3_svg_areaX(points) {
return function(d, i) {
return d3_svg_lineX.call(this, points[i], i);
return points[i][0];
};
}
function d3_svg_areaY(points) {
return function(d, i) {
return points[i][1];
};
}
d3.svg.chord = function() {

4
d3.min.js поставляемый

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -1,49 +1,66 @@
d3.svg.area = function() {
var x = d3_svg_lineX,
var x0 = d3_svg_lineX,
x1 = d3_svg_lineX,
y0 = 0,
y1 = d3_svg_lineY,
interpolate = "linear",
interpolator = d3_svg_lineInterpolators[interpolate],
tension = .7;
// TODO horizontal / vertical / radial orientation
function area(d) {
if (d.length < 1) return null;
var points1 = d3_svg_linePoints(this, d, x, y1),
points0 = d3_svg_linePoints(this, d, d3_svg_areaX(points1), y0).reverse();
var points0 = d3_svg_linePoints(this, d, x0, y0),
points1 = d3_svg_linePoints(this, d, x0 === x1 ? d3_svg_areaX(points0) : x1, y0 === y1 ? d3_svg_areaY(points0) : y1);
return "M" + interpolator(points1, tension)
+ "L" + interpolator(points0, tension)
+ "L" + interpolator(points0.reverse(), tension)
+ "Z";
}
area.x = function(v) {
if (!arguments.length) return x;
x = v;
area.x = function(x) {
if (!arguments.length) return x1;
x0 = x1 = x;
return area;
};
area.y0 = function(v) {
if (!arguments.length) return y0;
y0 = v;
area.x0 = function(x) {
if (!arguments.length) return x0;
x0 = x;
return area;
};
area.y1 = function(v) {
area.x1 = function(x) {
if (!arguments.length) return x1;
x1 = x;
return area;
};
area.y = function(y) {
if (!arguments.length) return y1;
y1 = v;
y0 = y1 = y;
return area;
};
area.interpolate = function(v) {
area.y0 = function(y) {
if (!arguments.length) return y0;
y0 = y;
return area;
};
area.y1 = function(y) {
if (!arguments.length) return y1;
y1 = y;
return area;
};
area.interpolate = function(x) {
if (!arguments.length) return interpolate;
interpolator = d3_svg_lineInterpolators[interpolate = v];
interpolator = d3_svg_lineInterpolators[interpolate = x];
return area;
};
area.tension = function(v) {
area.tension = function(x) {
if (!arguments.length) return tension;
tension = v;
tension = x;
return area;
};
@ -52,6 +69,12 @@ d3.svg.area = function() {
function d3_svg_areaX(points) {
return function(d, i) {
return d3_svg_lineX.call(this, points[i], i);
return points[i][0];
};
}
function d3_svg_areaY(points) {
return function(d, i) {
return points[i][1];
};
}

Просмотреть файл

@ -1,5 +1,4 @@
require("./../lib/env-js/envjs/node");
require("./../lib/sizzle/sizzle");
require("./../d3");
var area = d3.svg.area();
@ -20,6 +19,16 @@ console.log(" [[0, 0], [1, 1]]:", area([[0, 0], [1, 1]]));
console.log(" [[0, 0], [1, 1], [2, 0]]:", area([[0, 0], [1, 1], [2, 0]]));
console.log("");
var i = 0,
area = d3.svg.area()
.y(function() { return i++; });
console.log("y(function() { return i++; }):");
console.log(" [[0, 0]]:", area([[0, 0]]));
console.log(" [[0, 0], [1, 1]]:", area([[0, 0], [1, 1]]));
console.log(" [[0, 0], [1, 1], [0, 2]]:", area([[0, 0], [1, 1], [0, 2]]));
console.log("");
var area = d3.svg.area()
.y0(-1);

Просмотреть файл

@ -8,6 +8,11 @@ x(function() { return i++; }):
[[0, 0], [1, 1]]: M1,0L2,1L2,0L1,0Z
[[0, 0], [1, 1], [2, 0]]: M3,0L4,1L5,0L5,0L4,0L3,0Z
y(function() { return i++; }):
[[0, 0]]: M0,0L0,0Z
[[0, 0], [1, 1]]: M0,1L1,2L1,2L0,1Z
[[0, 0], [1, 1], [0, 2]]: M0,3L1,4L0,5L0,5L1,4L0,3Z
y0(-1):
[[0, 0]]: M0,0L0,-1Z
[[0, 0], [1, 1]]: M0,0L1,1L1,-1L0,-1Z