Sort half-edges before generating triangles.

Also, ensure triangles are only generated for connected edges, which is
not always the case in unclosed (border) sites.
This commit is contained in:
Jason Davies 2013-10-05 21:05:13 +01:00 коммит произвёл Mike Bostock
Родитель ebf9a94ac7
Коммит 859d0c3818
3 изменённых файлов: 15 добавлений и 9 удалений

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

@ -5160,13 +5160,15 @@ d3 = function() {
voronoi.triangles = function(data) { voronoi.triangles = function(data) {
var triangles = []; var triangles = [];
d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) { d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {
var site = cell.site, edges = cell.edges, j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l; var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, h0, s0, h1 = edges[m - 1], e1 = h1.edge, s1 = e1.l === site ? e1.r : e1.l;
while (++j < m) { while (++j < m) {
e0 = e1; e0 = e1;
h0 = h1;
s0 = s1; s0 = s1;
e1 = edges[j].edge; h1 = edges[j];
e1 = h1.edge;
s1 = e1.l === site ? e1.r : e1.l; s1 = e1.l === site ? e1.r : e1.l;
if (d3_geom_voronoiTriangleArea(site, s0, s1) < 0) { if (h0.end() === h1.start() && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {
triangles.push([ data[i], data[s0.i], data[s1.i] ]); triangles.push([ data[i], data[s0.i], data[s1.i] ]);
} }
} }

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

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

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

@ -51,20 +51,24 @@ d3.geom.voronoi = function(points) {
d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) { d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {
var site = cell.site, var site = cell.site,
edges = cell.edges, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder),
j = -1, j = -1,
m = edges.length, m = edges.length,
e0, e0,
h0,
s0, s0,
e1 = edges[m - 1].edge, h1 = edges[m - 1],
e1 = h1.edge,
s1 = e1.l === site ? e1.r : e1.l; s1 = e1.l === site ? e1.r : e1.l;
while (++j < m) { while (++j < m) {
e0 = e1; e0 = e1;
h0 = h1;
s0 = s1; s0 = s1;
e1 = edges[j].edge; h1 = edges[j];
e1 = h1.edge;
s1 = e1.l === site ? e1.r : e1.l; s1 = e1.l === site ? e1.r : e1.l;
if (d3_geom_voronoiTriangleArea(site, s0, s1) < 0) { if (h0.end() === h1.start() && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {
triangles.push([data[i], data[s0.i], data[s1.i]]); triangles.push([data[i], data[s0.i], data[s1.i]]);
} }
} }