This commit is contained in:
Mike Bostock 2012-07-02 18:08:52 -07:00
Родитель e71de33e31 2643a869a4
Коммит c5d230d16e
16 изменённых файлов: 327 добавлений и 242 удалений

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

@ -10,7 +10,7 @@ try {
d3_style_setProperty.call(this, name, value + "", priority);
};
}
d3 = {version: "2.9.5"}; // semver
d3 = {version: "2.9.6"}; // semver
function d3_class(ctor, properties) {
try {
for (var key in properties) {
@ -1089,6 +1089,7 @@ d3.interpolateHsl = function(a, b) {
h1 = b.h - h0,
s1 = b.s - s0,
l1 = b.l - l0;
if (h1 > 180) h1 -= 360; else if (h1 < -180) h1 += 360; // shortest path
return function(t) {
return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t).toString();
};
@ -4119,17 +4120,23 @@ d3.svg.axis = function() {
tickEnter.append("line").attr("class", "tick");
tickEnter.append("text");
tickUpdate.select("text").text(tickFormat);
var lineEnter = tickEnter.select("line"),
lineUpdate = tickUpdate.select("line"),
text = tick.select("text").text(tickFormat),
textEnter = tickEnter.select("text"),
textUpdate = tickUpdate.select("text");
switch (orient) {
case "bottom": {
tickTransform = d3_svg_axisX;
subtickEnter.attr("y2", tickMinorSize);
subtickUpdate.attr("x2", 0).attr("y2", tickMinorSize);
tickEnter.select("line").attr("y2", tickMajorSize);
tickEnter.select("text").attr("y", Math.max(tickMajorSize, 0) + tickPadding);
tickUpdate.select("line").attr("x2", 0).attr("y2", tickMajorSize);
tickUpdate.select("text").attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding).attr("dy", ".71em").attr("text-anchor", "middle");
lineEnter.attr("y2", tickMajorSize);
textEnter.attr("y", Math.max(tickMajorSize, 0) + tickPadding);
lineUpdate.attr("x2", 0).attr("y2", tickMajorSize);
textUpdate.attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding);
text.attr("dy", ".71em").attr("text-anchor", "middle");
pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize);
break;
}
@ -4137,10 +4144,11 @@ d3.svg.axis = function() {
tickTransform = d3_svg_axisX;
subtickEnter.attr("y2", -tickMinorSize);
subtickUpdate.attr("x2", 0).attr("y2", -tickMinorSize);
tickEnter.select("line").attr("y2", -tickMajorSize);
tickEnter.select("text").attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
tickUpdate.select("line").attr("x2", 0).attr("y2", -tickMajorSize);
tickUpdate.select("text").attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("dy", "0em").attr("text-anchor", "middle");
lineEnter.attr("y2", -tickMajorSize);
textEnter.attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
lineUpdate.attr("x2", 0).attr("y2", -tickMajorSize);
textUpdate.attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
text.attr("dy", "0em").attr("text-anchor", "middle");
pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize);
break;
}
@ -4148,10 +4156,11 @@ d3.svg.axis = function() {
tickTransform = d3_svg_axisY;
subtickEnter.attr("x2", -tickMinorSize);
subtickUpdate.attr("x2", -tickMinorSize).attr("y2", 0);
tickEnter.select("line").attr("x2", -tickMajorSize);
tickEnter.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding));
tickUpdate.select("line").attr("x2", -tickMajorSize).attr("y2", 0);
tickUpdate.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0).attr("dy", ".32em").attr("text-anchor", "end");
lineEnter.attr("x2", -tickMajorSize);
textEnter.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding));
lineUpdate.attr("x2", -tickMajorSize).attr("y2", 0);
textUpdate.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0);
text.attr("dy", ".32em").attr("text-anchor", "end");
pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize);
break;
}
@ -4159,10 +4168,11 @@ d3.svg.axis = function() {
tickTransform = d3_svg_axisY;
subtickEnter.attr("x2", tickMinorSize);
subtickUpdate.attr("x2", tickMinorSize).attr("y2", 0);
tickEnter.select("line").attr("x2", tickMajorSize);
tickEnter.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding);
tickUpdate.select("line").attr("x2", tickMajorSize).attr("y2", 0);
tickUpdate.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0).attr("dy", ".32em").attr("text-anchor", "start");
lineEnter.attr("x2", tickMajorSize);
textEnter.attr("x", Math.max(tickMajorSize, 0) + tickPadding);
lineUpdate.attr("x2", tickMajorSize).attr("y2", 0);
textUpdate.attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0);
text.attr("dy", ".32em").attr("text-anchor", "start");
pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize);
break;
}
@ -7275,13 +7285,15 @@ function d3_geo_type(types, defaultValue) {
d3.geo.path = function() {
var pointRadius = 4.5,
pointCircle = d3_path_circle(pointRadius),
projection = d3.geo.albersUsa();
projection = d3.geo.albersUsa(),
buffer = [];
function path(d, i) {
if (typeof pointRadius === "function") {
pointCircle = d3_path_circle(pointRadius.apply(this, arguments));
}
return pathType(d) || null;
if (typeof pointRadius === "function") pointCircle = d3_path_circle(pointRadius.apply(this, arguments));
pathType(d);
var result = buffer.length ? buffer.join("") : null;
buffer = [];
return result;
}
function project(coordinates) {
@ -7291,44 +7303,38 @@ d3.geo.path = function() {
var pathType = d3_geo_type({
FeatureCollection: function(o) {
var path = [],
features = o.features,
var features = o.features,
i = -1, // features.index
n = features.length;
while (++i < n) path.push(pathType(features[i].geometry));
return path.join("");
while (++i < n) buffer.push(pathType(features[i].geometry));
},
Feature: function(o) {
return pathType(o.geometry);
pathType(o.geometry);
},
Point: function(o) {
return "M" + project(o.coordinates) + pointCircle;
buffer.push("M", project(o.coordinates), pointCircle);
},
MultiPoint: function(o) {
var path = [],
coordinates = o.coordinates,
var coordinates = o.coordinates,
i = -1, // coordinates.index
n = coordinates.length;
while (++i < n) path.push("M", project(coordinates[i]), pointCircle);
return path.join("");
while (++i < n) buffer.push("M", project(coordinates[i]), pointCircle);
},
LineString: function(o) {
var path = ["M"],
coordinates = o.coordinates,
var coordinates = o.coordinates,
i = -1, // coordinates.index
n = coordinates.length;
while (++i < n) path.push(project(coordinates[i]), "L");
path.pop();
return path.join("");
buffer.push("M");
while (++i < n) buffer.push(project(coordinates[i]), "L");
buffer.pop();
},
MultiLineString: function(o) {
var path = [],
coordinates = o.coordinates,
var coordinates = o.coordinates,
i = -1, // coordinates.index
n = coordinates.length,
subcoordinates, // coordinates[i]
@ -7338,16 +7344,14 @@ d3.geo.path = function() {
subcoordinates = coordinates[i];
j = -1;
m = subcoordinates.length;
path.push("M");
while (++j < m) path.push(project(subcoordinates[j]), "L");
path.pop();
buffer.push("M");
while (++j < m) buffer.push(project(subcoordinates[j]), "L");
buffer.pop();
}
return path.join("");
},
Polygon: function(o) {
var path = [],
coordinates = o.coordinates,
var coordinates = o.coordinates,
i = -1, // coordinates.index
n = coordinates.length,
subcoordinates, // coordinates[i]
@ -7357,17 +7361,15 @@ d3.geo.path = function() {
subcoordinates = coordinates[i];
j = -1;
if ((m = subcoordinates.length - 1) > 0) {
path.push("M");
while (++j < m) path.push(project(subcoordinates[j]), "L");
path[path.length - 1] = "Z";
buffer.push("M");
while (++j < m) buffer.push(project(subcoordinates[j]), "L");
buffer[buffer.length - 1] = "Z";
}
}
return path.join("");
},
MultiPolygon: function(o) {
var path = [],
coordinates = o.coordinates,
var coordinates = o.coordinates,
i = -1, // coordinates index
n = coordinates.length,
subcoordinates, // coordinates[i]
@ -7384,22 +7386,19 @@ d3.geo.path = function() {
subsubcoordinates = subcoordinates[j];
k = -1;
if ((p = subsubcoordinates.length - 1) > 0) {
path.push("M");
while (++k < p) path.push(project(subsubcoordinates[k]), "L");
path[path.length - 1] = "Z";
buffer.push("M");
while (++k < p) buffer.push(project(subsubcoordinates[k]), "L");
buffer[buffer.length - 1] = "Z";
}
}
}
return path.join("");
},
GeometryCollection: function(o) {
var path = [],
geometries = o.geometries,
var geometries = o.geometries,
i = -1, // geometries index
n = geometries.length;
while (++i < n) path.push(pathType(geometries[i]));
return path.join("");
while (++i < n) buffer.push(pathType(geometries[i]));
}
});
@ -7625,7 +7624,7 @@ d3.geo.circle = function() {
var origin = [0, 0],
degrees = 90 - 1e-2,
radians = degrees * d3_geo_radians,
arc = d3.geo.greatArc().target(d3_identity);
arc = d3.geo.greatArc().source(origin).target(d3_identity);
function circle() {
// TODO render a circle as a Polygon
@ -7636,8 +7635,8 @@ d3.geo.circle = function() {
}
circle.clip = function(d) {
arc.source(typeof origin === "function" ? origin.apply(this, arguments) : origin);
return clipType(d);
if (typeof origin === "function") arc.source(origin.apply(this, arguments));
return clipType(d) || null;
};
var clipType = d3_geo_type({
@ -7717,9 +7716,11 @@ d3.geo.circle = function() {
d0 = d1;
}
if (p1 && clipped.length) {
d1 = arc.distance(p2 = clipped[0]);
clipped.push(d3_geo_greatArcInterpolate(p1, p2)((d0 - radians) / (d0 - d1)));
// Close the clipped polygon if necessary.
p0 = coordinates[0];
p1 = clipped[0];
if (p1 && p2[0] === p0[0] && p2[1] === p0[1] && !(p2[0] === p1[0] && p2[1] === p1[1])) {
clipped.push(p1);
}
return resample(clipped);
@ -7747,6 +7748,7 @@ d3.geo.circle = function() {
circle.origin = function(x) {
if (!arguments.length) return origin;
origin = x;
if (typeof origin !== "function") arc.source(origin);
return circle;
};
@ -7756,58 +7758,49 @@ d3.geo.circle = function() {
return circle;
};
// Precision is specified in degrees.
circle.precision = function(x) {
if (!arguments.length) return arc.precision();
arc.precision(x);
return circle;
};
return circle;
return d3.rebind(circle, arc, "precision");
}
d3.geo.greatArc = function() {
var source = d3_geo_greatArcSource,
target = d3_geo_greatArcTarget,
precision = 6 * d3_geo_radians;
var source = d3_geo_greatArcSource, p0,
target = d3_geo_greatArcTarget, p1,
precision = 6 * d3_geo_radians,
interpolate = d3_geo_greatArcInterpolator();
function greatArc() {
var a = typeof source === "function" ? source.apply(this, arguments) : source,
b = typeof target === "function" ? target.apply(this, arguments) : target,
i = d3_geo_greatArcInterpolate(a, b),
dt = precision / i.d,
var d = greatArc.distance.apply(this, arguments), // initializes the interpolator, too
t = 0,
coordinates = [a];
while ((t += dt) < 1) coordinates.push(i(t));
coordinates.push(b);
return {
type: "LineString",
coordinates: coordinates
};
dt = precision / d,
coordinates = [p0];
while ((t += dt) < 1) coordinates.push(interpolate(t));
coordinates.push(p1);
return {type: "LineString", coordinates: coordinates};
}
// Length returned in radians; multiply by radius for distance.
greatArc.distance = function() {
var a = typeof source === "function" ? source.apply(this, arguments) : source,
b = typeof target === "function" ? target.apply(this, arguments) : target;
return d3_geo_greatArcInterpolate(a, b).d;
if (typeof source === "function") interpolate.source(p0 = source.apply(this, arguments));
if (typeof target === "function") interpolate.target(p1 = target.apply(this, arguments));
return interpolate.distance();
};
greatArc.source = function(x) {
greatArc.source = function(_) {
if (!arguments.length) return source;
source = x;
source = _;
if (typeof source !== "function") interpolate.source(p0 = source);
return greatArc;
};
greatArc.target = function(x) {
greatArc.target = function(_) {
if (!arguments.length) return target;
target = x;
target = _;
if (typeof target !== "function") interpolate.target(p1 = target);
return greatArc;
};
// Precision is specified in degrees.
greatArc.precision = function(x) {
greatArc.precision = function(_) {
if (!arguments.length) return precision / d3_geo_radians;
precision = x * d3_geo_radians;
precision = _ * d3_geo_radians;
return greatArc;
};
@ -7822,29 +7815,59 @@ function d3_geo_greatArcTarget(d) {
return d.target;
}
function d3_geo_greatArcInterpolate(a, b) {
var x0 = a[0] * d3_geo_radians, cx0 = Math.cos(x0), sx0 = Math.sin(x0),
y0 = a[1] * d3_geo_radians, cy0 = Math.cos(y0), sy0 = Math.sin(y0),
x1 = b[0] * d3_geo_radians, cx1 = Math.cos(x1), sx1 = Math.sin(x1),
y1 = b[1] * d3_geo_radians, cy1 = Math.cos(y1), sy1 = Math.sin(y1),
d = interpolate.d = Math.acos(Math.max(-1, Math.min(1, sy0 * sy1 + cy0 * cy1 * Math.cos(x1 - x0)))),
sd = Math.sin(d);
function d3_geo_greatArcInterpolator() {
var x0, y0, cy0, sy0, kx0, ky0,
x1, y1, cy1, sy1, kx1, ky1,
d,
k;
// From http://williams.best.vwh.net/avform.htm#Intermediate
function interpolate(t) {
var A = Math.sin(d - (t *= d)) / sd,
B = Math.sin(t) / sd,
x = A * cy0 * cx0 + B * cy1 * cx1,
y = A * cy0 * sx0 + B * cy1 * sx1,
z = A * sy0 + B * sy1;
var B = Math.sin(t *= d) * k,
A = Math.sin(d - t) * k,
x = A * kx0 + B * kx1,
y = A * ky0 + B * ky1,
z = A * sy0 + B * sy1;
return [
Math.atan2(y, x) / d3_geo_radians,
Math.atan2(z, Math.sqrt(x * x + y * y)) / d3_geo_radians
];
}
interpolate.distance = function() {
if (d == null) k = 1 / Math.sin(d = Math.acos(Math.max(-1, Math.min(1, sy0 * sy1 + cy0 * cy1 * Math.cos(x1 - x0)))));
return d;
};
interpolate.source = function(_) {
var cx0 = Math.cos(x0 = _[0] * d3_geo_radians),
sx0 = Math.sin(x0);
cy0 = Math.cos(y0 = _[1] * d3_geo_radians);
sy0 = Math.sin(y0);
kx0 = cy0 * cx0;
ky0 = cy0 * sx0;
d = null;
return interpolate;
};
interpolate.target = function(_) {
var cx1 = Math.cos(x1 = _[0] * d3_geo_radians),
sx1 = Math.sin(x1);
cy1 = Math.cos(y1 = _[1] * d3_geo_radians);
sy1 = Math.sin(y1);
kx1 = cy1 * cx1;
ky1 = cy1 * sx1;
d = null;
return interpolate;
};
return interpolate;
}
function d3_geo_greatArcInterpolate(a, b) {
var i = d3_geo_greatArcInterpolator().source(a).target(b);
i.distance();
return i;
}
d3.geo.greatCircle = d3.geo.circle;
d3.geom = {};
/**

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

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

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

@ -1,6 +1,6 @@
{
"name": "d3",
"version": "2.9.5",
"version": "2.9.6",
"description": "A small, free JavaScript library for manipulating documents based on data.",
"keywords": [
"dom",

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

@ -1 +1 @@
d3 = {version: "2.9.5"}; // semver
d3 = {version: "2.9.6"}; // semver

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

@ -171,6 +171,7 @@ d3.interpolateHsl = function(a, b) {
h1 = b.h - h0,
s1 = b.s - s0,
l1 = b.l - l0;
if (h1 > 180) h1 -= 360; else if (h1 < -180) h1 += 360; // shortest path
return function(t) {
return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t).toString();
};

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

@ -4,7 +4,7 @@ d3.geo.circle = function() {
var origin = [0, 0],
degrees = 90 - 1e-2,
radians = degrees * d3_geo_radians,
arc = d3.geo.greatArc().target(d3_identity);
arc = d3.geo.greatArc().source(origin).target(d3_identity);
function circle() {
// TODO render a circle as a Polygon
@ -15,8 +15,8 @@ d3.geo.circle = function() {
}
circle.clip = function(d) {
arc.source(typeof origin === "function" ? origin.apply(this, arguments) : origin);
return clipType(d);
if (typeof origin === "function") arc.source(origin.apply(this, arguments));
return clipType(d) || null;
};
var clipType = d3_geo_type({
@ -96,9 +96,11 @@ d3.geo.circle = function() {
d0 = d1;
}
if (p1 && clipped.length) {
d1 = arc.distance(p2 = clipped[0]);
clipped.push(d3_geo_greatArcInterpolate(p1, p2)((d0 - radians) / (d0 - d1)));
// Close the clipped polygon if necessary.
p0 = coordinates[0];
p1 = clipped[0];
if (p1 && p2[0] === p0[0] && p2[1] === p0[1] && !(p2[0] === p1[0] && p2[1] === p1[1])) {
clipped.push(p1);
}
return resample(clipped);
@ -126,6 +128,7 @@ d3.geo.circle = function() {
circle.origin = function(x) {
if (!arguments.length) return origin;
origin = x;
if (typeof origin !== "function") arc.source(origin);
return circle;
};
@ -135,12 +138,5 @@ d3.geo.circle = function() {
return circle;
};
// Precision is specified in degrees.
circle.precision = function(x) {
if (!arguments.length) return arc.precision();
arc.precision(x);
return circle;
};
return circle;
return d3.rebind(circle, arc, "precision");
}

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

@ -1,46 +1,44 @@
d3.geo.greatArc = function() {
var source = d3_geo_greatArcSource,
target = d3_geo_greatArcTarget,
precision = 6 * d3_geo_radians;
var source = d3_geo_greatArcSource, p0,
target = d3_geo_greatArcTarget, p1,
precision = 6 * d3_geo_radians,
interpolate = d3_geo_greatArcInterpolator();
function greatArc() {
var a = typeof source === "function" ? source.apply(this, arguments) : source,
b = typeof target === "function" ? target.apply(this, arguments) : target,
i = d3_geo_greatArcInterpolate(a, b),
dt = precision / i.d,
var d = greatArc.distance.apply(this, arguments), // initializes the interpolator, too
t = 0,
coordinates = [a];
while ((t += dt) < 1) coordinates.push(i(t));
coordinates.push(b);
return {
type: "LineString",
coordinates: coordinates
};
dt = precision / d,
coordinates = [p0];
while ((t += dt) < 1) coordinates.push(interpolate(t));
coordinates.push(p1);
return {type: "LineString", coordinates: coordinates};
}
// Length returned in radians; multiply by radius for distance.
greatArc.distance = function() {
var a = typeof source === "function" ? source.apply(this, arguments) : source,
b = typeof target === "function" ? target.apply(this, arguments) : target;
return d3_geo_greatArcInterpolate(a, b).d;
if (typeof source === "function") interpolate.source(p0 = source.apply(this, arguments));
if (typeof target === "function") interpolate.target(p1 = target.apply(this, arguments));
return interpolate.distance();
};
greatArc.source = function(x) {
greatArc.source = function(_) {
if (!arguments.length) return source;
source = x;
source = _;
if (typeof source !== "function") interpolate.source(p0 = source);
return greatArc;
};
greatArc.target = function(x) {
greatArc.target = function(_) {
if (!arguments.length) return target;
target = x;
target = _;
if (typeof target !== "function") interpolate.target(p1 = target);
return greatArc;
};
// Precision is specified in degrees.
greatArc.precision = function(x) {
greatArc.precision = function(_) {
if (!arguments.length) return precision / d3_geo_radians;
precision = x * d3_geo_radians;
precision = _ * d3_geo_radians;
return greatArc;
};
@ -55,26 +53,56 @@ function d3_geo_greatArcTarget(d) {
return d.target;
}
function d3_geo_greatArcInterpolate(a, b) {
var x0 = a[0] * d3_geo_radians, cx0 = Math.cos(x0), sx0 = Math.sin(x0),
y0 = a[1] * d3_geo_radians, cy0 = Math.cos(y0), sy0 = Math.sin(y0),
x1 = b[0] * d3_geo_radians, cx1 = Math.cos(x1), sx1 = Math.sin(x1),
y1 = b[1] * d3_geo_radians, cy1 = Math.cos(y1), sy1 = Math.sin(y1),
d = interpolate.d = Math.acos(Math.max(-1, Math.min(1, sy0 * sy1 + cy0 * cy1 * Math.cos(x1 - x0)))),
sd = Math.sin(d);
function d3_geo_greatArcInterpolator() {
var x0, y0, cy0, sy0, kx0, ky0,
x1, y1, cy1, sy1, kx1, ky1,
d,
k;
// From http://williams.best.vwh.net/avform.htm#Intermediate
function interpolate(t) {
var A = Math.sin(d - (t *= d)) / sd,
B = Math.sin(t) / sd,
x = A * cy0 * cx0 + B * cy1 * cx1,
y = A * cy0 * sx0 + B * cy1 * sx1,
z = A * sy0 + B * sy1;
var B = Math.sin(t *= d) * k,
A = Math.sin(d - t) * k,
x = A * kx0 + B * kx1,
y = A * ky0 + B * ky1,
z = A * sy0 + B * sy1;
return [
Math.atan2(y, x) / d3_geo_radians,
Math.atan2(z, Math.sqrt(x * x + y * y)) / d3_geo_radians
];
}
interpolate.distance = function() {
if (d == null) k = 1 / Math.sin(d = Math.acos(Math.max(-1, Math.min(1, sy0 * sy1 + cy0 * cy1 * Math.cos(x1 - x0)))));
return d;
};
interpolate.source = function(_) {
var cx0 = Math.cos(x0 = _[0] * d3_geo_radians),
sx0 = Math.sin(x0);
cy0 = Math.cos(y0 = _[1] * d3_geo_radians);
sy0 = Math.sin(y0);
kx0 = cy0 * cx0;
ky0 = cy0 * sx0;
d = null;
return interpolate;
};
interpolate.target = function(_) {
var cx1 = Math.cos(x1 = _[0] * d3_geo_radians),
sx1 = Math.sin(x1);
cy1 = Math.cos(y1 = _[1] * d3_geo_radians);
sy1 = Math.sin(y1);
kx1 = cy1 * cx1;
ky1 = cy1 * sx1;
d = null;
return interpolate;
};
return interpolate;
}
function d3_geo_greatArcInterpolate(a, b) {
var i = d3_geo_greatArcInterpolator().source(a).target(b);
i.distance();
return i;
}

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

@ -8,13 +8,15 @@
d3.geo.path = function() {
var pointRadius = 4.5,
pointCircle = d3_path_circle(pointRadius),
projection = d3.geo.albersUsa();
projection = d3.geo.albersUsa(),
buffer = [];
function path(d, i) {
if (typeof pointRadius === "function") {
pointCircle = d3_path_circle(pointRadius.apply(this, arguments));
}
return pathType(d) || null;
if (typeof pointRadius === "function") pointCircle = d3_path_circle(pointRadius.apply(this, arguments));
pathType(d);
var result = buffer.length ? buffer.join("") : null;
buffer = [];
return result;
}
function project(coordinates) {
@ -24,44 +26,38 @@ d3.geo.path = function() {
var pathType = d3_geo_type({
FeatureCollection: function(o) {
var path = [],
features = o.features,
var features = o.features,
i = -1, // features.index
n = features.length;
while (++i < n) path.push(pathType(features[i].geometry));
return path.join("");
while (++i < n) buffer.push(pathType(features[i].geometry));
},
Feature: function(o) {
return pathType(o.geometry);
pathType(o.geometry);
},
Point: function(o) {
return "M" + project(o.coordinates) + pointCircle;
buffer.push("M", project(o.coordinates), pointCircle);
},
MultiPoint: function(o) {
var path = [],
coordinates = o.coordinates,
var coordinates = o.coordinates,
i = -1, // coordinates.index
n = coordinates.length;
while (++i < n) path.push("M", project(coordinates[i]), pointCircle);
return path.join("");
while (++i < n) buffer.push("M", project(coordinates[i]), pointCircle);
},
LineString: function(o) {
var path = ["M"],
coordinates = o.coordinates,
var coordinates = o.coordinates,
i = -1, // coordinates.index
n = coordinates.length;
while (++i < n) path.push(project(coordinates[i]), "L");
path.pop();
return path.join("");
buffer.push("M");
while (++i < n) buffer.push(project(coordinates[i]), "L");
buffer.pop();
},
MultiLineString: function(o) {
var path = [],
coordinates = o.coordinates,
var coordinates = o.coordinates,
i = -1, // coordinates.index
n = coordinates.length,
subcoordinates, // coordinates[i]
@ -71,16 +67,14 @@ d3.geo.path = function() {
subcoordinates = coordinates[i];
j = -1;
m = subcoordinates.length;
path.push("M");
while (++j < m) path.push(project(subcoordinates[j]), "L");
path.pop();
buffer.push("M");
while (++j < m) buffer.push(project(subcoordinates[j]), "L");
buffer.pop();
}
return path.join("");
},
Polygon: function(o) {
var path = [],
coordinates = o.coordinates,
var coordinates = o.coordinates,
i = -1, // coordinates.index
n = coordinates.length,
subcoordinates, // coordinates[i]
@ -90,17 +84,15 @@ d3.geo.path = function() {
subcoordinates = coordinates[i];
j = -1;
if ((m = subcoordinates.length - 1) > 0) {
path.push("M");
while (++j < m) path.push(project(subcoordinates[j]), "L");
path[path.length - 1] = "Z";
buffer.push("M");
while (++j < m) buffer.push(project(subcoordinates[j]), "L");
buffer[buffer.length - 1] = "Z";
}
}
return path.join("");
},
MultiPolygon: function(o) {
var path = [],
coordinates = o.coordinates,
var coordinates = o.coordinates,
i = -1, // coordinates index
n = coordinates.length,
subcoordinates, // coordinates[i]
@ -117,22 +109,19 @@ d3.geo.path = function() {
subsubcoordinates = subcoordinates[j];
k = -1;
if ((p = subsubcoordinates.length - 1) > 0) {
path.push("M");
while (++k < p) path.push(project(subsubcoordinates[k]), "L");
path[path.length - 1] = "Z";
buffer.push("M");
while (++k < p) buffer.push(project(subsubcoordinates[k]), "L");
buffer[buffer.length - 1] = "Z";
}
}
}
return path.join("");
},
GeometryCollection: function(o) {
var path = [],
geometries = o.geometries,
var geometries = o.geometries,
i = -1, // geometries index
n = geometries.length;
while (++i < n) path.push(pathType(geometries[i]));
return path.join("");
while (++i < n) buffer.push(pathType(geometries[i]));
}
});

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

@ -45,17 +45,23 @@ d3.svg.axis = function() {
tickEnter.append("line").attr("class", "tick");
tickEnter.append("text");
tickUpdate.select("text").text(tickFormat);
var lineEnter = tickEnter.select("line"),
lineUpdate = tickUpdate.select("line"),
text = tick.select("text").text(tickFormat),
textEnter = tickEnter.select("text"),
textUpdate = tickUpdate.select("text");
switch (orient) {
case "bottom": {
tickTransform = d3_svg_axisX;
subtickEnter.attr("y2", tickMinorSize);
subtickUpdate.attr("x2", 0).attr("y2", tickMinorSize);
tickEnter.select("line").attr("y2", tickMajorSize);
tickEnter.select("text").attr("y", Math.max(tickMajorSize, 0) + tickPadding);
tickUpdate.select("line").attr("x2", 0).attr("y2", tickMajorSize);
tickUpdate.select("text").attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding).attr("dy", ".71em").attr("text-anchor", "middle");
lineEnter.attr("y2", tickMajorSize);
textEnter.attr("y", Math.max(tickMajorSize, 0) + tickPadding);
lineUpdate.attr("x2", 0).attr("y2", tickMajorSize);
textUpdate.attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding);
text.attr("dy", ".71em").attr("text-anchor", "middle");
pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize);
break;
}
@ -63,10 +69,11 @@ d3.svg.axis = function() {
tickTransform = d3_svg_axisX;
subtickEnter.attr("y2", -tickMinorSize);
subtickUpdate.attr("x2", 0).attr("y2", -tickMinorSize);
tickEnter.select("line").attr("y2", -tickMajorSize);
tickEnter.select("text").attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
tickUpdate.select("line").attr("x2", 0).attr("y2", -tickMajorSize);
tickUpdate.select("text").attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("dy", "0em").attr("text-anchor", "middle");
lineEnter.attr("y2", -tickMajorSize);
textEnter.attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
lineUpdate.attr("x2", 0).attr("y2", -tickMajorSize);
textUpdate.attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
text.attr("dy", "0em").attr("text-anchor", "middle");
pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize);
break;
}
@ -74,10 +81,11 @@ d3.svg.axis = function() {
tickTransform = d3_svg_axisY;
subtickEnter.attr("x2", -tickMinorSize);
subtickUpdate.attr("x2", -tickMinorSize).attr("y2", 0);
tickEnter.select("line").attr("x2", -tickMajorSize);
tickEnter.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding));
tickUpdate.select("line").attr("x2", -tickMajorSize).attr("y2", 0);
tickUpdate.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0).attr("dy", ".32em").attr("text-anchor", "end");
lineEnter.attr("x2", -tickMajorSize);
textEnter.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding));
lineUpdate.attr("x2", -tickMajorSize).attr("y2", 0);
textUpdate.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0);
text.attr("dy", ".32em").attr("text-anchor", "end");
pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize);
break;
}
@ -85,10 +93,11 @@ d3.svg.axis = function() {
tickTransform = d3_svg_axisY;
subtickEnter.attr("x2", tickMinorSize);
subtickUpdate.attr("x2", tickMinorSize).attr("y2", 0);
tickEnter.select("line").attr("x2", tickMajorSize);
tickEnter.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding);
tickUpdate.select("line").attr("x2", tickMajorSize).attr("y2", 0);
tickUpdate.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0).attr("dy", ".32em").attr("text-anchor", "start");
lineEnter.attr("x2", tickMajorSize);
textEnter.attr("x", Math.max(tickMajorSize, 0) + tickPadding);
lineUpdate.attr("x2", tickMajorSize).attr("y2", 0);
textUpdate.attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0);
text.attr("dy", ".32em").attr("text-anchor", "start");
pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize);
break;
}

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

@ -143,22 +143,22 @@ suite.addBatch({
return d3.interpolateHsl;
},
"parses string input": function(interpolate) {
assert.equal(interpolate("steelblue", "#f00")(.2), "#38c3a2");
assert.equal(interpolate("steelblue", "#f00")(.6), "#96e11c");
assert.equal(interpolate("steelblue", "#f00")(.2), "#383dc3");
assert.equal(interpolate("steelblue", "#f00")(.6), "#dd1ce1");
},
"parses d3.hsl input": function(interpolate) {
assert.equal(interpolate(d3.hsl("steelblue"), "#f00")(.2), "#38c3a2");
assert.equal(interpolate("steelblue", d3.hsl(0, 1, .5))(.6), "#96e11c");
assert.equal(interpolate(d3.hsl("steelblue"), "#f00")(.2), "#383dc3");
assert.equal(interpolate("steelblue", d3.hsl(0, 1, .5))(.6), "#dd1ce1");
},
"parses d3.rgb input": function(interpolate) {
assert.equal(interpolate(d3.rgb("steelblue"), "#f00")(.2), "#38c3a2");
assert.equal(interpolate("steelblue", d3.rgb(255, 0, 0))(.6), "#96e11c");
assert.equal(interpolate(d3.rgb("steelblue"), "#f00")(.2), "#383dc3");
assert.equal(interpolate("steelblue", d3.rgb(255, 0, 0))(.6), "#dd1ce1");
},
"interpolates in HSL color space": function(interpolate) {
assert.equal(interpolate("steelblue", "#f00")(.2), "#38c3a2");
assert.equal(interpolate("steelblue", "#f00")(.2), "#383dc3");
},
"outputs a hexadecimal string": function(interpolate) {
assert.equal(interpolate("steelblue", "#f00")(.2), "#38c3a2");
assert.equal(interpolate("steelblue", "#f00")(.2), "#383dc3");
}
}
});

39
test/geo/circle-test.js Normal file
Просмотреть файл

@ -0,0 +1,39 @@
require("../env");
var vows = require("vows"),
assert = require("assert");
var suite = vows.describe("d3.geo.circle");
suite.addBatch({
"circle": {
"clip": {
topic: function() {
return d3.geo.circle().origin([-71.03, -42.37]).clip;
},
"grid component": function(clip) {
var yStepsBig = d3.range(-90, 90, 10);
assert.inDelta(clip({type: "LineString", coordinates: yStepsBig.map(function(y) { return [110, y]; })}).coordinates, [
[110, -90],
[110, -84],
[110, -80],
[110, -74],
[110, -70],
[110, -64],
[110, -60],
[110, -54],
[110, -50],
[110, -47.63539018933809]
], 1e-6);
},
"can completely clip a LineString": function(clip) {
assert.isNull(clip({type: "LineString", coordinates: [[90.0, -42.37], [95.0, -42.37], [90.0, -42.37]]}));
},
"doesn't insert a duplicate point": function(clip) {
assert.inDelta(clip({type: "LineString", coordinates: [[0, 0]]}).coordinates, [[0, 0]], 1e-6);
}
}
}
});
suite.export(module);

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

@ -97,7 +97,7 @@ suite.addBatch({
},
"can specify a custom interpolator": function(linear) {
var x = linear().range(["red", "blue"]).interpolate(d3.interpolateHsl);
assert.equal(x(.5), "#00ff00");
assert.equal(x(.5), "#ff00ff");
}
},
@ -252,7 +252,7 @@ suite.addBatch({
"changes to the interpolator are isolated": function(linear) {
var x = linear().range(["red", "blue"]), y = x.copy();
x.interpolate(d3.interpolateHsl);
assert.equal(x(0.5), "#00ff00");
assert.equal(x(0.5), "#ff00ff");
assert.equal(y(0.5), "#800080");
assert.equal(y.interpolate(), d3.interpolate);
},

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

@ -92,7 +92,7 @@ suite.addBatch({
},
"can specify a custom interpolator": function(log) {
var x = log().range(["red", "blue"]).interpolate(d3.interpolateHsl);
assert.equal(x(5), "#00ffcb");
assert.equal(x(5), "#9a00ff");
}
},
@ -269,7 +269,7 @@ suite.addBatch({
"changes to the interpolator are isolated": function(log) {
var x = log().range(["red", "blue"]), y = x.copy();
x.interpolate(d3.interpolateHsl);
assert.equal(x(5), "#00ffcb");
assert.equal(x(5), "#9a00ff");
assert.equal(y(5), "#4d00b2");
assert.equal(y.interpolate(), d3.interpolate);
},

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

@ -127,7 +127,7 @@ suite.addBatch({
},
"can specify a custom interpolator": function(pow) {
var x = pow().range(["red", "blue"]).interpolate(d3.interpolateHsl);
assert.equal(x(.5), "#00ff00");
assert.equal(x(.5), "#ff00ff");
}
},
@ -240,7 +240,7 @@ suite.addBatch({
"changes to the interpolator are isolated": function(pow) {
var x = pow().range(["red", "blue"]), y = x.copy();
x.interpolate(d3.interpolateHsl);
assert.equal(x(0.5), "#00ff00");
assert.equal(x(0.5), "#ff00ff");
assert.equal(y(0.5), "#800080");
assert.equal(y.interpolate(), d3.interpolate);
},

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

@ -124,7 +124,7 @@ suite.addBatch({
},
"can specify a custom interpolator": function(sqrt) {
var x = sqrt().range(["red", "blue"]).interpolate(d3.interpolateHsl);
assert.equal(x(.25), "#00ff00");
assert.equal(x(.25), "#ff00ff");
}
},
@ -233,7 +233,7 @@ suite.addBatch({
"changes to the interpolator are isolated": function(sqrt) {
var x = sqrt().range(["red", "blue"]), y = x.copy();
x.interpolate(d3.interpolateHsl);
assert.equal(x(0.5), "#00ffd3");
assert.equal(x(0.5), "#9500ff");
assert.equal(y(0.5), "#4b00b4");
assert.equal(y.interpolate(), d3.interpolate);
},

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

@ -42,7 +42,7 @@ suite.addBatch({
"changes to the interpolator are isolated": function(scale) {
var x = scale().domain([local(2009, 0, 1), local(2010, 0, 1)]).range(["red", "blue"]), y = x.copy();
x.interpolate(d3.interpolateHsl);
assert.equal(x(local(2009, 6, 1)), "#04ff00");
assert.equal(x(local(2009, 6, 1)), "#ff00fd");
assert.equal(y(local(2009, 6, 1)), "#81007e");
assert.equal(y.interpolate(), d3.interpolate);
},