(floatPoints, ratPoints, floatBounds)
| 9057 | |
| 9058 | // Merge overlapping points |
| 9059 | function dedupPoints (floatPoints, ratPoints, floatBounds) { |
| 9060 | var numPoints = ratPoints.length |
| 9061 | var uf = new UnionFind(numPoints) |
| 9062 | |
| 9063 | // Compute rational bounds |
| 9064 | var bounds = [] |
| 9065 | for (var i = 0; i < ratPoints.length; ++i) { |
| 9066 | var p = ratPoints[i] |
| 9067 | var xb = boundRat(p[0]) |
| 9068 | var yb = boundRat(p[1]) |
| 9069 | bounds.push([ |
| 9070 | nextafter(xb[0], -Infinity), |
| 9071 | nextafter(yb[0], -Infinity), |
| 9072 | nextafter(xb[1], Infinity), |
| 9073 | nextafter(yb[1], Infinity) |
| 9074 | ]) |
| 9075 | } |
| 9076 | |
| 9077 | // Link all points with over lapping boxes |
| 9078 | boxIntersect(bounds, function (i, j) { |
| 9079 | uf.link(i, j) |
| 9080 | }) |
| 9081 | |
| 9082 | // Do 1 pass over points to combine points in label sets |
| 9083 | var noDupes = true |
| 9084 | var labels = new Array(numPoints) |
| 9085 | for (var i = 0; i < numPoints; ++i) { |
| 9086 | var j = uf.find(i) |
| 9087 | if (j !== i) { |
| 9088 | // Clear no-dupes flag, zero out label |
| 9089 | noDupes = false |
| 9090 | // Make each point the top-left point from its cell |
| 9091 | floatPoints[j] = [ |
| 9092 | Math.min(floatPoints[i][0], floatPoints[j][0]), |
| 9093 | Math.min(floatPoints[i][1], floatPoints[j][1]) |
| 9094 | ] |
| 9095 | } |
| 9096 | } |
| 9097 | |
| 9098 | // If no duplicates, return null to signal termination |
| 9099 | if (noDupes) { |
| 9100 | return null |
| 9101 | } |
| 9102 | |
| 9103 | var ptr = 0 |
| 9104 | for (var i = 0; i < numPoints; ++i) { |
| 9105 | var j = uf.find(i) |
| 9106 | if (j === i) { |
| 9107 | labels[i] = ptr |
| 9108 | floatPoints[ptr++] = floatPoints[i] |
| 9109 | } else { |
| 9110 | labels[i] = -1 |
| 9111 | } |
| 9112 | } |
| 9113 | |
| 9114 | floatPoints.length = ptr |
| 9115 | |
| 9116 | // Do a second pass to fix up missing labels |
no test coverage detected
searching dependent graphs…