Don't use string concatenation for double for making hashmaps. retarded

This commit is contained in:
Val Erastov 2015-08-30 02:01:27 -07:00
parent a803c5e5f4
commit fb99396160
4 changed files with 55 additions and 75 deletions

View file

@ -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;

View file

@ -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],

View file

@ -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);
};

View file

@ -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
}
});