diff --git a/web/app/engine.js b/web/app/engine.js index ea7af5e0..63169250 100644 --- a/web/app/engine.js +++ b/web/app/engine.js @@ -170,26 +170,23 @@ TCAD.utils.isPointInsidePolygon = function( inPt, inPolygon ) { }; TCAD.utils.sketchToPolygons = function(geom) { - - var dict = {}; + + var dict = TCAD.struct.hashTable.forVector2d(); + var edges = TCAD.struct.hashTable.forDoubleArray(); + var lines = geom.connections; - function key(a) { - return a.x + ":" + a.y; - } function edgeKey(a, b) { - return key(a) + ":" + key(b); + return [a.x, a.y, b.x, b.y]; } var size = 0; var points = []; - var edges = {}; function memDir(a, b) { - var ak = key(a); - var dirs = dict[ak]; - if (!dirs) { + var dirs = dict.get(a); + if (dirs === null) { dirs = []; - dict[ak] = dirs; + dict.put(a, dirs); points.push(a); } dirs.push(b); @@ -200,16 +197,14 @@ TCAD.utils.sketchToPolygons = function(geom) { var b = lines[i].b; memDir(a, b); memDir(b, a); - edges[edgeKey(a, b)] = lines[i]; + edges.put(edgeKey(a, b), lines[i]); } var graph = { - id : key, - connections : function(e) { - var dirs = dict[key(e)]; - return !dirs ? [] : dirs; + var dirs = dict.get(e); + return dirs === null ? [] : dirs; }, at : function(index) { @@ -221,7 +216,7 @@ TCAD.utils.sketchToPolygons = function(geom) { } }; - var loops = TCAD.graph.finaAllLoops(graph); + var loops = TCAD.graph.finaAllLoops(graph, dict.hashCodeF, dict.equalsF); var polygons = []; for (var li = 0; li < loops.length; ++li) { var loop = loops[li]; @@ -230,9 +225,9 @@ TCAD.utils.sketchToPolygons = function(geom) { var point = loop[pi]; var next = loop[(pi + 1) % loop.length]; - var edge = edges[edgeKey(point, next)]; - if (edge === undefined) { - edge = edges[edgeKey(next, point)]; + var edge = edges.get(edgeKey(point, next)); + if (edge === null) { + edge = edges.get(edgeKey(next, point)); } polyPoints.push(point); point.sketchConnectionObject = edge.sketchObject; diff --git a/web/app/math/graph.js b/web/app/math/graph.js index 6ec800cc..ad893014 100644 --- a/web/app/math/graph.js +++ b/web/app/math/graph.js @@ -3,33 +3,31 @@ TCAD.graph = {}; -TCAD.graph.finaAllLoops = function(graph) { +TCAD.graph.finaAllLoops = function(graph, hashCode, equals) { var loops = []; - var visited = {}; + var visited = new TCAD.struct.HashTable(hashCode, equals); function step(vertex, comesFrom, path) { var i; - var vertexId = graph.id(vertex); - visited[vertexId] = true; + visited.put(vertex, true); for (i = path.length - 1; i >= 0; --i) { - if (vertexId === graph.id(path[i])) { + if (equals(vertex, path[i])) { loops.push(path.slice(i)); return; } } - + var next = graph.connections(vertex); - + path.push(vertex); var needClone = false; - + VERTEX: - for (i = 0; i < next.length; i++) { - var v = next[i]; - var nextId = graph.id(v); - if (nextId === comesFrom) { - continue; - } + for (i = 0; i < next.length; i++) { + var v = next[i]; + if (equals(v, comesFrom)) { + continue; + } // //avoid duplicates // for (var li = loops.length - 1; li >= 0; --li) { @@ -40,27 +38,27 @@ TCAD.graph.finaAllLoops = function(graph) { // } // } // } - - var p = needClone ? path.slice(0) : path; - needClone = true; - step(v, vertexId, p); - } + + var p = needClone ? path.slice(0) : path; + needClone = true; + step(v, vertex, p); + } path.pop(); } for (var i = 0; i < graph.size(); i++) { var vertex = graph.at(i); - if (visited[graph.id(vertex)] !== true) { + if (visited.get(vertex) !== true) { step(vertex, -1, []); } } //filter duplicates - function sameLoop(a, b, key) { - var first = key(a[0]); + function sameLoop(a, b) { + var first = a[0]; for (var bShift = 0; bShift < a.length; bShift++) { - if (key(b[bShift]) === first) { + if (equals(b[bShift], first)) { break; } } @@ -74,8 +72,8 @@ TCAD.graph.finaAllLoops = function(graph) { bDown = a.length + bDown; } // console.log("up: " + bUp + "; down: " + bDown); - var curr = key(a[i]); - if (curr != key(b[bUp]) && curr != key(b[bDown]) ) { + var curr = a[i]; + if ( !equals(curr, b[bUp]) && !equals(curr, b[bDown]) ) { return false; } } @@ -91,7 +89,7 @@ TCAD.graph.finaAllLoops = function(graph) { if (b == null || a.length !== b.length) { continue; } - if (sameLoop(a, b, graph.id)) { + if (sameLoop(a, b)) { loops[j] = null; ++ duplicates; } @@ -111,10 +109,6 @@ TCAD.graph.finaAllLoops = function(graph) { /** @constructor */ TCAD.graph.Graph = function(data) { - this.id = function(e) { - return e; - }; - this.connections = function(e) { return data[e]; }; @@ -130,7 +124,7 @@ TCAD.graph.Graph = function(data) { TCAD.graph.test = function() { var data = [ - [], + [], [2], [1, 3, 9], [2, 4], diff --git a/web/app/math/vector.js b/web/app/math/vector.js index eb5e5692..8d8b428e 100644 --- a/web/app/math/vector.js +++ b/web/app/math/vector.js @@ -27,10 +27,6 @@ TCAD.Vector.prototype.setV = function(data) { return this; }; -TCAD.Vector.prototype.asKey = function() { - return this.x + ":" + this.y + ":" + this.z -}; - TCAD.Vector.prototype.multiply = function(scalar) { return new TCAD.Vector(this.x * scalar, this.y * scalar, this.z * scalar); }; diff --git a/web/app/workbench.js b/web/app/workbench.js index 1f42c393..e9ed7a07 100644 --- a/web/app/workbench.js +++ b/web/app/workbench.js @@ -202,7 +202,6 @@ TCAD.craft._mergeCSGPolygonsTest = function() { }; TCAD.craft._mergeCSGPolygons = function (__cgsPolygons, allPoints) { - var pkey = TCAD.craft.pkey; function vec(p) { var v = new TCAD.Vector(); @@ -275,16 +274,15 @@ TCAD.craft._mergeCSGPolygons = function (__cgsPolygons, allPoints) { function mergeVertices(polygons) { var points = []; - var pointToPoly = {}; + var pointToPoly = TCAD.struct.hashTable.forVector3d(); for (var pi = 0; pi < polygons.length; ++pi) { var poly = polygons[pi]; poly.id = pi; for (var vi = 0; vi < poly.vertices.length; ++vi) { var vert = poly.vertices[vi]; - var key = pkey(vert); - var pList = pointToPoly[key]; - if (pList === undefined) { - pointToPoly[key] = [poly]; + var pList = pointToPoly.get(vert); + if (pList === null) { + pointToPoly.put(vert, [poly]); points.push(vert); } else { pList.push(poly); @@ -296,7 +294,7 @@ TCAD.craft._mergeCSGPolygons = function (__cgsPolygons, allPoints) { for (var i = 0; i < points.length; i++) { var point = points[i]; - var gons = pointToPoly[pkey(point)]; + var gons = pointToPoly.get(point); POLYGONS: for (var pi = 0; pi < polygons.length; ++pi) { @@ -555,8 +553,8 @@ TCAD.craft._makeFromPolygons = function(polygons) { TCAD.craft.recoverySketchInfo = function(polygons) { var nonStructuralGons = []; - var sketchEdges = {}; - function key(a, b) {return a.asKey() + ":" + b.asKey()} + var sketchEdges = TCAD.struct.hashTable.forDoubleArray(); + function key(a, b) {return [a.x, a.y, b.x, b.y]}; for (var pi = 0; pi < polygons.length; pi++) { var poly = polygons[pi]; @@ -567,7 +565,7 @@ TCAD.craft.recoverySketchInfo = function(polygons) { if (poly.csgInfo !== undefined && poly.csgInfo.derivedFrom !== undefined) { var n = path.length; for (var p = n - 1, q = 0; q < n ; p = q++ ) { - sketchEdges[key(path[p], path[q])] = poly.csgInfo; + sketchEdges.put(key(path[p], path[q]), poly.csgInfo); } } else { nonStructuralGons.push(path); @@ -579,9 +577,9 @@ TCAD.craft.recoverySketchInfo = function(polygons) { var path = nonStructuralGons[i]; var n = path.length; for (var p = n - 1, q = 0; q < n ; p = q++ ) { - var csgInfo = sketchEdges[key(path[p], path[q])]; - if (!csgInfo) { - csgInfo = sketchEdges[key(path[q], path[p])]; + var csgInfo = sketchEdges.get(key(path[p], path[q])); + if (csgInfo === null) { + csgInfo = sketchEdges.get(key(path[q], path[p])); } if (csgInfo) { path[p].sketchConnectionObject = csgInfo.derivedFrom; @@ -639,22 +637,19 @@ TCAD.craft.cut = function(app, face, faces, height) { function sortPaths(paths3D) { - var transforms = {}; + var transforms = TCAD.struct.hashTable.forVector3d(); var paths = paths3D.map(function(path) { - - var nkey = TCAD.craft.pkey(path.normal); - var tr = transforms[nkey]; - if (tr === undefined) { + var tr = transforms.get(path.normal); + if (tr === null) { var _3dTransformation = new TCAD.Matrix().setBasis(TCAD.geom.someBasis(path.vertices, path.normal)); var tr = _3dTransformation.invert(); - transforms[nkey] = tr; + transforms.put(path.normal, tr); } return { vertices : path.vertices.map(function(v) {return tr.apply(v);}), normal : path.normal, - w : path.w, csgInfo : path.csgInfo } });