cut.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import join from "./join.js";
  2. // Given an extracted (pre-)topology, cuts (or rotates) arcs so that all shared
  3. // point sequences are identified. The topology can then be subsequently deduped
  4. // to remove exact duplicate arcs.
  5. export default function(topology) {
  6. var junctions = join(topology),
  7. coordinates = topology.coordinates,
  8. lines = topology.lines,
  9. rings = topology.rings,
  10. next,
  11. i, n;
  12. for (i = 0, n = lines.length; i < n; ++i) {
  13. var line = lines[i],
  14. lineMid = line[0],
  15. lineEnd = line[1];
  16. while (++lineMid < lineEnd) {
  17. if (junctions.has(coordinates[lineMid])) {
  18. next = {0: lineMid, 1: line[1]};
  19. line[1] = lineMid;
  20. line = line.next = next;
  21. }
  22. }
  23. }
  24. for (i = 0, n = rings.length; i < n; ++i) {
  25. var ring = rings[i],
  26. ringStart = ring[0],
  27. ringMid = ringStart,
  28. ringEnd = ring[1],
  29. ringFixed = junctions.has(coordinates[ringStart]);
  30. while (++ringMid < ringEnd) {
  31. if (junctions.has(coordinates[ringMid])) {
  32. if (ringFixed) {
  33. next = {0: ringMid, 1: ring[1]};
  34. ring[1] = ringMid;
  35. ring = ring.next = next;
  36. } else { // For the first junction, we can rotate rather than cut.
  37. rotateArray(coordinates, ringStart, ringEnd, ringEnd - ringMid);
  38. coordinates[ringEnd] = coordinates[ringStart];
  39. ringFixed = true;
  40. ringMid = ringStart; // restart; we may have skipped junctions
  41. }
  42. }
  43. }
  44. }
  45. return topology;
  46. }
  47. function rotateArray(array, start, end, offset) {
  48. reverse(array, start, end);
  49. reverse(array, start, start + offset);
  50. reverse(array, start + offset, end);
  51. }
  52. function reverse(array, start, end) {
  53. for (var mid = start + ((end-- - start) >> 1), t; start < mid; ++start, --end) {
  54. t = array[start], array[start] = array[end], array[end] = t;
  55. }
  56. }