Changeset 96999 in spip-zone
- Timestamp:
- May 6, 2016, 9:37:50 AM (5 years ago)
- Location:
- _plugins_/d3js/trunk/javascript
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
_plugins_/d3js/trunk/javascript/topojson.js
r96616 r96999 1 !function() { 2 var topojson = { 3 version: "1.6.19", 4 mesh: function(topology) { return object(topology, meshArcs.apply(this, arguments)); }, 5 meshArcs: meshArcs, 6 merge: function(topology) { return object(topology, mergeArcs.apply(this, arguments)); }, 7 mergeArcs: mergeArcs, 8 feature: featureOrCollection, 9 neighbors: neighbors, 10 presimplify: presimplify 11 }; 12 13 function stitchArcs(topology, arcs) { 14 var stitchedArcs = {}, 15 fragmentByStart = {}, 16 fragmentByEnd = {}, 17 fragments = [], 18 emptyIndex = -1; 19 20 // Stitch empty arcs first, since they may be subsumed by other arcs. 21 arcs.forEach(function(i, j) { 22 var arc = topology.arcs[i < 0 ? ~i : i], t; 23 if (arc.length < 3 && !arc[1][0] && !arc[1][1]) { 24 t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t; 25 } 26 }); 27 28 arcs.forEach(function(i) { 29 var e = ends(i), 30 start = e[0], 31 end = e[1], 32 f, g; 33 34 if (f = fragmentByEnd[start]) { 35 delete fragmentByEnd[f.end]; 36 f.push(i); 37 f.end = end; 38 if (g = fragmentByStart[end]) { 39 delete fragmentByStart[g.start]; 40 var fg = g === f ? f : f.concat(g); 41 fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg; 42 } else { 43 fragmentByStart[f.start] = fragmentByEnd[f.end] = f; 44 } 45 } else if (f = fragmentByStart[end]) { 46 delete fragmentByStart[f.start]; 47 f.unshift(i); 48 f.start = start; 49 if (g = fragmentByEnd[start]) { 50 delete fragmentByEnd[g.end]; 51 var gf = g === f ? f : g.concat(f); 52 fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf; 53 } else { 54 fragmentByStart[f.start] = fragmentByEnd[f.end] = f; 55 } 56 } else { 57 f = [i]; 58 fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f; 59 } 60 }); 61 62 function ends(i) { 63 var arc = topology.arcs[i < 0 ? ~i : i], p0 = arc[0], p1; 64 if (topology.transform) p1 = [0, 0], arc.forEach(function(dp) { p1[0] += dp[0], p1[1] += dp[1]; }); 65 else p1 = arc[arc.length - 1]; 66 return i < 0 ? [p1, p0] : [p0, p1]; 67 } 68 69 function flush(fragmentByEnd, fragmentByStart) { 70 for (var k in fragmentByEnd) { 71 var f = fragmentByEnd[k]; 72 delete fragmentByStart[f.start]; 73 delete f.start; 74 delete f.end; 75 f.forEach(function(i) { stitchedArcs[i < 0 ? ~i : i] = 1; }); 76 fragments.push(f); 77 } 78 } 79 80 flush(fragmentByEnd, fragmentByStart); 81 flush(fragmentByStart, fragmentByEnd); 82 arcs.forEach(function(i) { if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]); }); 83 84 return fragments; 85 } 86 87 function meshArcs(topology, o, filter) { 88 var arcs = []; 89 90 if (arguments.length > 1) { 91 var geomsByArc = [], 92 geom; 93 94 function arc(i) { 95 var j = i < 0 ? ~i : i; 96 (geomsByArc[j] || (geomsByArc[j] = [])).push({i: i, g: geom}); 97 } 98 99 function line(arcs) { 100 arcs.forEach(arc); 101 } 102 103 function polygon(arcs) { 104 arcs.forEach(line); 105 } 106 107 function geometry(o) { 108 if (o.type === "GeometryCollection") o.geometries.forEach(geometry); 109 else if (o.type in geometryType) geom = o, geometryType[o.type](o.arcs); 110 } 111 112 var geometryType = { 113 LineString: line, 114 MultiLineString: polygon, 115 Polygon: polygon, 116 MultiPolygon: function(arcs) { arcs.forEach(polygon); } 117 }; 118 119 geometry(o); 120 121 geomsByArc.forEach(arguments.length < 3 122 ? function(geoms) { arcs.push(geoms[0].i); } 123 : function(geoms) { if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i); }); 124 } else { 125 for (var i = 0, n = topology.arcs.length; i < n; ++i) arcs.push(i); 126 } 127 128 return {type: "MultiLineString", arcs: stitchArcs(topology, arcs)}; 129 } 130 131 function mergeArcs(topology, objects) { 132 var polygonsByArc = {}, 133 polygons = [], 134 components = []; 135 136 objects.forEach(function(o) { 137 if (o.type === "Polygon") register(o.arcs); 138 else if (o.type === "MultiPolygon") o.arcs.forEach(register); 139 }); 140 141 function register(polygon) { 142 polygon.forEach(function(ring) { 143 ring.forEach(function(arc) { 144 (polygonsByArc[arc = arc < 0 ? ~arc : arc] || (polygonsByArc[arc] = [])).push(polygon); 145 }); 146 }); 147 polygons.push(polygon); 148 } 149 150 function exterior(ring) { 151 return cartesianRingArea(object(topology, {type: "Polygon", arcs: [ring]}).coordinates[0]) > 0; // TODO allow spherical? 152 } 153 154 polygons.forEach(function(polygon) { 155 if (!polygon._) { 156 var component = [], 157 neighbors = [polygon]; 158 polygon._ = 1; 159 components.push(component); 160 while (polygon = neighbors.pop()) { 161 component.push(polygon); 162 polygon.forEach(function(ring) { 163 ring.forEach(function(arc) { 164 polygonsByArc[arc < 0 ? ~arc : arc].forEach(function(polygon) { 165 if (!polygon._) { 166 polygon._ = 1; 167 neighbors.push(polygon); 168 } 169 }); 170 }); 171 }); 172 } 173 } 174 }); 175 176 polygons.forEach(function(polygon) { 177 delete polygon._; 178 }); 179 180 return { 181 type: "MultiPolygon", 182 arcs: components.map(function(polygons) { 183 var arcs = []; 184 185 // Extract the exterior (unique) arcs. 186 polygons.forEach(function(polygon) { 187 polygon.forEach(function(ring) { 188 ring.forEach(function(arc) { 189 if (polygonsByArc[arc < 0 ? ~arc : arc].length < 2) { 190 arcs.push(arc); 191 } 192 }); 193 }); 194 }); 195 196 // Stitch the arcs into one or more rings. 197 arcs = stitchArcs(topology, arcs); 198 199 // If more than one ring is returned, 200 // at most one of these rings can be the exterior; 201 // this exterior ring has the same winding order 202 // as any exterior ring in the original polygons. 203 if ((n = arcs.length) > 1) { 204 var sgn = exterior(polygons[0][0]); 205 for (var i = 0, t; i < n; ++i) { 206 if (sgn === exterior(arcs[i])) { 207 t = arcs[0], arcs[0] = arcs[i], arcs[i] = t; 208 break; 209 } 210 } 211 } 212 213 return arcs; 214 }) 215 }; 216 } 217 218 function featureOrCollection(topology, o) { 219 return o.type === "GeometryCollection" ? { 220 type: "FeatureCollection", 221 features: o.geometries.map(function(o) { return feature(topology, o); }) 222 } : feature(topology, o); 223 } 224 225 function feature(topology, o) { 226 var f = { 227 type: "Feature", 228 id: o.id, 229 properties: o.properties || {}, 230 geometry: object(topology, o) 231 }; 232 if (o.id == null) delete f.id; 233 return f; 234 } 235 236 function object(topology, o) { 237 var absolute = transformAbsolute(topology.transform), 238 arcs = topology.arcs; 239 240 function arc(i, points) { 241 if (points.length) points.pop(); 242 for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length, p; k < n; ++k) { 243 points.push(p = a[k].slice()); 244 absolute(p, k); 245 } 246 if (i < 0) reverse(points, n); 247 } 248 249 function point(p) { 250 p = p.slice(); 251 absolute(p, 0); 252 return p; 253 } 254 255 function line(arcs) { 256 var points = []; 257 for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points); 258 if (points.length < 2) points.push(points[0].slice()); 259 return points; 260 } 261 262 function ring(arcs) { 263 var points = line(arcs); 264 while (points.length < 4) points.push(points[0].slice()); 265 return points; 266 } 267 268 function polygon(arcs) { 269 return arcs.map(ring); 270 } 271 272 function geometry(o) { 273 var t = o.type; 274 return t === "GeometryCollection" ? {type: t, geometries: o.geometries.map(geometry)} 275 : t in geometryType ? {type: t, coordinates: geometryType[t](o)} 276 : null; 277 } 278 279 var geometryType = { 280 Point: function(o) { return point(o.coordinates); }, 281 MultiPoint: function(o) { return o.coordinates.map(point); }, 282 LineString: function(o) { return line(o.arcs); }, 283 MultiLineString: function(o) { return o.arcs.map(line); }, 284 Polygon: function(o) { return polygon(o.arcs); }, 285 MultiPolygon: function(o) { return o.arcs.map(polygon); } 286 }; 287 288 return geometry(o); 289 } 290 291 function reverse(array, n) { 292 var t, j = array.length, i = j - n; while (i < --j) t = array[i], array[i++] = array[j], array[j] = t; 293 } 294 295 function bisect(a, x) { 296 var lo = 0, hi = a.length; 297 while (lo < hi) { 298 var mid = lo + hi >>> 1; 299 if (a[mid] < x) lo = mid + 1; 300 else hi = mid; 301 } 302 return lo; 303 } 304 305 function neighbors(objects) { 306 var indexesByArc = {}, // arc index -> array of object indexes 307 neighbors = objects.map(function() { return []; }); 308 309 function line(arcs, i) { 310 arcs.forEach(function(a) { 311 if (a < 0) a = ~a; 312 var o = indexesByArc[a]; 313 if (o) o.push(i); 314 else indexesByArc[a] = [i]; 315 }); 316 } 317 318 function polygon(arcs, i) { 319 arcs.forEach(function(arc) { line(arc, i); }); 320 } 321 322 function geometry(o, i) { 323 if (o.type === "GeometryCollection") o.geometries.forEach(function(o) { geometry(o, i); }); 324 else if (o.type in geometryType) geometryType[o.type](o.arcs, i); 325 } 326 327 var geometryType = { 328 LineString: line, 329 MultiLineString: polygon, 330 Polygon: polygon, 331 MultiPolygon: function(arcs, i) { arcs.forEach(function(arc) { polygon(arc, i); }); } 332 }; 333 334 objects.forEach(geometry); 335 336 for (var i in indexesByArc) { 337 for (var indexes = indexesByArc[i], m = indexes.length, j = 0; j < m; ++j) { 338 for (var k = j + 1; k < m; ++k) { 339 var ij = indexes[j], ik = indexes[k], n; 340 if ((n = neighbors[ij])[i = bisect(n, ik)] !== ik) n.splice(i, 0, ik); 341 if ((n = neighbors[ik])[i = bisect(n, ij)] !== ij) n.splice(i, 0, ij); 342 } 343 } 344 } 345 346 return neighbors; 347 } 348 349 function presimplify(topology, triangleArea) { 350 var absolute = transformAbsolute(topology.transform), 351 relative = transformRelative(topology.transform), 352 heap = minAreaHeap(); 353 354 if (!triangleArea) triangleArea = cartesianTriangleArea; 355 356 topology.arcs.forEach(function(arc) { 357 var triangles = [], 358 maxArea = 0, 359 triangle; 360 361 // To store each point’s effective area, we create a new array rather than 362 // extending the passed-in point to workaround a Chrome/V8 bug (getting 363 // stuck in smi mode). For midpoints, the initial effective area of 364 // Infinity will be computed in the next step. 365 for (var i = 0, n = arc.length, p; i < n; ++i) { 366 p = arc[i]; 367 absolute(arc[i] = [p[0], p[1], Infinity], i); 368 } 369 370 for (var i = 1, n = arc.length - 1; i < n; ++i) { 371 triangle = arc.slice(i - 1, i + 2); 372 triangle[1][2] = triangleArea(triangle); 373 triangles.push(triangle); 374 heap.push(triangle); 375 } 376 377 for (var i = 0, n = triangles.length; i < n; ++i) { 378 triangle = triangles[i]; 379 triangle.previous = triangles[i - 1]; 380 triangle.next = triangles[i + 1]; 381 } 382 383 while (triangle = heap.pop()) { 384 var previous = triangle.previous, 385 next = triangle.next; 386 387 // If the area of the current point is less than that of the previous point 388 // to be eliminated, use the latter's area instead. This ensures that the 389 // current point cannot be eliminated without eliminating previously- 390 // eliminated points. 391 if (triangle[1][2] < maxArea) triangle[1][2] = maxArea; 392 else maxArea = triangle[1][2]; 393 394 if (previous) { 395 previous.next = next; 396 previous[2] = triangle[2]; 397 update(previous); 398 } 399 400 if (next) { 401 next.previous = previous; 402 next[0] = triangle[0]; 403 update(next); 404 } 405 } 406 407 arc.forEach(relative); 408 }); 409 410 function update(triangle) { 411 heap.remove(triangle); 412 triangle[1][2] = triangleArea(triangle); 413 heap.push(triangle); 414 } 415 416 return topology; 417 }; 418 419 function cartesianRingArea(ring) { 420 var i = -1, 421 n = ring.length, 422 a, 423 b = ring[n - 1], 424 area = 0; 425 426 while (++i < n) { 427 a = b; 428 b = ring[i]; 429 area += a[0] * b[1] - a[1] * b[0]; 430 } 431 432 return area * .5; 433 } 434 435 function cartesianTriangleArea(triangle) { 436 var a = triangle[0], b = triangle[1], c = triangle[2]; 437 return Math.abs((a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1])); 438 } 439 440 function compareArea(a, b) { 441 return a[1][2] - b[1][2]; 442 } 443 444 function minAreaHeap() { 445 var heap = {}, 446 array = [], 447 size = 0; 448 449 heap.push = function(object) { 450 up(array[object._ = size] = object, size++); 451 return size; 452 }; 453 454 heap.pop = function() { 455 if (size <= 0) return; 456 var removed = array[0], object; 457 if (--size > 0) object = array[size], down(array[object._ = 0] = object, 0); 458 return removed; 459 }; 460 461 heap.remove = function(removed) { 462 var i = removed._, object; 463 if (array[i] !== removed) return; // invalid request 464 if (i !== --size) object = array[size], (compareArea(object, removed) < 0 ? up : down)(array[object._ = i] = object, i); 465 return i; 466 }; 467 468 function up(object, i) { 469 while (i > 0) { 470 var j = ((i + 1) >> 1) - 1, 471 parent = array[j]; 472 if (compareArea(object, parent) >= 0) break; 473 array[parent._ = i] = parent; 474 array[object._ = i = j] = object; 475 } 476 } 477 478 function down(object, i) { 479 while (true) { 480 var r = (i + 1) << 1, 481 l = r - 1, 482 j = i, 483 child = array[j]; 484 if (l < size && compareArea(array[l], child) < 0) child = array[j = l]; 485 if (r < size && compareArea(array[r], child) < 0) child = array[j = r]; 486 if (j === i) break; 487 array[child._ = i] = child; 488 array[object._ = i = j] = object; 489 } 490 } 491 492 return heap; 493 } 1 (function (global, factory) { 2 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : 3 typeof define === 'function' && define.amd ? define(['exports'], factory) : 4 (factory((global.topojson = global.topojson || {}))); 5 }(this, function (exports) { 'use strict'; 6 7 function noop() {} 494 8 495 9 function transformAbsolute(transform) { … … 518 32 return function(point, i) { 519 33 if (!i) x0 = y0 = 0; 520 var x1 = (point[0] - dx) / kx | 0,521 y1 = (point[1] - dy) / ky | 0;34 var x1 = Math.round((point[0] - dx) / kx), 35 y1 = Math.round((point[1] - dy) / ky); 522 36 point[0] = x1 - x0; 523 37 point[1] = y1 - y0; … … 527 41 } 528 42 529 function noop() {} 530 531 if (typeof define === "function" && define.amd) define(topojson); 532 else if (typeof module === "object" && module.exports) module.exports = topojson; 533 else this.topojson = topojson; 534 }(); 43 function reverse(array, n) { 44 var t, j = array.length, i = j - n; 45 while (i < --j) t = array[i], array[i++] = array[j], array[j] = t; 46 } 47 48 function bisect(a, x) { 49 var lo = 0, hi = a.length; 50 while (lo < hi) { 51 var mid = lo + hi >>> 1; 52 if (a[mid] < x) lo = mid + 1; 53 else hi = mid; 54 } 55 return lo; 56 } 57 58 function feature(topology, o) { 59 return o.type === "GeometryCollection" ? { 60 type: "FeatureCollection", 61 features: o.geometries.map(function(o) { return feature$1(topology, o); }) 62 } : feature$1(topology, o); 63 } 64 65 function feature$1(topology, o) { 66 var f = { 67 type: "Feature", 68 id: o.id, 69 properties: o.properties || {}, 70 geometry: object(topology, o) 71 }; 72 if (o.id == null) delete f.id; 73 return f; 74 } 75 76 function object(topology, o) { 77 var absolute = transformAbsolute(topology.transform), 78 arcs = topology.arcs; 79 80 function arc(i, points) { 81 if (points.length) points.pop(); 82 for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length, p; k < n; ++k) { 83 points.push(p = a[k].slice()); 84 absolute(p, k); 85 } 86 if (i < 0) reverse(points, n); 87 } 88 89 function point(p) { 90 p = p.slice(); 91 absolute(p, 0); 92 return p; 93 } 94 95 function line(arcs) { 96 var points = []; 97 for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points); 98 if (points.length < 2) points.push(points[0].slice()); 99 return points; 100 } 101 102 function ring(arcs) { 103 var points = line(arcs); 104 while (points.length < 4) points.push(points[0].slice()); 105 return points; 106 } 107 108 function polygon(arcs) { 109 return arcs.map(ring); 110 } 111 112 function geometry(o) { 113 var t = o.type; 114 return t === "GeometryCollection" ? {type: t, geometries: o.geometries.map(geometry)} 115 : t in geometryType ? {type: t, coordinates: geometryType[t](o)} 116 : null; 117 } 118 119 var geometryType = { 120 Point: function(o) { return point(o.coordinates); }, 121 MultiPoint: function(o) { return o.coordinates.map(point); }, 122 LineString: function(o) { return line(o.arcs); }, 123 MultiLineString: function(o) { return o.arcs.map(line); }, 124 Polygon: function(o) { return polygon(o.arcs); }, 125 MultiPolygon: function(o) { return o.arcs.map(polygon); } 126 }; 127 128 return geometry(o); 129 } 130 131 function stitchArcs(topology, arcs) { 132 var stitchedArcs = {}, 133 fragmentByStart = {}, 134 fragmentByEnd = {}, 135 fragments = [], 136 emptyIndex = -1; 137 138 // Stitch empty arcs first, since they may be subsumed by other arcs. 139 arcs.forEach(function(i, j) { 140 var arc = topology.arcs[i < 0 ? ~i : i], t; 141 if (arc.length < 3 && !arc[1][0] && !arc[1][1]) { 142 t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t; 143 } 144 }); 145 146 arcs.forEach(function(i) { 147 var e = ends(i), 148 start = e[0], 149 end = e[1], 150 f, g; 151 152 if (f = fragmentByEnd[start]) { 153 delete fragmentByEnd[f.end]; 154 f.push(i); 155 f.end = end; 156 if (g = fragmentByStart[end]) { 157 delete fragmentByStart[g.start]; 158 var fg = g === f ? f : f.concat(g); 159 fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg; 160 } else { 161 fragmentByStart[f.start] = fragmentByEnd[f.end] = f; 162 } 163 } else if (f = fragmentByStart[end]) { 164 delete fragmentByStart[f.start]; 165 f.unshift(i); 166 f.start = start; 167 if (g = fragmentByEnd[start]) { 168 delete fragmentByEnd[g.end]; 169 var gf = g === f ? f : g.concat(f); 170 fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf; 171 } else { 172 fragmentByStart[f.start] = fragmentByEnd[f.end] = f; 173 } 174 } else { 175 f = [i]; 176 fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f; 177 } 178 }); 179 180 function ends(i) { 181 var arc = topology.arcs[i < 0 ? ~i : i], p0 = arc[0], p1; 182 if (topology.transform) p1 = [0, 0], arc.forEach(function(dp) { p1[0] += dp[0], p1[1] += dp[1]; }); 183 else p1 = arc[arc.length - 1]; 184 return i < 0 ? [p1, p0] : [p0, p1]; 185 } 186 187 function flush(fragmentByEnd, fragmentByStart) { 188 for (var k in fragmentByEnd) { 189 var f = fragmentByEnd[k]; 190 delete fragmentByStart[f.start]; 191 delete f.start; 192 delete f.end; 193 f.forEach(function(i) { stitchedArcs[i < 0 ? ~i : i] = 1; }); 194 fragments.push(f); 195 } 196 } 197 198 flush(fragmentByEnd, fragmentByStart); 199 flush(fragmentByStart, fragmentByEnd); 200 arcs.forEach(function(i) { if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]); }); 201 202 return fragments; 203 } 204 205 function mesh(topology) { 206 return object(topology, meshArcs.apply(this, arguments)); 207 } 208 209 function meshArcs(topology, o, filter) { 210 var arcs = []; 211 212 function arc(i) { 213 var j = i < 0 ? ~i : i; 214 (geomsByArc[j] || (geomsByArc[j] = [])).push({i: i, g: geom}); 215 } 216 217 function line(arcs) { 218 arcs.forEach(arc); 219 } 220 221 function polygon(arcs) { 222 arcs.forEach(line); 223 } 224 225 function geometry(o) { 226 if (o.type === "GeometryCollection") o.geometries.forEach(geometry); 227 else if (o.type in geometryType) geom = o, geometryType[o.type](o.arcs); 228 } 229 230 if (arguments.length > 1) { 231 var geomsByArc = [], 232 geom; 233 234 var geometryType = { 235 LineString: line, 236 MultiLineString: polygon, 237 Polygon: polygon, 238 MultiPolygon: function(arcs) { arcs.forEach(polygon); } 239 }; 240 241 geometry(o); 242 243 geomsByArc.forEach(arguments.length < 3 244 ? function(geoms) { arcs.push(geoms[0].i); } 245 : function(geoms) { if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i); }); 246 } else { 247 for (var i = 0, n = topology.arcs.length; i < n; ++i) arcs.push(i); 248 } 249 250 return {type: "MultiLineString", arcs: stitchArcs(topology, arcs)}; 251 } 252 253 function cartesianTriangleArea(triangle) { 254 var a = triangle[0], b = triangle[1], c = triangle[2]; 255 return Math.abs((a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1])); 256 } 257 258 function ring(ring) { 259 var i = -1, 260 n = ring.length, 261 a, 262 b = ring[n - 1], 263 area = 0; 264 265 while (++i < n) { 266 a = b; 267 b = ring[i]; 268 area += a[0] * b[1] - a[1] * b[0]; 269 } 270 271 return area / 2; 272 } 273 274 function merge(topology) { 275 return object(topology, mergeArcs.apply(this, arguments)); 276 } 277 278 function mergeArcs(topology, objects) { 279 var polygonsByArc = {}, 280 polygons = [], 281 components = []; 282 283 objects.forEach(function(o) { 284 if (o.type === "Polygon") register(o.arcs); 285 else if (o.type === "MultiPolygon") o.arcs.forEach(register); 286 }); 287 288 function register(polygon) { 289 polygon.forEach(function(ring$$) { 290 ring$$.forEach(function(arc) { 291 (polygonsByArc[arc = arc < 0 ? ~arc : arc] || (polygonsByArc[arc] = [])).push(polygon); 292 }); 293 }); 294 polygons.push(polygon); 295 } 296 297 function area(ring$$) { 298 return Math.abs(ring(object(topology, {type: "Polygon", arcs: [ring$$]}).coordinates[0])); 299 } 300 301 polygons.forEach(function(polygon) { 302 if (!polygon._) { 303 var component = [], 304 neighbors = [polygon]; 305 polygon._ = 1; 306 components.push(component); 307 while (polygon = neighbors.pop()) { 308 component.push(polygon); 309 polygon.forEach(function(ring$$) { 310 ring$$.forEach(function(arc) { 311 polygonsByArc[arc < 0 ? ~arc : arc].forEach(function(polygon) { 312 if (!polygon._) { 313 polygon._ = 1; 314 neighbors.push(polygon); 315 } 316 }); 317 }); 318 }); 319 } 320 } 321 }); 322 323 polygons.forEach(function(polygon) { 324 delete polygon._; 325 }); 326 327 return { 328 type: "MultiPolygon", 329 arcs: components.map(function(polygons) { 330 var arcs = [], n; 331 332 // Extract the exterior (unique) arcs. 333 polygons.forEach(function(polygon) { 334 polygon.forEach(function(ring$$) { 335 ring$$.forEach(function(arc) { 336 if (polygonsByArc[arc < 0 ? ~arc : arc].length < 2) { 337 arcs.push(arc); 338 } 339 }); 340 }); 341 }); 342 343 // Stitch the arcs into one or more rings. 344 arcs = stitchArcs(topology, arcs); 345 346 // If more than one ring is returned, 347 // at most one of these rings can be the exterior; 348 // choose the one with the greatest absolute area. 349 if ((n = arcs.length) > 1) { 350 for (var i = 1, k = area(arcs[0]), ki, t; i < n; ++i) { 351 if ((ki = area(arcs[i])) > k) { 352 t = arcs[0], arcs[0] = arcs[i], arcs[i] = t, k = ki; 353 } 354 } 355 } 356 357 return arcs; 358 }) 359 }; 360 } 361 362 function neighbors(objects) { 363 var indexesByArc = {}, // arc index -> array of object indexes 364 neighbors = objects.map(function() { return []; }); 365 366 function line(arcs, i) { 367 arcs.forEach(function(a) { 368 if (a < 0) a = ~a; 369 var o = indexesByArc[a]; 370 if (o) o.push(i); 371 else indexesByArc[a] = [i]; 372 }); 373 } 374 375 function polygon(arcs, i) { 376 arcs.forEach(function(arc) { line(arc, i); }); 377 } 378 379 function geometry(o, i) { 380 if (o.type === "GeometryCollection") o.geometries.forEach(function(o) { geometry(o, i); }); 381 else if (o.type in geometryType) geometryType[o.type](o.arcs, i); 382 } 383 384 var geometryType = { 385 LineString: line, 386 MultiLineString: polygon, 387 Polygon: polygon, 388 MultiPolygon: function(arcs, i) { arcs.forEach(function(arc) { polygon(arc, i); }); } 389 }; 390 391 objects.forEach(geometry); 392 393 for (var i in indexesByArc) { 394 for (var indexes = indexesByArc[i], m = indexes.length, j = 0; j < m; ++j) { 395 for (var k = j + 1; k < m; ++k) { 396 var ij = indexes[j], ik = indexes[k], n; 397 if ((n = neighbors[ij])[i = bisect(n, ik)] !== ik) n.splice(i, 0, ik); 398 if ((n = neighbors[ik])[i = bisect(n, ij)] !== ij) n.splice(i, 0, ij); 399 } 400 } 401 } 402 403 return neighbors; 404 } 405 406 function compareArea(a, b) { 407 return a[1][2] - b[1][2]; 408 } 409 410 function minAreaHeap() { 411 var heap = {}, 412 array = [], 413 size = 0; 414 415 heap.push = function(object) { 416 up(array[object._ = size] = object, size++); 417 return size; 418 }; 419 420 heap.pop = function() { 421 if (size <= 0) return; 422 var removed = array[0], object; 423 if (--size > 0) object = array[size], down(array[object._ = 0] = object, 0); 424 return removed; 425 }; 426 427 heap.remove = function(removed) { 428 var i = removed._, object; 429 if (array[i] !== removed) return; // invalid request 430 if (i !== --size) object = array[size], (compareArea(object, removed) < 0 ? up : down)(array[object._ = i] = object, i); 431 return i; 432 }; 433 434 function up(object, i) { 435 while (i > 0) { 436 var j = ((i + 1) >> 1) - 1, 437 parent = array[j]; 438 if (compareArea(object, parent) >= 0) break; 439 array[parent._ = i] = parent; 440 array[object._ = i = j] = object; 441 } 442 } 443 444 function down(object, i) { 445 while (true) { 446 var r = (i + 1) << 1, 447 l = r - 1, 448 j = i, 449 child = array[j]; 450 if (l < size && compareArea(array[l], child) < 0) child = array[j = l]; 451 if (r < size && compareArea(array[r], child) < 0) child = array[j = r]; 452 if (j === i) break; 453 array[child._ = i] = child; 454 array[object._ = i = j] = object; 455 } 456 } 457 458 return heap; 459 } 460 461 function presimplify(topology, triangleArea) { 462 var absolute = transformAbsolute(topology.transform), 463 relative = transformRelative(topology.transform), 464 heap = minAreaHeap(); 465 466 if (!triangleArea) triangleArea = cartesianTriangleArea; 467 468 topology.arcs.forEach(function(arc) { 469 var triangles = [], 470 maxArea = 0, 471 triangle, 472 i, 473 n, 474 p; 475 476 // To store each point’s effective area, we create a new array rather than 477 // extending the passed-in point to workaround a Chrome/V8 bug (getting 478 // stuck in smi mode). For midpoints, the initial effective area of 479 // Infinity will be computed in the next step. 480 for (i = 0, n = arc.length; i < n; ++i) { 481 p = arc[i]; 482 absolute(arc[i] = [p[0], p[1], Infinity], i); 483 } 484 485 for (i = 1, n = arc.length - 1; i < n; ++i) { 486 triangle = arc.slice(i - 1, i + 2); 487 triangle[1][2] = triangleArea(triangle); 488 triangles.push(triangle); 489 heap.push(triangle); 490 } 491 492 for (i = 0, n = triangles.length; i < n; ++i) { 493 triangle = triangles[i]; 494 triangle.previous = triangles[i - 1]; 495 triangle.next = triangles[i + 1]; 496 } 497 498 while (triangle = heap.pop()) { 499 var previous = triangle.previous, 500 next = triangle.next; 501 502 // If the area of the current point is less than that of the previous point 503 // to be eliminated, use the latter's area instead. This ensures that the 504 // current point cannot be eliminated without eliminating previously- 505 // eliminated points. 506 if (triangle[1][2] < maxArea) triangle[1][2] = maxArea; 507 else maxArea = triangle[1][2]; 508 509 if (previous) { 510 previous.next = next; 511 previous[2] = triangle[2]; 512 update(previous); 513 } 514 515 if (next) { 516 next.previous = previous; 517 next[0] = triangle[0]; 518 update(next); 519 } 520 } 521 522 arc.forEach(relative); 523 }); 524 525 function update(triangle) { 526 heap.remove(triangle); 527 triangle[1][2] = triangleArea(triangle); 528 heap.push(triangle); 529 } 530 531 return topology; 532 } 533 534 var version = "1.6.26"; 535 536 exports.version = version; 537 exports.mesh = mesh; 538 exports.meshArcs = meshArcs; 539 exports.merge = merge; 540 exports.mergeArcs = mergeArcs; 541 exports.feature = feature; 542 exports.neighbors = neighbors; 543 exports.presimplify = presimplify; 544 545 })); -
_plugins_/d3js/trunk/javascript/topojson.min.js
r96616 r96999 1 !function( ){function t(n,t){function r(t){var r,e=n.arcs[0>t?~t:t],o=e[0];return n.transform?(r=[0,0],e.forEach(function(n){r[0]+=n[0],r[1]+=n[1]})):r=e[e.length-1],0>t?[r,o]:[o,r]}function e(n,t){for(var r in n){var e=n[r];delete t[e.start],delete e.start,delete e.end,e.forEach(function(n){o[0>n?~n:n]=1}),f.push(e)}}var o={},i={},u={},f=[],c=-1;return t.forEach(function(r,e){var o,i=n.arcs[0>r?~r:r];i.length<3&&!i[1][0]&&!i[1][1]&&(o=t[++c],t[c]=r,t[e]=o)}),t.forEach(function(n){var t,e,o=r(n),f=o[0],c=o[1];if(t=u[f])if(delete u[t.end],t.push(n),t.end=c,e=i[c]){delete i[e.start];var a=e===t?t:t.concat(e);i[a.start=t.start]=u[a.end=e.end]=a}else i[t.start]=u[t.end]=t;else if(t=i[c])if(delete i[t.start],t.unshift(n),t.start=f,e=u[f]){delete u[e.end];var s=e===t?t:e.concat(t);i[s.start=e.start]=u[s.end=t.end]=s}else i[t.start]=u[t.end]=t;else t=[n],i[t.start=f]=u[t.end=c]=t}),e(u,i),e(i,u),t.forEach(function(n){o[0>n?~n:n]||f.push([n])}),f}function r(n,r,e){function o(n){var t=0>n?~n:n;(s[t]||(s[t]=[])).push({i:n,g:a})}function i(n){n.forEach(o)}function u(n){n.forEach(i)}function f(n){"GeometryCollection"===n.type?n.geometries.forEach(f):n.type in l&&(a=n,l[n.type](n.arcs))}var c=[];if(arguments.length>1){var a,s=[],l={LineString:i,MultiLineString:u,Polygon:u,MultiPolygon:function(n){n.forEach(u)}};f(r),s.forEach(arguments.length<3?function(n){c.push(n[0].i)}:function(n){e(n[0].g,n[n.length-1].g)&&c.push(n[0].i)})}else for(var h=0,p=n.arcs.length;p>h;++h)c.push(h);return{type:"MultiLineString",arcs:t(n,c)}}function e(r,e){function o(n){n.forEach(function(t){t.forEach(function(t){(f[t=0>t?~t:t]||(f[t]=[])).push(n)})}),c.push(n)}function i(n){return l(u(r,{type:"Polygon",arcs:[n]}).coordinates[0])>0}var f={},c=[],a=[];return e.forEach(function(n){"Polygon"===n.type?o(n.arcs):"MultiPolygon"===n.type&&n.arcs.forEach(o)}),c.forEach(function(n){if(!n._){var t=[],r=[n];for(n._=1,a.push(t);n=r.pop();)t.push(n),n.forEach(function(n){n.forEach(function(n){f[0>n?~n:n].forEach(function(n){n._||(n._=1,r.push(n))})})})}}),c.forEach(function(n){delete n._}),{type:"MultiPolygon",arcs:a.map(function(e){var o=[];if(e.forEach(function(n){n.forEach(function(n){n.forEach(function(n){f[0>n?~n:n].length<2&&o.push(n)})})}),o=t(r,o),(n=o.length)>1)for(var u,c=i(e[0][0]),a=0;n>a;++a)if(c===i(o[a])){u=o[0],o[0]=o[a],o[a]=u;break}return o})}}function o(n,t){return"GeometryCollection"===t.type?{type:"FeatureCollection",features:t.geometries.map(function(t){return i(n,t)})}:i(n,t)}function i(n,t){var r={type:"Feature",id:t.id,properties:t.properties||{},geometry:u(n,t)};return null==t.id&&delete r.id,r}function u(n,t){function r(n,t){t.length&&t.pop();for(var r,e=s[0>n?~n:n],o=0,i=e.length;i>o;++o)t.push(r=e[o].slice()),a(r,o);0>n&&f(t,i)}function e(n){return n=n.slice(),a(n,0),n}function o(n){for(var t=[],e=0,o=n.length;o>e;++e)r(n[e],t);return t.length<2&&t.push(t[0].slice()),t}function i(n){for(var t=o(n);t.length<4;)t.push(t[0].slice());return t}function u(n){return n.map(i)}function c(n){var t=n.type;return"GeometryCollection"===t?{type:t,geometries:n.geometries.map(c)}:t in l?{type:t,coordinates:l[t](n)}:null}var a=v(n.transform),s=n.arcs,l={Point:function(n){return e(n.coordinates)},MultiPoint:function(n){return n.coordinates.map(e)},LineString:function(n){return o(n.arcs)},MultiLineString:function(n){return n.arcs.map(o)},Polygon:function(n){return u(n.arcs)},MultiPolygon:function(n){return n.arcs.map(u)}};return c(t)}function f(n,t){for(var r,e=n.length,o=e-t;o<--e;)r=n[o],n[o++]=n[e],n[e]=r}function c(n,t){for(var r=0,e=n.length;e>r;){var o=r+e>>>1;n[o]<t?r=o+1:e=o}return r}function a(n){function t(n,t){n.forEach(function(n){0>n&&(n=~n);var r=o[n];r?r.push(t):o[n]=[t]})}function r(n,r){n.forEach(function(n){t(n,r)})}function e(n,t){"GeometryCollection"===n.type?n.geometries.forEach(function(n){e(n,t)}):n.type in u&&u[n.type](n.arcs,t)}var o={},i=n.map(function(){return[]}),u={LineString:t,MultiLineString:r,Polygon:r,MultiPolygon:function(n,t){n.forEach(function(n){r(n,t)})}};n.forEach(e);for(var f in o)for(var a=o[f],s=a.length,l=0;s>l;++l)for(var h=l+1;s>h;++h){var p,g=a[l],v=a[h];(p=i[g])[f=c(p,v)]!==v&&p.splice(f,0,v),(p=i[v])[f=c(p,g)]!==g&&p.splice(f,0,g)}return i}function s(n,t){function r(n){i.remove(n),n[1][2]=t(n),i.push(n)}var e=v(n.transform),o=m(n.transform),i=g();return t||(t=h),n.arcs.forEach(function(n){for(var u,f,c=[],a=0,s=0,l=n.length;l>s;++s)f=n[s],e(n[s]=[f[0],f[1],1/0],s);for(var s=1,l=n.length-1;l>s;++s)u=n.slice(s-1,s+2),u[1][2]=t(u),c.push(u),i.push(u);for(var s=0,l=c.length;l>s;++s)u=c[s],u.previous=c[s-1],u.next=c[s+1];for(;u=i.pop();){var h=u.previous,p=u.next;u[1][2]<a?u[1][2]=a:a=u[1][2],h&&(h.next=p,h[2]=u[2],r(h)),p&&(p.previous=h,p[0]=u[0],r(p))}n.forEach(o)}),n}function l(n){for(var t,r=-1,e=n.length,o=n[e-1],i=0;++r<e;)t=o,o=n[r],i+=t[0]*o[1]-t[1]*o[0];return.5*i}function h(n){var t=n[0],r=n[1],e=n[2];return Math.abs((t[0]-e[0])*(r[1]-t[1])-(t[0]-r[0])*(e[1]-t[1]))}function p(n,t){return n[1][2]-t[1][2]}function g(){function n(n,t){for(;t>0;){var r=(t+1>>1)-1,o=e[r];if(p(n,o)>=0)break;e[o._=t]=o,e[n._=t=r]=n}}function t(n,t){for(;;){var r=t+1<<1,i=r-1,u=t,f=e[u];if(o>i&&p(e[i],f)<0&&(f=e[u=i]),o>r&&p(e[r],f)<0&&(f=e[u=r]),u===t)break;e[f._=t]=f,e[n._=t=u]=n}}var r={},e=[],o=0;return r.push=function(t){return n(e[t._=o]=t,o++),o},r.pop=function(){if(!(0>=o)){var n,r=e[0];return--o>0&&(n=e[o],t(e[n._=0]=n,0)),r}},r.remove=function(r){var i,u=r._;if(e[u]===r)return u!==--o&&(i=e[o],(p(i,r)<0?n:t)(e[i._=u]=i,u)),u},r}function v(n){if(!n)return y;var t,r,e=n.scale[0],o=n.scale[1],i=n.translate[0],u=n.translate[1];return function(n,f){f||(t=r=0),n[0]=(t+=n[0])*e+i,n[1]=(r+=n[1])*o+u}}function m(n){if(!n)return y;var t,r,e=n.scale[0],o=n.scale[1],i=n.translate[0],u=n.translate[1];return function(n,f){f||(t=r=0);var c=(n[0]-i)/e|0,a=(n[1]-u)/o|0;n[0]=c-t,n[1]=a-r,t=c,r=a}}function y(){}var d={version:"1.6.19",mesh:function(n){return u(n,r.apply(this,arguments))},meshArcs:r,merge:function(n){return u(n,e.apply(this,arguments))},mergeArcs:e,feature:o,neighbors:a,presimplify:s};"function"==typeof define&&define.amd?define(d):"object"==typeof module&&module.exports?module.exports=d:this.topojson=d}();1 !function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(n.topojson=n.topojson||{})}(this,function(n){"use strict";function t(){}function r(n){if(!n)return t;var r,e,o=n.scale[0],i=n.scale[1],u=n.translate[0],f=n.translate[1];return function(n,t){t||(r=e=0),n[0]=(r+=n[0])*o+u,n[1]=(e+=n[1])*i+f}}function e(n){if(!n)return t;var r,e,o=n.scale[0],i=n.scale[1],u=n.translate[0],f=n.translate[1];return function(n,t){t||(r=e=0);var c=Math.round((n[0]-u)/o),a=Math.round((n[1]-f)/i);n[0]=c-r,n[1]=a-e,r=c,e=a}}function o(n,t){for(var r,e=n.length,o=e-t;o<--e;)r=n[o],n[o++]=n[e],n[e]=r}function i(n,t){for(var r=0,e=n.length;e>r;){var o=r+e>>>1;n[o]<t?r=o+1:e=o}return r}function u(n,t){return"GeometryCollection"===t.type?{type:"FeatureCollection",features:t.geometries.map(function(t){return f(n,t)})}:f(n,t)}function f(n,t){var r={type:"Feature",id:t.id,properties:t.properties||{},geometry:c(n,t)};return null==t.id&&delete r.id,r}function c(n,t){function e(n,t){t.length&&t.pop();for(var r,e=l[0>n?~n:n],i=0,u=e.length;u>i;++i)t.push(r=e[i].slice()),s(r,i);0>n&&o(t,u)}function i(n){return n=n.slice(),s(n,0),n}function u(n){for(var t=[],r=0,o=n.length;o>r;++r)e(n[r],t);return t.length<2&&t.push(t[0].slice()),t}function f(n){for(var t=u(n);t.length<4;)t.push(t[0].slice());return t}function c(n){return n.map(f)}function a(n){var t=n.type;return"GeometryCollection"===t?{type:t,geometries:n.geometries.map(a)}:t in h?{type:t,coordinates:h[t](n)}:null}var s=r(n.transform),l=n.arcs,h={Point:function(n){return i(n.coordinates)},MultiPoint:function(n){return n.coordinates.map(i)},LineString:function(n){return u(n.arcs)},MultiLineString:function(n){return n.arcs.map(u)},Polygon:function(n){return c(n.arcs)},MultiPolygon:function(n){return n.arcs.map(c)}};return a(t)}function a(n,t){function r(t){var r,e=n.arcs[0>t?~t:t],o=e[0];return n.transform?(r=[0,0],e.forEach(function(n){r[0]+=n[0],r[1]+=n[1]})):r=e[e.length-1],0>t?[r,o]:[o,r]}function e(n,t){for(var r in n){var e=n[r];delete t[e.start],delete e.start,delete e.end,e.forEach(function(n){o[0>n?~n:n]=1}),f.push(e)}}var o={},i={},u={},f=[],c=-1;return t.forEach(function(r,e){var o,i=n.arcs[0>r?~r:r];i.length<3&&!i[1][0]&&!i[1][1]&&(o=t[++c],t[c]=r,t[e]=o)}),t.forEach(function(n){var t,e,o=r(n),f=o[0],c=o[1];if(t=u[f])if(delete u[t.end],t.push(n),t.end=c,e=i[c]){delete i[e.start];var a=e===t?t:t.concat(e);i[a.start=t.start]=u[a.end=e.end]=a}else i[t.start]=u[t.end]=t;else if(t=i[c])if(delete i[t.start],t.unshift(n),t.start=f,e=u[f]){delete u[e.end];var s=e===t?t:e.concat(t);i[s.start=e.start]=u[s.end=t.end]=s}else i[t.start]=u[t.end]=t;else t=[n],i[t.start=f]=u[t.end=c]=t}),e(u,i),e(i,u),t.forEach(function(n){o[0>n?~n:n]||f.push([n])}),f}function s(n){return c(n,l.apply(this,arguments))}function l(n,t,r){function e(n){var t=0>n?~n:n;(s[t]||(s[t]=[])).push({i:n,g:c})}function o(n){n.forEach(e)}function i(n){n.forEach(o)}function u(n){"GeometryCollection"===n.type?n.geometries.forEach(u):n.type in l&&(c=n,l[n.type](n.arcs))}var f=[];if(arguments.length>1){var c,s=[],l={LineString:o,MultiLineString:i,Polygon:i,MultiPolygon:function(n){n.forEach(i)}};u(t),s.forEach(arguments.length<3?function(n){f.push(n[0].i)}:function(n){r(n[0].g,n[n.length-1].g)&&f.push(n[0].i)})}else for(var h=0,p=n.arcs.length;p>h;++h)f.push(h);return{type:"MultiLineString",arcs:a(n,f)}}function h(n){var t=n[0],r=n[1],e=n[2];return Math.abs((t[0]-e[0])*(r[1]-t[1])-(t[0]-r[0])*(e[1]-t[1]))}function p(n){for(var t,r=-1,e=n.length,o=n[e-1],i=0;++r<e;)t=o,o=n[r],i+=t[0]*o[1]-t[1]*o[0];return i/2}function v(n){return c(n,g.apply(this,arguments))}function g(n,t){function r(n){n.forEach(function(t){t.forEach(function(t){(o[t=0>t?~t:t]||(o[t]=[])).push(n)})}),i.push(n)}function e(t){return Math.abs(p(c(n,{type:"Polygon",arcs:[t]}).coordinates[0]))}var o={},i=[],u=[];return t.forEach(function(n){"Polygon"===n.type?r(n.arcs):"MultiPolygon"===n.type&&n.arcs.forEach(r)}),i.forEach(function(n){if(!n._){var t=[],r=[n];for(n._=1,u.push(t);n=r.pop();)t.push(n),n.forEach(function(n){n.forEach(function(n){o[0>n?~n:n].forEach(function(n){n._||(n._=1,r.push(n))})})})}}),i.forEach(function(n){delete n._}),{type:"MultiPolygon",arcs:u.map(function(t){var r,i=[];if(t.forEach(function(n){n.forEach(function(n){n.forEach(function(n){o[0>n?~n:n].length<2&&i.push(n)})})}),i=a(n,i),(r=i.length)>1)for(var u,f,c=1,s=e(i[0]);r>c;++c)(u=e(i[c]))>s&&(f=i[0],i[0]=i[c],i[c]=f,s=u);return i})}}function y(n){function t(n,t){n.forEach(function(n){0>n&&(n=~n);var r=o[n];r?r.push(t):o[n]=[t]})}function r(n,r){n.forEach(function(n){t(n,r)})}function e(n,t){"GeometryCollection"===n.type?n.geometries.forEach(function(n){e(n,t)}):n.type in f&&f[n.type](n.arcs,t)}var o={},u=n.map(function(){return[]}),f={LineString:t,MultiLineString:r,Polygon:r,MultiPolygon:function(n,t){n.forEach(function(n){r(n,t)})}};n.forEach(e);for(var c in o)for(var a=o[c],s=a.length,l=0;s>l;++l)for(var h=l+1;s>h;++h){var p,v=a[l],g=a[h];(p=u[v])[c=i(p,g)]!==g&&p.splice(c,0,g),(p=u[g])[c=i(p,v)]!==v&&p.splice(c,0,v)}return u}function d(n,t){return n[1][2]-t[1][2]}function m(){function n(n,t){for(;t>0;){var r=(t+1>>1)-1,o=e[r];if(d(n,o)>=0)break;e[o._=t]=o,e[n._=t=r]=n}}function t(n,t){for(;;){var r=t+1<<1,i=r-1,u=t,f=e[u];if(o>i&&d(e[i],f)<0&&(f=e[u=i]),o>r&&d(e[r],f)<0&&(f=e[u=r]),u===t)break;e[f._=t]=f,e[n._=t=u]=n}}var r={},e=[],o=0;return r.push=function(t){return n(e[t._=o]=t,o++),o},r.pop=function(){if(!(0>=o)){var n,r=e[0];return--o>0&&(n=e[o],t(e[n._=0]=n,0)),r}},r.remove=function(r){var i,u=r._;if(e[u]===r)return u!==--o&&(i=e[o],(d(i,r)<0?n:t)(e[i._=u]=i,u)),u},r}function E(n,t){function o(n){f.remove(n),n[1][2]=t(n),f.push(n)}var i=r(n.transform),u=e(n.transform),f=m();return t||(t=h),n.arcs.forEach(function(n){var r,e,c,a,s=[],l=0;for(e=0,c=n.length;c>e;++e)a=n[e],i(n[e]=[a[0],a[1],1/0],e);for(e=1,c=n.length-1;c>e;++e)r=n.slice(e-1,e+2),r[1][2]=t(r),s.push(r),f.push(r);for(e=0,c=s.length;c>e;++e)r=s[e],r.previous=s[e-1],r.next=s[e+1];for(;r=f.pop();){var h=r.previous,p=r.next;r[1][2]<l?r[1][2]=l:l=r[1][2],h&&(h.next=p,h[2]=r[2],o(h)),p&&(p.previous=h,p[0]=r[0],o(p))}n.forEach(u)}),n}var M="1.6.26";n.version=M,n.mesh=s,n.meshArcs=l,n.merge=v,n.mergeArcs=g,n.feature=u,n.neighbors=y,n.presimplify=E});
Note: See TracChangeset
for help on using the changeset viewer.