d3-jsnext
Version:
d3, but futuristic
115 lines (95 loc) • 3.3 kB
JavaScript
import { d3_functor } from '../core/functor';
import { d3_geom_voronoiHalfEdgeOrder, d3_geom_voronoi } from './voronoi/index';
import { ε } from '../math/trigonometry';
import { d3_geom_pointY, d3_geom_pointX } from './point';
import { d3$geom } from './geom';
var d3$geom$voronoi;
d3$geom$voronoi = function(points) {
var x = d3_geom_pointX,
y = d3_geom_pointY,
fx = x,
fy = y,
clipExtent = d3_geom_voronoiClipExtent;
// @deprecated; use voronoi(data) instead.
if (points) return voronoi(points);
function voronoi(data) {
var polygons = new Array(data.length),
x0 = clipExtent[0][0],
y0 = clipExtent[0][1],
x1 = clipExtent[1][0],
y1 = clipExtent[1][1];
d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {
var edges = cell.edges,
site = cell.site,
polygon = polygons[i] = edges.length ? edges.map(function(e) { var s = e.start(); return [s.x, s.y]; })
: site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [[x0, y1], [x1, y1], [x1, y0], [x0, y0]]
: [];
polygon.point = data[i];
});
return polygons;
}
function sites(data) {
return data.map(function(d, i) {
return {
x: Math.round(fx(d, i) / ε) * ε,
y: Math.round(fy(d, i) / ε) * ε,
i: i
};
});
}
voronoi.links = function(data) {
return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {
return edge.l && edge.r;
}).map(function(edge) {
return {
source: data[edge.l.i],
target: data[edge.r.i]
};
});
};
voronoi.triangles = function(data) {
var triangles = [];
d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {
var site = cell.site,
edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder),
j = -1,
m = edges.length,
e0,
s0,
e1 = edges[m - 1].edge,
s1 = e1.l === site ? e1.r : e1.l;
while (++j < m) {
e0 = e1;
s0 = s1;
e1 = edges[j].edge;
s1 = e1.l === site ? e1.r : e1.l;
if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {
triangles.push([data[i], data[s0.i], data[s1.i]]);
}
}
});
return triangles;
};
voronoi.x = function(_) {
return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;
};
voronoi.y = function(_) {
return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;
};
voronoi.clipExtent = function(_) {
if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;
clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;
return voronoi;
};
// @deprecated; use clipExtent instead.
voronoi.size = function(_) {
if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];
return voronoi.clipExtent(_ && [[0, 0], _]);
};
return voronoi;
};
var d3_geom_voronoiClipExtent = [[-1e6, -1e6], [1e6, 1e6]];
function d3_geom_voronoiTriangleArea(a, b, c) {
return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);
}
export { d3$geom$voronoi, d3_geom_voronoiTriangleArea, d3_geom_voronoiClipExtent };