mirror of
https://kevinblog.sytes.net/Code/Jibo-Revival-Group/RoboCommander.git
synced 2026-06-16 05:56:04 +00:00
Initial commit
This commit is contained in:
142
node_modules/d3-voronoi/src/Diagram.js
generated
vendored
Normal file
142
node_modules/d3-voronoi/src/Diagram.js
generated
vendored
Normal file
@@ -0,0 +1,142 @@
|
||||
import {addBeach, removeBeach} from "./Beach";
|
||||
import {sortCellHalfedges, cellHalfedgeStart, clipCells} from "./Cell";
|
||||
import {firstCircle} from "./Circle";
|
||||
import {clipEdges} from "./Edge";
|
||||
import RedBlackTree from "./RedBlackTree";
|
||||
|
||||
export var epsilon = 1e-6;
|
||||
export var epsilon2 = 1e-12;
|
||||
export var beaches;
|
||||
export var cells;
|
||||
export var circles;
|
||||
export var edges;
|
||||
|
||||
function triangleArea(a, b, c) {
|
||||
return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
|
||||
}
|
||||
|
||||
function lexicographic(a, b) {
|
||||
return b[1] - a[1]
|
||||
|| b[0] - a[0];
|
||||
}
|
||||
|
||||
export default function Diagram(sites, extent) {
|
||||
var site = sites.sort(lexicographic).pop(),
|
||||
x,
|
||||
y,
|
||||
circle;
|
||||
|
||||
edges = [];
|
||||
cells = new Array(sites.length);
|
||||
beaches = new RedBlackTree;
|
||||
circles = new RedBlackTree;
|
||||
|
||||
while (true) {
|
||||
circle = firstCircle;
|
||||
if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
|
||||
if (site[0] !== x || site[1] !== y) {
|
||||
addBeach(site);
|
||||
x = site[0], y = site[1];
|
||||
}
|
||||
site = sites.pop();
|
||||
} else if (circle) {
|
||||
removeBeach(circle.arc);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
sortCellHalfedges();
|
||||
|
||||
if (extent) {
|
||||
var x0 = +extent[0][0],
|
||||
y0 = +extent[0][1],
|
||||
x1 = +extent[1][0],
|
||||
y1 = +extent[1][1];
|
||||
clipEdges(x0, y0, x1, y1);
|
||||
clipCells(x0, y0, x1, y1);
|
||||
}
|
||||
|
||||
this.edges = edges;
|
||||
this.cells = cells;
|
||||
|
||||
beaches =
|
||||
circles =
|
||||
edges =
|
||||
cells = null;
|
||||
}
|
||||
|
||||
Diagram.prototype = {
|
||||
constructor: Diagram,
|
||||
|
||||
polygons: function() {
|
||||
var edges = this.edges;
|
||||
|
||||
return this.cells.map(function(cell) {
|
||||
var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
|
||||
polygon.data = cell.site.data;
|
||||
return polygon;
|
||||
});
|
||||
},
|
||||
|
||||
triangles: function() {
|
||||
var triangles = [],
|
||||
edges = this.edges;
|
||||
|
||||
this.cells.forEach(function(cell, i) {
|
||||
if (!(m = (halfedges = cell.halfedges).length)) return;
|
||||
var site = cell.site,
|
||||
halfedges,
|
||||
j = -1,
|
||||
m,
|
||||
s0,
|
||||
e1 = edges[halfedges[m - 1]],
|
||||
s1 = e1.left === site ? e1.right : e1.left;
|
||||
|
||||
while (++j < m) {
|
||||
s0 = s1;
|
||||
e1 = edges[halfedges[j]];
|
||||
s1 = e1.left === site ? e1.right : e1.left;
|
||||
if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
|
||||
triangles.push([site.data, s0.data, s1.data]);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return triangles;
|
||||
},
|
||||
|
||||
links: function() {
|
||||
return this.edges.filter(function(edge) {
|
||||
return edge.right;
|
||||
}).map(function(edge) {
|
||||
return {
|
||||
source: edge.left.data,
|
||||
target: edge.right.data
|
||||
};
|
||||
});
|
||||
},
|
||||
|
||||
find: function(x, y, radius) {
|
||||
var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
|
||||
|
||||
// Use the previously-found cell, or start with an arbitrary one.
|
||||
while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
|
||||
var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
|
||||
|
||||
// Traverse the half-edges to find a closer cell, if any.
|
||||
do {
|
||||
cell = that.cells[i0 = i1], i1 = null;
|
||||
cell.halfedges.forEach(function(e) {
|
||||
var edge = that.edges[e], v = edge.left;
|
||||
if ((v === cell.site || !v) && !(v = edge.right)) return;
|
||||
var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
|
||||
if (v2 < d2) d2 = v2, i1 = v.index;
|
||||
});
|
||||
} while (i1 !== null);
|
||||
|
||||
that._found = i0;
|
||||
|
||||
return radius == null || d2 <= radius * radius ? cell.site : null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user