From ceb651aa75e563b761cc5da492a8f19536d78bb0 Mon Sep 17 00:00:00 2001 From: Anselm Levskaya Date: Tue, 8 Dec 2015 23:50:36 -0800 Subject: [PATCH 1/2] whitespace fixes --- topo_operators.coffee | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/topo_operators.coffee b/topo_operators.coffee index b2b868d..af3ed77 100644 --- a/topo_operators.coffee +++ b/topo_operators.coffee @@ -318,7 +318,7 @@ dual = (poly) -> # A polyhedron with e edges will have a chamfered form containing 2e new vertices, # 3e new edges, and e new hexagonal faces. -- Wikipedia # See also http://dmccooey.com/polyhedra/Chamfer.html -# +# # The dist parameter could control how deeply to chamfer. # But I'm not sure about implementing that yet. # @@ -331,7 +331,7 @@ dual = (poly) -> chamfer = (poly, dist) -> dist or= 0.5 - + flag = new polyflag() normals = poly.normals() @@ -343,13 +343,13 @@ chamfer = (poly, dist) -> for f,i in poly.face v1 = f[f.length-1] v1new = i + "_" + v1 - + for v2 in f # TODO: figure out what distances will give us a planar hex face. # Move each old vertex further from the origin. flag.newV(v2, mult(1.0 + dist, poly.xyz[v2])) # Add a new vertex, moved parallel to normal. - v2new = i + "_" + v2 + v2new = i + "_" + v2 flag.newV(v2new, add(poly.xyz[v2], mult(dist*1.5, normals[i]))) # Four new flags: # One whose face corresponds to the original face: From 5c1f82fe382fffb3d4e6b4a9e267632a4f6479e1 Mon Sep 17 00:00:00 2001 From: Anselm Levskaya Date: Wed, 9 Dec 2015 00:09:23 -0800 Subject: [PATCH 2/2] added the hollow operator code back in --- parser.coffee | 3 +- polyhedronisme.html | 4 +- polyhedronisme.js | 925 ++++++++++++++++++++++-------------------- polyhedronisme.min.js | 2 +- topo_operators.coffee | 67 ++- 5 files changed, 562 insertions(+), 439 deletions(-) diff --git a/parser.coffee b/parser.coffee index 6dcbc80..890573d 100644 --- a/parser.coffee +++ b/parser.coffee @@ -63,6 +63,7 @@ opmap = { "g": gyro "p": propellor "r": reflect + "h": hollow "c": chamfer "w": whirl "n": insetN @@ -128,4 +129,4 @@ newgeneratePoly = (notation) -> poly = paintPolyhedron(poly) # return the poly object - poly \ No newline at end of file + poly diff --git a/polyhedronisme.html b/polyhedronisme.html index 5466eb8..46133ae 100644 --- a/polyhedronisme.html +++ b/polyhedronisme.html @@ -124,9 +124,9 @@

  • nN - insetN
  • xN - extrudeN
  • z - triangulate
  • - + a recipe!

    There are more complicated, parameterized forms for k and n:

    diff --git a/polyhedronisme.js b/polyhedronisme.js index a55922a..551ecfa 100644 --- a/polyhedronisme.js +++ b/polyhedronisme.js @@ -1,6 +1,6 @@ -// Generated by CoffeeScript 1.10.0 +// Generated by CoffeeScript 1.8.0 (function() { - var BG_CLEAR, BG_COLOR, CANVAS_HEIGHT, CANVAS_WIDTH, COLOR_METHOD, DEFAULT_RECIPES, LN10, LastMouseX, LastMouseY, LastSphVec, MOUSEDOWN, PALETTE, PEG_parser_spec, PI, PaintMode, _2d_x_offset, _2d_y_offset, _mult, abs, acos, add, adjustXYZ, ambo, animateShape, antiprism, asin, atan, basemap, calcCentroid, canonicalXYZ, canonicalize, chamfer, clear, clone, convexarea, copyVecArray, cos, cross, ctx, ctx_linewidth, cube, diagsToTris, dispatch, dodecahedron, dot, drawShape, drawpoly, dual, edgeDist, extrudeN, eye3, faceSignature, faceToEdges, floor, getDiagonals, getOps, getVec2VecRotM, globPolys, globRotM, globlastRotM, globtime, gyro, hextofloats, icosahedron, init, insetN, intersect, invperspT, kisN, linePointDist2, log, log10, mag, mag2, midpoint, mm3, mult, mv3, newgeneratePoly, normal, octahedron, oneThird, op_parser, opmap, orthogonal, paintPolyhedron, palette, parseurl, perspT, persp_ratio, persp_z_max, persp_z_min, perspective_scale, planarize, polyflag, polyhedron, pow, prism, project2dface, propellor, pyramid, random, randomchoice, recenter, reciprocal, reciprocalC, reciprocalN, reflect, rescale, rotm, round, rwb_palette, saveText, setlink, sigfigs, sin, sortfaces, specreplacements, sqrt, stellaN, sub, tan, tangentPoint, tangentify, testrig, tetrahedron, topolog, triEq, triangulate, tween, unit, updateStats, vec_rotm, vertColors, whirl; + var BG_CLEAR, BG_COLOR, CANVAS_HEIGHT, CANVAS_WIDTH, COLOR_METHOD, DEFAULT_RECIPES, LN10, LastMouseX, LastMouseY, LastSphVec, MOUSEDOWN, PALETTE, PEG_parser_spec, PI, PaintMode, abs, acos, add, adjustXYZ, ambo, animateShape, antiprism, asin, atan, basemap, calcCentroid, canonicalXYZ, canonicalize, chamfer, clear, clone, convexarea, copyVecArray, cos, cross, ctx, ctx_linewidth, cube, diagsToTris, dispatch, dodecahedron, dot, drawShape, drawpoly, dual, edgeDist, extrudeN, eye3, faceSignature, faceToEdges, floor, getDiagonals, getOps, getVec2VecRotM, globPolys, globRotM, globlastRotM, globtime, gyro, hextofloats, hollow, icosahedron, init, insetN, intersect, invperspT, kisN, linePointDist2, log, log10, mag, mag2, midpoint, mm3, mult, mv3, newgeneratePoly, normal, octahedron, oneThird, op_parser, opmap, orthogonal, paintPolyhedron, palette, parseurl, perspT, persp_ratio, persp_z_max, persp_z_min, perspective_scale, planarize, polyflag, polyhedron, pow, prism, project2dface, propellor, pyramid, random, randomchoice, recenter, reciprocal, reciprocalC, reciprocalN, reflect, rescale, rotm, round, rwb_palette, saveText, setlink, sigfigs, sin, sortfaces, specreplacements, sqrt, stellaN, sub, tan, tangentPoint, tangentify, testrig, tetrahedron, topolog, triEq, triangulate, tween, unit, updateStats, vec_rotm, vertColors, whirl, _2d_x_offset, _2d_y_offset, _mult; random = Math.random; @@ -147,14 +147,14 @@ }; intersect = function(set1, set2, set3) { - var l, len, len1, len2, o, s1, s2, s3, u; - for (l = 0, len = set1.length; l < len; l++) { - s1 = set1[l]; - for (o = 0, len1 = set2.length; o < len1; o++) { - s2 = set2[o]; + var s1, s2, s3, _i, _j, _k, _len, _len1, _len2; + for (_i = 0, _len = set1.length; _i < _len; _i++) { + s1 = set1[_i]; + for (_j = 0, _len1 = set2.length; _j < _len1; _j++) { + s2 = set2[_j]; if (s1 === s2) { - for (u = 0, len2 = set3.length; u < len2; u++) { - s3 = set3[u]; + for (_k = 0, _len2 = set3.length; _k < _len2; _k++) { + s3 = set3[_k]; if (s1 === s3) { return s1; } @@ -166,34 +166,34 @@ }; calcCentroid = function(xyzs) { - var centroidV, l, len, v; + var centroidV, v, _i, _len; centroidV = [0, 0, 0]; - for (l = 0, len = xyzs.length; l < len; l++) { - v = xyzs[l]; + for (_i = 0, _len = xyzs.length; _i < _len; _i++) { + v = xyzs[_i]; centroidV = add(centroidV, v); } return mult(1 / xyzs.length, centroidV); }; normal = function(xyzs) { - var l, len, normalV, ref, ref1, v1, v2, v3; + var normalV, v1, v2, v3, _i, _len, _ref, _ref1; normalV = [0, 0, 0]; - ref = xyzs.slice(-2), v1 = ref[0], v2 = ref[1]; - for (l = 0, len = xyzs.length; l < len; l++) { - v3 = xyzs[l]; + _ref = xyzs.slice(-2), v1 = _ref[0], v2 = _ref[1]; + for (_i = 0, _len = xyzs.length; _i < _len; _i++) { + v3 = xyzs[_i]; normalV = add(normalV, orthogonal(v1, v2, v3)); - ref1 = [v2, v3], v1 = ref1[0], v2 = ref1[1]; + _ref1 = [v2, v3], v1 = _ref1[0], v2 = _ref1[1]; } return unit(normalV); }; convexarea = function(xyzs) { - var area, l, len, ref, ref1, v1, v2, v3; + var area, v1, v2, v3, _i, _len, _ref, _ref1; area = 0.0; - ref = xyzs.slice(0, 2), v1 = ref[0], v2 = ref[1]; - ref1 = xyzs.slice(2); - for (l = 0, len = ref1.length; l < len; l++) { - v3 = ref1[l]; + _ref = xyzs.slice(0, 2), v1 = _ref[0], v2 = _ref[1]; + _ref1 = xyzs.slice(2); + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + v3 = _ref1[_i]; area += mag(cross(sub(v2, v1), sub(v3, v1))); v2 = v3; } @@ -201,12 +201,12 @@ }; faceSignature = function(xyzs) { - var cross_array, l, len, len1, len2, o, ref, ref1, ref2, sig, u, v1, v2, v3, x; + var cross_array, sig, v1, v2, v3, x, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2; cross_array = []; - ref = xyzs.slice(0, 2), v1 = ref[0], v2 = ref[1]; - ref1 = xyzs.slice(2); - for (l = 0, len = ref1.length; l < len; l++) { - v3 = ref1[l]; + _ref = xyzs.slice(0, 2), v1 = _ref[0], v2 = _ref[1]; + _ref1 = xyzs.slice(2); + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + v3 = _ref1[_i]; cross_array.push(mag(cross(sub(v2, v1), sub(v3, v1)))); v2 = v3; } @@ -214,20 +214,20 @@ return a - b; }); sig = ""; - for (o = 0, len1 = cross_array.length; o < len1; o++) { - x = cross_array[o]; + for (_j = 0, _len1 = cross_array.length; _j < _len1; _j++) { + x = cross_array[_j]; sig += sigfigs(x, 2); } - ref2 = cross_array.reverse(); - for (u = 0, len2 = ref2.length; u < len2; u++) { - x = ref2[u]; + _ref2 = cross_array.reverse(); + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { + x = _ref2[_k]; sig += sigfigs(x, 2); } return sig; }; project2dface = function(verts) { - var c, l, len, n, p, results, tmpverts, v, v0; + var c, n, p, tmpverts, v, v0, _i, _len, _results; tmpverts = clone(verts); v0 = verts[0]; tmpverts = _.map(tmpverts, function(x) { @@ -236,18 +236,18 @@ n = normal(verts); c = unit(calcCentroid(verts)); p = cross(n, c); - results = []; - for (l = 0, len = tmpverts.length; l < len; l++) { - v = tmpverts[l]; - results.push([dot(n, v), dot(p, v)]); + _results = []; + for (_i = 0, _len = tmpverts.length; _i < _len; _i++) { + v = tmpverts[_i]; + _results.push([dot(n, v), dot(p, v)]); } - return results; + return _results; }; copyVecArray = function(vecArray) { - var i, l, newVecArray, ref; + var i, newVecArray, _i, _ref; newVecArray = new Array(vecArray.length); - for (i = l = 0, ref = vecArray.length; 0 <= ref ? l < ref : l > ref; i = 0 <= ref ? ++l : --l) { + for (i = _i = 0, _ref = vecArray.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { newVecArray[i] = vecArray[i].slice(0); } return newVecArray; @@ -272,17 +272,17 @@ }; vec_rotm = function(angle, x, y, z) { - var cosA, length, m, ref, ref1, sinA, sinA2, x2, y2, z2; + var cosA, length, m, sinA, sinA2, x2, y2, z2, _ref, _ref1; angle /= 2; sinA = sin(angle); cosA = cos(angle); sinA2 = sinA * sinA; length = mag([x, y, z]); if (length === 0) { - ref = [0, 0, 1], x = ref[0], y = ref[1], z = ref[2]; + _ref = [0, 0, 1], x = _ref[0], y = _ref[1], z = _ref[2]; } if (length !== 1) { - ref1 = unit([x, y, z]), x = ref1[0], y = ref1[1], z = ref1[2]; + _ref1 = unit([x, y, z]), x = _ref1[0], y = _ref1[1], z = _ref1[2]; } if (x === 1 && y === 0 && z === 0) { m = [[1, 0, 0], [0, 1 - 2 * sinA2, 2 * sinA * cosA], [0, -2 * sinA * cosA, 1 - 2 * sinA2]]; @@ -330,11 +330,11 @@ }; faceToEdges = function(face) { - var edges, l, len, v1, v2; + var edges, v1, v2, _i, _len; edges = []; v1 = face.slice(-1)[0]; - for (l = 0, len = face.length; l < len; l++) { - v2 = face[l]; + for (_i = 0, _len = face.length; _i < _len; _i++) { + v2 = face[_i]; edges.push([v1, v2]); v1 = v2; } @@ -342,13 +342,13 @@ }; vertColors = function(poly) { - var f, i, l, len, len1, o, ref, v, vertcolors; + var f, i, v, vertcolors, _i, _j, _len, _len1, _ref; vertcolors = []; - ref = poly.face; - for (i = l = 0, len = ref.length; l < len; i = ++l) { - f = ref[i]; - for (o = 0, len1 = f.length; o < len1; o++) { - v = f[o]; + _ref = poly.face; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + f = _ref[i]; + for (_j = 0, _len1 = f.length; _j < _len1; _j++) { + v = f[_j]; vertcolors[v] = poly.face_class[i]; } } @@ -385,7 +385,7 @@ }; paintPolyhedron = function(poly) { - var clr, colorassign, colormemory, f, face_verts, l, len, ref, v; + var clr, colorassign, colormemory, f, face_verts, v, _i, _len, _ref; poly.face_class = []; colormemory = {}; colorassign = function(ar, colormemory) { @@ -399,29 +399,29 @@ return fclr; } }; - ref = poly.face; - for (l = 0, len = ref.length; l < len; l++) { - f = ref[l]; + _ref = poly.face; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + f = _ref[_i]; if (COLOR_METHOD === "area") { face_verts = (function() { - var len1, o, results; - results = []; - for (o = 0, len1 = f.length; o < len1; o++) { - v = f[o]; - results.push(poly.xyz[v]); + var _j, _len1, _results; + _results = []; + for (_j = 0, _len1 = f.length; _j < _len1; _j++) { + v = f[_j]; + _results.push(poly.xyz[v]); } - return results; + return _results; })(); clr = colorassign(convexarea(face_verts), colormemory); } else if (COLOR_METHOD === "signature") { face_verts = (function() { - var len1, o, results; - results = []; - for (o = 0, len1 = f.length; o < len1; o++) { - v = f[o]; - results.push(poly.xyz[v]); + var _j, _len1, _results; + _results = []; + for (_j = 0, _len1 = f.length; _j < _len1; _j++) { + v = f[_j]; + _results.push(poly.xyz[v]); } - return results; + return _results; })(); clr = colorassign(faceSignature(face_verts), colormemory); } else { @@ -434,7 +434,7 @@ }; sortfaces = function(poly) { - var centroids, idx, l, normals, planesort, ray_origin, ref, results, zcentroidsort, zsortIndex; + var centroids, idx, normals, planesort, ray_origin, zcentroidsort, zsortIndex, _i, _ref, _results; centroids = poly.centers(); normals = poly.normals(); ray_origin = [0, 0, (persp_z_max * persp_ratio - persp_z_min) / (1 - persp_ratio)]; @@ -445,29 +445,29 @@ return a[0][2] - b[0][2]; }; zsortIndex = _.zip(centroids, normals, (function() { - results = []; - for (var l = 0, ref = poly.face.length; 0 <= ref ? l < ref : l > ref; 0 <= ref ? l++ : l--){ results.push(l); } - return results; + _results = []; + for (var _i = 0, _ref = poly.face.length; 0 <= _ref ? _i < _ref : _i > _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); } + return _results; }).apply(this)).sort(zcentroidsort).map(function(x) { return x[2]; }); poly.face = (function() { - var len, o, results1; - results1 = []; - for (o = 0, len = zsortIndex.length; o < len; o++) { - idx = zsortIndex[o]; - results1.push(poly.face[idx]); + var _j, _len, _results1; + _results1 = []; + for (_j = 0, _len = zsortIndex.length; _j < _len; _j++) { + idx = zsortIndex[_j]; + _results1.push(poly.face[idx]); } - return results1; + return _results1; })(); return poly.face_class = (function() { - var len, o, results1; - results1 = []; - for (o = 0, len = zsortIndex.length; o < len; o++) { - idx = zsortIndex[o]; - results1.push(poly.face_class[idx]); + var _j, _len, _results1; + _results1 = []; + for (_j = 0, _len = zsortIndex.length; _j < _len; _j++) { + idx = zsortIndex[_j]; + _results1.push(poly.face_class[idx]); } - return results1; + return _results1; })(); }; @@ -481,7 +481,7 @@ polyhedron.prototype.data = function() { var nEdges; nEdges = this.face.length + this.xyz.length - 2; - return this.face.length + " faces, " + nEdges + " edges, " + this.xyz.length + " vertices"; + return "" + this.face.length + " faces, " + nEdges + " edges, " + this.xyz.length + " vertices"; }; polyhedron.prototype.moreData = function() { @@ -489,14 +489,14 @@ }; polyhedron.prototype.edges = function() { - var a, alledges, b, e, edgeset, finalset, hash, l, len, len1, o, uniqedges; + var a, alledges, b, e, edgeset, finalset, hash, uniqedges, _i, _j, _len, _len1; finalset = {}; uniqedges = []; alledges = _.map(this.face, faceToEdges); - for (l = 0, len = alledges.length; l < len; l++) { - edgeset = alledges[l]; - for (o = 0, len1 = edgeset.length; o < len1; o++) { - e = edgeset[o]; + for (_i = 0, _len = alledges.length; _i < _len; _i++) { + edgeset = alledges[_i]; + for (_j = 0, _len1 = edgeset.length; _j < _len1; _j++) { + e = edgeset[_j]; if (e[0] < e[1]) { a = e[0], b = e[1]; } else { @@ -513,11 +513,11 @@ }; polyhedron.prototype.minEdgeLength = function() { - var d2, e, l, len, min2, ref; + var d2, e, min2, _i, _len, _ref; min2 = Number.MAX_VALUE; - ref = this.edges(); - for (l = 0, len = ref.length; l < len; l++) { - e = ref[l]; + _ref = this.edges(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + e = _ref[_i]; d2 = mag2(sub(this.xyz[e[0]], this.xyz[e[1]])); if (d2 < min2) { min2 = d2; @@ -527,15 +527,15 @@ }; polyhedron.prototype.minFaceRadius = function() { - var c, centers, de2, e, f, l, len, min2, nFaces, o, ref, ref1; + var c, centers, de2, e, f, min2, nFaces, _i, _j, _len, _ref; min2 = Number.MAX_VALUE; nFaces = this.face.length; centers = this.centers(); - for (f = l = 0, ref = nFaces; 0 <= ref ? l < ref : l > ref; f = 0 <= ref ? ++l : --l) { + for (f = _i = 0; 0 <= nFaces ? _i < nFaces : _i > nFaces; f = 0 <= nFaces ? ++_i : --_i) { c = centers[f]; - ref1 = faceToEdges(this.face[f]); - for (o = 0, len = ref1.length; o < len; o++) { - e = ref1[o]; + _ref = faceToEdges(this.face[f]); + for (_j = 0, _len = _ref.length; _j < _len; _j++) { + e = _ref[_j]; de2 = linePointDist2(this.xyz[e[0]], this.xyz[e[1]], c); if (de2 < min2) { min2 = de2; @@ -546,14 +546,14 @@ }; polyhedron.prototype.centers = function() { - var centers_array, f, fcenter, l, len, len1, o, ref, v; + var centers_array, f, fcenter, v, _i, _j, _len, _len1, _ref; centers_array = []; - ref = this.face; - for (l = 0, len = ref.length; l < len; l++) { - f = ref[l]; + _ref = this.face; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + f = _ref[_i]; fcenter = [0, 0, 0]; - for (o = 0, len1 = f.length; o < len1; o++) { - v = f[o]; + for (_j = 0, _len1 = f.length; _j < _len1; _j++) { + v = f[_j]; fcenter = add(fcenter, this.xyz[v]); } centers_array.push(mult(1.0 / f.length, fcenter)); @@ -562,57 +562,57 @@ }; polyhedron.prototype.normals = function() { - var f, l, len, normals_array, ref, v; + var f, normals_array, v, _i, _len, _ref; normals_array = []; - ref = this.face; - for (l = 0, len = ref.length; l < len; l++) { - f = ref[l]; + _ref = this.face; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + f = _ref[_i]; normals_array.push(normal((function() { - var len1, o, results; - results = []; - for (o = 0, len1 = f.length; o < len1; o++) { - v = f[o]; - results.push(this.xyz[v]); + var _j, _len1, _results; + _results = []; + for (_j = 0, _len1 = f.length; _j < _len1; _j++) { + v = f[_j]; + _results.push(this.xyz[v]); } - return results; + return _results; }).call(this))); } return normals_array; }; polyhedron.prototype.toOBJ = function() { - var f, i, l, len, len1, len2, len3, norm, o, objstr, ref, ref1, ref2, u, v, w; + var f, i, norm, objstr, v, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2; objstr = "#Produced by polyHédronisme http://levskaya.github.com/polyhedronisme\n"; objstr += "group " + this.name + "\n"; objstr += "#vertices\n"; - ref = this.xyz; - for (l = 0, len = ref.length; l < len; l++) { - v = ref[l]; + _ref = this.xyz; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + v = _ref[_i]; objstr += "v " + v[0] + " " + v[1] + " " + v[2] + "\n"; } objstr += "#normal vector defs \n"; - ref1 = this.face; - for (o = 0, len1 = ref1.length; o < len1; o++) { - f = ref1[o]; + _ref1 = this.face; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + f = _ref1[_j]; norm = normal((function() { - var len2, results, u; - results = []; - for (u = 0, len2 = f.length; u < len2; u++) { - v = f[u]; - results.push(this.xyz[v]); + var _k, _len2, _results; + _results = []; + for (_k = 0, _len2 = f.length; _k < _len2; _k++) { + v = f[_k]; + _results.push(this.xyz[v]); } - return results; + return _results; }).call(this)); objstr += "vn " + norm[0] + " " + norm[1] + " " + norm[2] + "\n"; } objstr += "#face defs \n"; - ref2 = this.face; - for (i = u = 0, len2 = ref2.length; u < len2; i = ++u) { - f = ref2[i]; + _ref2 = this.face; + for (i = _k = 0, _len2 = _ref2.length; _k < _len2; i = ++_k) { + f = _ref2[i]; objstr += "f "; - for (w = 0, len3 = f.length; w < len3; w++) { - v = f[w]; - objstr += (v + 1) + "//" + (i + 1) + " "; + for (_l = 0, _len3 = f.length; _l < _len3; _l++) { + v = f[_l]; + objstr += "" + (v + 1) + "//" + (i + 1) + " "; } objstr += "\n"; } @@ -620,32 +620,32 @@ }; polyhedron.prototype.toX3D = function() { - var SCALE_FACTOR, cl, clr, f, l, len, len1, len2, len3, o, ref, ref1, ref2, u, v, w, x3dstr; + var SCALE_FACTOR, cl, clr, f, v, x3dstr, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2; SCALE_FACTOR = .01; x3dstr = '\n\n\n\n\n\n\n\n\n ref; i = 0 <= ref ? ++l : --l) { + for (i = _i = 0; 0 <= n ? _i < n : _i > n; i = 0 <= n ? ++_i : --_i) { poly.xyz.push([-cos(i * theta), -sin(i * theta), -h]); } - for (i = o = 0, ref1 = n; 0 <= ref1 ? o < ref1 : o > ref1; i = 0 <= ref1 ? ++o : --o) { + for (i = _j = 0; 0 <= n ? _j < n : _j > n; i = 0 <= n ? ++_j : --_j) { poly.xyz.push([-cos(i * theta), -sin(i * theta), h]); } poly.face.push((function() { - results = []; - for (var u = ref2 = n - 1; ref2 <= 0 ? u <= 0 : u >= 0; ref2 <= 0 ? u++ : u--){ results.push(u); } - return results; + _results = []; + for (var _k = _ref = n - 1; _ref <= 0 ? _k <= 0 : _k >= 0; _ref <= 0 ? _k++ : _k--){ _results.push(_k); } + return _results; }).apply(this)); poly.face.push((function() { - results1 = []; - for (var w = n, ref3 = 2 * n; n <= ref3 ? w < ref3 : w > ref3; n <= ref3 ? w++ : w--){ results1.push(w); } - return results1; + _results1 = []; + for (var _l = n, _ref1 = 2 * n; n <= _ref1 ? _l < _ref1 : _l > _ref1; n <= _ref1 ? _l++ : _l--){ _results1.push(_l); } + return _results1; }).apply(this)); - for (i = aa = 0, ref4 = n; 0 <= ref4 ? aa < ref4 : aa > ref4; i = 0 <= ref4 ? ++aa : --aa) { + for (i = _m = 0; 0 <= n ? _m < n : _m > n; i = 0 <= n ? ++_m : --_m) { poly.face.push([i, (i + 1) % n, (i + 1) % n + n, i + n]); } poly = adjustXYZ(poly, 1); @@ -764,7 +764,7 @@ }; antiprism = function(n) { - var aa, f, h, i, l, o, poly, r, ref, ref1, ref2, ref3, ref4, results, results1, theta, u, w; + var f, h, i, poly, r, theta, _i, _j, _k, _l, _m, _ref, _ref1, _ref2, _results, _results1; theta = 2 * PI / n; h = sqrt(1 - 4 / (4 + 2 * cos(theta / 2) - 2 * cos(theta))); r = sqrt(1 - h * h); @@ -773,23 +773,23 @@ h = -h / f; poly = new polyhedron(); poly.name = "A" + n; - for (i = l = 0, ref = n; 0 <= ref ? l < ref : l > ref; i = 0 <= ref ? ++l : --l) { + for (i = _i = 0; 0 <= n ? _i < n : _i > n; i = 0 <= n ? ++_i : --_i) { poly.xyz.push([r * cos(i * theta), r * sin(i * theta), h]); } - for (i = o = 0, ref1 = n; 0 <= ref1 ? o < ref1 : o > ref1; i = 0 <= ref1 ? ++o : --o) { + for (i = _j = 0; 0 <= n ? _j < n : _j > n; i = 0 <= n ? ++_j : --_j) { poly.xyz.push([r * cos((i + 0.5) * theta), r * sin((i + 0.5) * theta), -h]); } poly.face.push((function() { - results = []; - for (var u = ref2 = n - 1; ref2 <= 0 ? u <= 0 : u >= 0; ref2 <= 0 ? u++ : u--){ results.push(u); } - return results; + _results = []; + for (var _k = _ref = n - 1; _ref <= 0 ? _k <= 0 : _k >= 0; _ref <= 0 ? _k++ : _k--){ _results.push(_k); } + return _results; }).apply(this)); poly.face.push((function() { - results1 = []; - for (var w = n, ref3 = 2 * n - 1; n <= ref3 ? w <= ref3 : w >= ref3; n <= ref3 ? w++ : w--){ results1.push(w); } - return results1; + _results1 = []; + for (var _l = n, _ref1 = 2 * n - 1; n <= _ref1 ? _l <= _ref1 : _l >= _ref1; n <= _ref1 ? _l++ : _l--){ _results1.push(_l); } + return _results1; }).apply(this)); - for (i = aa = 0, ref4 = n - 1; 0 <= ref4 ? aa <= ref4 : aa >= ref4; i = 0 <= ref4 ? ++aa : --aa) { + for (i = _m = 0, _ref2 = n - 1; 0 <= _ref2 ? _m <= _ref2 : _m >= _ref2; i = 0 <= _ref2 ? ++_m : --_m) { poly.face.push([i, (i + 1) % n, i + n]); poly.face.push([i, i + n, (n + i - 1) % n + n]); } @@ -798,21 +798,21 @@ }; pyramid = function(n) { - var height, i, l, o, poly, ref, ref1, ref2, results, theta, u; + var height, i, poly, theta, _i, _j, _k, _ref, _results; theta = 2 * PI / n; height = 1; poly = new polyhedron(); poly.name = "Y" + n; - for (i = l = 0, ref = n; 0 <= ref ? l < ref : l > ref; i = 0 <= ref ? ++l : --l) { + for (i = _i = 0; 0 <= n ? _i < n : _i > n; i = 0 <= n ? ++_i : --_i) { poly.xyz.push([-cos(i * theta), -sin(i * theta), -0.2]); } poly.xyz.push([0, 0, height]); poly.face.push((function() { - results = []; - for (var o = ref1 = n - 1; ref1 <= 0 ? o <= 0 : o >= 0; ref1 <= 0 ? o++ : o--){ results.push(o); } - return results; + _results = []; + for (var _j = _ref = n - 1; _ref <= 0 ? _j <= 0 : _j >= 0; _ref <= 0 ? _j++ : _j--){ _results.push(_j); } + return _results; }).apply(this)); - for (i = u = 0, ref2 = n; 0 <= ref2 ? u < ref2 : u > ref2; i = 0 <= ref2 ? ++u : --u) { + for (i = _k = 0; 0 <= n ? _k < n : _k > n; i = 0 <= n ? ++_k : --_k) { poly.face.push([i, (i + 1) % n, n]); } poly = canonicalXYZ(poly, 3); @@ -841,20 +841,20 @@ }; polyflag.prototype.topoly = function() { - var ctr, f, faceCTR, i, j, poly, ref, ref1, v, v0; + var ctr, f, faceCTR, i, j, poly, v, v0, _ref, _ref1; poly = new polyhedron(); ctr = 0; - ref = this.verts; - for (i in ref) { - v = ref[i]; + _ref = this.verts; + for (i in _ref) { + v = _ref[i]; poly.xyz[ctr] = this.xyzs[i]; this.verts[i] = ctr; ctr++; } ctr = 0; - ref1 = this.flags; - for (i in ref1) { - f = ref1[i]; + _ref1 = this.flags; + for (i in _ref1) { + f = _ref1[i]; poly.face[ctr] = []; for (j in f) { v = f[j]; @@ -885,25 +885,25 @@ })(); kisN = function(poly, n, apexdist) { - var apex, centers, f, flag, fname, foundAny, i, l, len, len1, len2, newpoly, normals, o, p, ref, ref1, u, v, v1, v2; + var apex, centers, f, flag, fname, foundAny, i, newpoly, normals, p, v, v1, v2, _i, _j, _k, _len, _len1, _len2, _ref, _ref1; n || (n = 0); apexdist || (apexdist = 0.1); console.log("Taking kis of " + (n === 0 ? "" : n) + "-sided faces of " + poly.name + "..."); flag = new polyflag(); - ref = poly.xyz; - for (i = l = 0, len = ref.length; l < len; i = ++l) { - p = ref[i]; + _ref = poly.xyz; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + p = _ref[i]; flag.newV("v" + i, p); } normals = poly.normals(); centers = poly.centers(); foundAny = false; - ref1 = poly.face; - for (i = o = 0, len1 = ref1.length; o < len1; i = ++o) { - f = ref1[i]; + _ref1 = poly.face; + for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) { + f = _ref1[i]; v1 = "v" + f[f.length - 1]; - for (u = 0, len2 = f.length; u < len2; u++) { - v = f[u]; + for (_k = 0, _len2 = f.length; _k < _len2; _k++) { + v = f[_k]; v2 = "v" + v; if (f.length === n || n === 0) { foundAny = true; @@ -928,7 +928,7 @@ }; ambo = function(poly) { - var f, flag, i, l, len, len1, midName, newpoly, o, ref, ref1, ref2, v1, v2, v3; + var f, flag, i, midName, newpoly, v1, v2, v3, _i, _j, _len, _len1, _ref, _ref1, _ref2; console.log("Taking ambo of " + poly.name + "..."); midName = function(v1, v2) { if (v1 < v2) { @@ -938,18 +938,18 @@ } }; flag = new polyflag(); - ref = poly.face; - for (i = l = 0, len = ref.length; l < len; i = ++l) { - f = ref[i]; - ref1 = f.slice(-2), v1 = ref1[0], v2 = ref1[1]; - for (o = 0, len1 = f.length; o < len1; o++) { - v3 = f[o]; + _ref = poly.face; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + f = _ref[i]; + _ref1 = f.slice(-2), v1 = _ref1[0], v2 = _ref1[1]; + for (_j = 0, _len1 = f.length; _j < _len1; _j++) { + v3 = f[_j]; if (v1 < v2) { flag.newV(midName(v1, v2), midpoint(poly.xyz[v1], poly.xyz[v2])); } flag.newFlag("orig" + i, midName(v1, v2), midName(v2, v3)); flag.newFlag("dual" + v2, midName(v2, v3), midName(v1, v2)); - ref2 = [v2, v3], v1 = ref2[0], v2 = ref2[1]; + _ref2 = [v2, v3], v1 = _ref2[0], v2 = _ref2[1]; } } newpoly = flag.topoly(); @@ -958,25 +958,25 @@ }; gyro = function(poly) { - var centers, f, flag, fname, i, j, l, len, len1, len2, len3, newpoly, o, ref, ref1, ref2, ref3, ref4, u, v, v1, v2, v3, w; + var centers, f, flag, fname, i, j, newpoly, v, v1, v2, v3, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3, _ref4; console.log("Taking gyro of " + poly.name + "..."); flag = new polyflag(); - ref = poly.xyz; - for (i = l = 0, len = ref.length; l < len; i = ++l) { - v = ref[i]; + _ref = poly.xyz; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + v = _ref[i]; flag.newV("v" + i, unit(v)); } centers = poly.centers(); - ref1 = poly.face; - for (i = o = 0, len1 = ref1.length; o < len1; i = ++o) { - f = ref1[i]; + _ref1 = poly.face; + for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) { + f = _ref1[i]; flag.newV("center" + i, unit(centers[i])); } - ref2 = poly.face; - for (i = u = 0, len2 = ref2.length; u < len2; i = ++u) { - f = ref2[i]; - ref3 = f.slice(-2), v1 = ref3[0], v2 = ref3[1]; - for (j = w = 0, len3 = f.length; w < len3; j = ++w) { + _ref2 = poly.face; + for (i = _k = 0, _len2 = _ref2.length; _k < _len2; i = ++_k) { + f = _ref2[i]; + _ref3 = f.slice(-2), v1 = _ref3[0], v2 = _ref3[1]; + for (j = _l = 0, _len3 = f.length; _l < _len3; j = ++_l) { v = f[j]; v3 = v; flag.newV(v1 + "~" + v2, oneThird(poly.xyz[v1], poly.xyz[v2])); @@ -986,7 +986,7 @@ flag.newFlag(fname, v2 + "~" + v1, "v" + v2); flag.newFlag(fname, "v" + v2, v2 + "~" + v3); flag.newFlag(fname, v2 + "~" + v3, "center" + i); - ref4 = [v2, v3], v1 = ref4[0], v2 = ref4[1]; + _ref4 = [v2, v3], v1 = _ref4[0], v2 = _ref4[1]; } } newpoly = flag.topoly(); @@ -995,29 +995,29 @@ }; propellor = function(poly) { - var f, flag, fname, i, l, len, len1, len2, newpoly, o, ref, ref1, ref2, ref3, u, v, v1, v2, v3; + var f, flag, fname, i, newpoly, v, v1, v2, v3, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _ref3; console.log("Taking propellor of " + poly.name + "..."); flag = new polyflag(); - ref = poly.xyz; - for (i = l = 0, len = ref.length; l < len; i = ++l) { - v = ref[i]; + _ref = poly.xyz; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + v = _ref[i]; flag.newV("v" + i, unit(v)); } - ref1 = poly.face; - for (i = o = 0, len1 = ref1.length; o < len1; i = ++o) { - f = ref1[i]; - ref2 = f.slice(-2), v1 = ref2[0], v2 = ref2[1]; - for (u = 0, len2 = f.length; u < len2; u++) { - v = f[u]; + _ref1 = poly.face; + for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) { + f = _ref1[i]; + _ref2 = f.slice(-2), v1 = _ref2[0], v2 = _ref2[1]; + for (_k = 0, _len2 = f.length; _k < _len2; _k++) { + v = f[_k]; v3 = "" + v; flag.newV(v1 + "~" + v2, oneThird(poly.xyz[v1], poly.xyz[v2])); - fname = i + "f" + v2; + fname = "" + i + "f" + v2; flag.newFlag("v" + i, v1 + "~" + v2, v2 + "~" + v3); flag.newFlag(fname, v1 + "~" + v2, v2 + "~" + v1); flag.newFlag(fname, v2 + "~" + v1, "v" + v2); flag.newFlag(fname, "v" + v2, v2 + "~" + v3); flag.newFlag(fname, v2 + "~" + v3, v1 + "~" + v2); - ref3 = [v2, v3], v1 = ref3[0], v2 = ref3[1]; + _ref3 = [v2, v3], v1 = _ref3[0], v2 = _ref3[1]; } } newpoly = flag.topoly(); @@ -1026,12 +1026,12 @@ }; reflect = function(poly) { - var i, l, o, ref, ref1; + var i, _i, _j, _ref, _ref1; console.log("Taking reflection of " + poly.name + "..."); - for (i = l = 0, ref = poly.xyz.length - 1; 0 <= ref ? l <= ref : l >= ref; i = 0 <= ref ? ++l : --l) { + for (i = _i = 0, _ref = poly.xyz.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) { poly.xyz[i] = mult(-1, poly.xyz[i]); } - for (i = o = 0, ref1 = poly.face.length - 1; 0 <= ref1 ? o <= ref1 : o >= ref1; i = 0 <= ref1 ? ++o : --o) { + for (i = _j = 0, _ref1 = poly.face.length - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) { poly.face[i] = poly.face[i].reverse(); } poly.name = "r" + poly.name; @@ -1039,42 +1039,42 @@ }; dual = function(poly) { - var aa, ab, ac, centers, dpoly, f, face, flag, i, k, l, len, len1, len2, len3, len4, o, ref, ref1, ref2, ref3, ref4, sortF, u, v1, v2, w; + var centers, dpoly, f, face, flag, i, k, sortF, v1, v2, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _n, _o, _ref, _ref1, _ref2, _ref3, _ref4; console.log("Taking dual of " + poly.name + "..."); flag = new polyflag(); face = []; - for (i = l = 0, ref = poly.xyz.length - 1; 0 <= ref ? l <= ref : l >= ref; i = 0 <= ref ? ++l : --l) { + for (i = _i = 0, _ref = poly.xyz.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) { face[i] = {}; } - ref1 = poly.face; - for (i = o = 0, len = ref1.length; o < len; i = ++o) { - f = ref1[i]; + _ref1 = poly.face; + for (i = _j = 0, _len = _ref1.length; _j < _len; i = ++_j) { + f = _ref1[i]; v1 = f[f.length - 1]; - for (u = 0, len1 = f.length; u < len1; u++) { - v2 = f[u]; + for (_k = 0, _len1 = f.length; _k < _len1; _k++) { + v2 = f[_k]; face[v1]["v" + v2] = "" + i; v1 = v2; } } centers = poly.centers(); - for (i = w = 0, ref2 = poly.face.length - 1; 0 <= ref2 ? w <= ref2 : w >= ref2; i = 0 <= ref2 ? ++w : --w) { + for (i = _l = 0, _ref2 = poly.face.length - 1; 0 <= _ref2 ? _l <= _ref2 : _l >= _ref2; i = 0 <= _ref2 ? ++_l : --_l) { flag.newV("" + i, centers[i]); } - ref3 = poly.face; - for (i = aa = 0, len2 = ref3.length; aa < len2; i = ++aa) { - f = ref3[i]; + _ref3 = poly.face; + for (i = _m = 0, _len2 = _ref3.length; _m < _len2; i = ++_m) { + f = _ref3[i]; v1 = f[f.length - 1]; - for (ab = 0, len3 = f.length; ab < len3; ab++) { - v2 = f[ab]; + for (_n = 0, _len3 = f.length; _n < _len3; _n++) { + v2 = f[_n]; flag.newFlag(v1, face[v2]["v" + v1], "" + i); v1 = v2; } } dpoly = flag.topoly(); sortF = []; - ref4 = dpoly.face; - for (ac = 0, len4 = ref4.length; ac < len4; ac++) { - f = ref4[ac]; + _ref4 = dpoly.face; + for (_o = 0, _len4 = _ref4.length; _o < _len4; _o++) { + f = _ref4[_o]; k = intersect(poly.face[f[0]], poly.face[f[1]], poly.face[f[2]]); sortF[k] = f; } @@ -1088,7 +1088,7 @@ }; chamfer = function(poly, dist) { - var f, facename, flag, hexName, i, l, len, len1, newpoly, normals, o, ref, v1, v1new, v2, v2new; + var f, facename, flag, hexName, i, newpoly, normals, v1, v1new, v2, v2new, _i, _j, _len, _len1, _ref; dist || (dist = 0.5); flag = new polyflag(); normals = poly.normals(); @@ -1099,13 +1099,13 @@ return "hex" + v2 + "_" + v1; } }; - ref = poly.face; - for (i = l = 0, len = ref.length; l < len; i = ++l) { - f = ref[i]; + _ref = poly.face; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + f = _ref[i]; v1 = f[f.length - 1]; v1new = i + "_" + v1; - for (o = 0, len1 = f.length; o < len1; o++) { - v2 = f[o]; + for (_j = 0, _len1 = f.length; _j < _len1; _j++) { + v2 = f[_j]; flag.newV(v2, mult(1.0 + dist, poly.xyz[v2])); v2new = i + "_" + v2; flag.newV(v2new, add(poly.xyz[v2], mult(dist * 1.5, normals[i]))); @@ -1128,36 +1128,36 @@ }; insetN = function(poly, n, inset_dist, popout_dist) { - var aa, centers, f, flag, fname, foundAny, i, l, len, len1, len2, len3, len4, newpoly, normals, o, p, ref, ref1, ref2, u, v, v1, v2, w; + var centers, f, flag, fname, foundAny, i, newpoly, normals, p, v, v1, v2, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2; n || (n = 0); inset_dist || (inset_dist = 0.5); popout_dist || (popout_dist = -0.2); console.log("Taking inset of " + (n === 0 ? "" : n) + "-sided faces of " + poly.name + "..."); flag = new polyflag(); - ref = poly.xyz; - for (i = l = 0, len = ref.length; l < len; i = ++l) { - p = ref[i]; + _ref = poly.xyz; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + p = _ref[i]; flag.newV("v" + i, p); } normals = poly.normals(); centers = poly.centers(); - ref1 = poly.face; - for (i = o = 0, len1 = ref1.length; o < len1; i = ++o) { - f = ref1[i]; + _ref1 = poly.face; + for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) { + f = _ref1[i]; if (f.length === n || n === 0) { - for (u = 0, len2 = f.length; u < len2; u++) { - v = f[u]; + for (_k = 0, _len2 = f.length; _k < _len2; _k++) { + v = f[_k]; flag.newV("f" + i + "v" + v, add(tween(poly.xyz[v], centers[i], inset_dist), mult(popout_dist, normals[i]))); } } } foundAny = false; - ref2 = poly.face; - for (i = w = 0, len3 = ref2.length; w < len3; i = ++w) { - f = ref2[i]; + _ref2 = poly.face; + for (i = _l = 0, _len3 = _ref2.length; _l < _len3; i = ++_l) { + f = _ref2[i]; v1 = "v" + f[f.length - 1]; - for (aa = 0, len4 = f.length; aa < len4; aa++) { - v = f[aa]; + for (_m = 0, _len4 = f.length; _m < _len4; _m++) { + v = f[_m]; v2 = "v" + v; if (f.length === n || n === 0) { foundAny = true; @@ -1182,34 +1182,34 @@ }; extrudeN = function(poly, n) { - var aa, centers, f, flag, foundAny, i, l, len, len1, len2, len3, len4, newpoly, normals, o, p, ref, ref1, ref2, u, v, v1, v2, w; + var centers, f, flag, foundAny, i, newpoly, normals, p, v, v1, v2, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2; n || (n = 0); console.log("Taking extrusion of " + (n === 0 ? "" : n) + "-sided faces of " + poly.name + "..."); flag = new polyflag(); - ref = poly.xyz; - for (i = l = 0, len = ref.length; l < len; i = ++l) { - p = ref[i]; + _ref = poly.xyz; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + p = _ref[i]; flag.newV("v" + i, p); } normals = poly.normals(); centers = poly.centers(); - ref1 = poly.face; - for (i = o = 0, len1 = ref1.length; o < len1; i = ++o) { - f = ref1[i]; + _ref1 = poly.face; + for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) { + f = _ref1[i]; if (f.length === n || n === 0) { - for (u = 0, len2 = f.length; u < len2; u++) { - v = f[u]; + for (_k = 0, _len2 = f.length; _k < _len2; _k++) { + v = f[_k]; flag.newV("f" + i + "v" + v, add(poly.xyz[v], mult(0.3, normals[i]))); } } } foundAny = false; - ref2 = poly.face; - for (i = w = 0, len3 = ref2.length; w < len3; i = ++w) { - f = ref2[i]; + _ref2 = poly.face; + for (i = _l = 0, _len3 = _ref2.length; _l < _len3; i = ++_l) { + f = _ref2[i]; v1 = "v" + f[f.length - 1]; - for (aa = 0, len4 = f.length; aa < len4; aa++) { - v = f[aa]; + for (_m = 0, _len4 = f.length; _m < _len4; _m++) { + v = f[_m]; v2 = "v" + v; if (f.length === n || n === 0) { foundAny = true; @@ -1232,25 +1232,81 @@ return newpoly; }; + hollow = function(poly, n, inset_dist, thickness) { + var centers, dualnormals, f, flag, fname, foundAny, i, newpoly, normals, p, v, v1, v2, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2; + n || (n = 0); + inset_dist || (inset_dist = 0.5); + thickness || (thickness = 0.2); + console.log("Skeletonizing " + (n === 0 ? "" : n) + "-sided faces of " + poly.name + "..."); + dualnormals = dual(poly).normals(); + normals = poly.normals(); + centers = poly.centers(); + flag = new polyflag(); + _ref = poly.xyz; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + p = _ref[i]; + flag.newV("v" + i, p); + flag.newV("downv" + i, add(p, mult(-1 * thickness, dualnormals[i]))); + } + _ref1 = poly.face; + for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) { + f = _ref1[i]; + for (_k = 0, _len2 = f.length; _k < _len2; _k++) { + v = f[_k]; + flag.newV("fin" + i + "v" + v, tween(poly.xyz[v], centers[i], inset_dist)); + flag.newV("findown" + i + "v" + v, add(tween(poly.xyz[v], centers[i], inset_dist), mult(-1 * thickness, normals[i]))); + } + } + _ref2 = poly.face; + for (i = _l = 0, _len3 = _ref2.length; _l < _len3; i = ++_l) { + f = _ref2[i]; + v1 = "v" + f[f.length - 1]; + for (_m = 0, _len4 = f.length; _m < _len4; _m++) { + v = f[_m]; + v2 = "v" + v; + foundAny = true; + fname = i + v1; + flag.newFlag(fname, v1, v2); + flag.newFlag(fname, v2, "fin" + i + v2); + flag.newFlag(fname, "fin" + i + v2, "fin" + i + v1); + flag.newFlag(fname, "fin" + i + v1, v1); + fname = "sides" + i + v1; + flag.newFlag(fname, "fin" + i + v1, "fin" + i + v2); + flag.newFlag(fname, "fin" + i + v2, "findown" + i + v2); + flag.newFlag(fname, "findown" + i + v2, "findown" + i + v1); + flag.newFlag(fname, "findown" + i + v1, "fin" + i + v1); + fname = "bottom" + i + v1; + flag.newFlag(fname, "down" + v2, "down" + v1); + flag.newFlag(fname, "down" + v1, "findown" + i + v1); + flag.newFlag(fname, "findown" + i + v1, "findown" + i + v2); + flag.newFlag(fname, "findown" + i + v2, "down" + v2); + v1 = v2; + } + } + newpoly = flag.topoly(); + newpoly.name = "h" + poly.name; + return newpoly; + }; + stellaN = function(poly) { - var centers, f, flag, i, l, len, len1, len2, newpoly, o, p, ref, ref1, ref2, ref3, u, v, v1, v12, v2, v21, v23, v3, vert1, vert2, vert3; + var centers, f, flag, i, newpoly, p, v, v1, v12, v2, v21, v23, v3, vert1, vert2, vert3, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _ref3; console.log("Taking stella of " + poly.name + "..."); centers = poly.centers(); flag = new polyflag(); - ref = poly.xyz; - for (i = l = 0, len = ref.length; l < len; i = ++l) { - p = ref[i]; + _ref = poly.xyz; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + p = _ref[i]; flag.newV("v" + i, p); } - ref1 = poly.face; - for (i = o = 0, len1 = ref1.length; o < len1; i = ++o) { - f = ref1[i]; + _ref1 = poly.face; + for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) { + f = _ref1[i]; v1 = "v" + f[f.length - 2]; v2 = "v" + f[f.length - 1]; vert1 = poly.xyz[f[f.length - 2]]; vert2 = poly.xyz[f[f.length - 1]]; - for (u = 0, len2 = f.length; u < len2; u++) { - v = f[u]; + for (_k = 0, _len2 = f.length; _k < _len2; _k++) { + v = f[_k]; v3 = "v" + v; vert3 = poly.xyz[v]; v12 = v1 + "~" + v2; @@ -1264,8 +1320,8 @@ flag.newFlag("f" + v12, v1, v21); flag.newFlag("f" + v12, v21, v12); flag.newFlag("f" + v12, v12, v1); - ref2 = [v2, v3], v1 = ref2[0], v2 = ref2[1]; - ref3 = [vert2, vert3], vert1 = ref3[0], vert2 = ref3[1]; + _ref2 = [v2, v3], v1 = _ref2[0], v2 = _ref2[1]; + _ref3 = [vert2, vert3], vert1 = _ref3[0], vert2 = _ref3[1]; } } newpoly = flag.topoly(); @@ -1274,11 +1330,11 @@ }; tangentify = function(xyzs, edges) { - var STABILITY_FACTOR, c, e, l, len, newVs, t; + var STABILITY_FACTOR, c, e, newVs, t, _i, _len; STABILITY_FACTOR = 0.1; newVs = copyVecArray(xyzs); - for (l = 0, len = edges.length; l < len; l++) { - e = edges[l]; + for (_i = 0, _len = edges.length; _i < _len; _i++) { + e = edges[_i]; t = tangentPoint(newVs[e[0]], newVs[e[1]]); c = mult(STABILITY_FACTOR * 1 / 2 * (1 - sqrt(dot(t, t))), t); newVs[e[0]] = add(newVs[e[0]], c); @@ -1288,19 +1344,19 @@ }; recenter = function(xyzs, edges) { - var a, b, edgecenters, l, len, polycenter, v; + var a, b, edgecenters, polycenter, v, _i, _len; edgecenters = (function() { - var l, len, ref, results; - results = []; - for (l = 0, len = edges.length; l < len; l++) { - ref = edges[l], a = ref[0], b = ref[1]; - results.push(tangentPoint(xyzs[a], xyzs[b])); + var _i, _len, _ref, _results; + _results = []; + for (_i = 0, _len = edges.length; _i < _len; _i++) { + _ref = edges[_i], a = _ref[0], b = _ref[1]; + _results.push(tangentPoint(xyzs[a], xyzs[b])); } - return results; + return _results; })(); polycenter = [0, 0, 0]; - for (l = 0, len = edgecenters.length; l < len; l++) { - v = edgecenters[l]; + for (_i = 0, _len = edgecenters.length; _i < _len; _i++) { + v = edgecenters[_i]; polycenter = add(polycenter, v); } polycenter = mult(1 / edges.length, polycenter); @@ -1322,27 +1378,27 @@ }; planarize = function(xyzs, faces) { - var STABILITY_FACTOR, c, coords, f, l, len, len1, n, newVs, o, v; + var STABILITY_FACTOR, c, coords, f, n, newVs, v, _i, _j, _len, _len1; STABILITY_FACTOR = 0.1; newVs = copyVecArray(xyzs); - for (l = 0, len = faces.length; l < len; l++) { - f = faces[l]; + for (_i = 0, _len = faces.length; _i < _len; _i++) { + f = faces[_i]; coords = (function() { - var len1, o, results; - results = []; - for (o = 0, len1 = f.length; o < len1; o++) { - v = f[o]; - results.push(xyzs[v]); + var _j, _len1, _results; + _results = []; + for (_j = 0, _len1 = f.length; _j < _len1; _j++) { + v = f[_j]; + _results.push(xyzs[v]); } - return results; + return _results; })(); n = normal(coords); c = calcCentroid(coords); if (dot(n, c) < 0) { n = mult(-1.0, n); } - for (o = 0, len1 = f.length; o < len1; o++) { - v = f[o]; + for (_j = 0, _len1 = f.length; _j < _len1; _j++) { + v = f[_j]; newVs[v] = add(newVs[v], mult(dot(mult(STABILITY_FACTOR, n), sub(c, xyzs[v])), n)); } } @@ -1350,21 +1406,21 @@ }; canonicalize = function(poly, Niter) { - var edges, faces, i, l, maxChange, newVs, newpoly, oldVs, ref; + var edges, faces, i, maxChange, newVs, newpoly, oldVs, _i; Niter || (Niter = 1); console.log("Canonicalizing " + poly.name + "..."); faces = poly.face; edges = poly.edges(); newVs = poly.xyz; maxChange = 1.0; - for (i = l = 0, ref = Niter; 0 <= ref ? l <= ref : l >= ref; i = 0 <= ref ? ++l : --l) { + for (i = _i = 0; 0 <= Niter ? _i <= Niter : _i >= Niter; i = 0 <= Niter ? ++_i : --_i) { oldVs = copyVecArray(newVs); newVs = tangentify(newVs, edges); newVs = recenter(newVs, edges); newVs = planarize(newVs, faces); - maxChange = _.max(_.map(_.zip(newVs, oldVs), function(arg) { + maxChange = _.max(_.map(_.zip(newVs, oldVs), function(_arg) { var x, y; - x = arg[0], y = arg[1]; + x = _arg[0], y = _arg[1]; return mag(sub(x, y)); })); if (maxChange < 1e-8) { @@ -1378,31 +1434,31 @@ }; reciprocalC = function(poly) { - var c, centers, l, len; + var c, centers, _i, _len; centers = poly.centers(); - for (l = 0, len = centers.length; l < len; l++) { - c = centers[l]; + for (_i = 0, _len = centers.length; _i < _len; _i++) { + c = centers[_i]; c = mult(1.0 / dot(c, c), c); } return centers; }; reciprocalN = function(poly) { - var ans, avgEdgeDist, centroid, f, l, len, len1, normalV, o, ref, ref1, ref2, tmp, v1, v2, v3; + var ans, avgEdgeDist, centroid, f, normalV, tmp, v1, v2, v3, _i, _j, _len, _len1, _ref, _ref1, _ref2; ans = []; - ref = poly.face; - for (l = 0, len = ref.length; l < len; l++) { - f = ref[l]; + _ref = poly.face; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + f = _ref[_i]; centroid = [0, 0, 0]; normalV = [0, 0, 0]; avgEdgeDist = 0.0; - ref1 = f.slice(-2), v1 = ref1[0], v2 = ref1[1]; - for (o = 0, len1 = f.length; o < len1; o++) { - v3 = f[o]; + _ref1 = f.slice(-2), v1 = _ref1[0], v2 = _ref1[1]; + for (_j = 0, _len1 = f.length; _j < _len1; _j++) { + v3 = f[_j]; centroid = add(centroid, poly.xyz[v3]); normalV = add(normalV, orthogonal(poly.xyz[v1], poly.xyz[v2], poly.xyz[v3])); avgEdgeDist += edgeDist(poly.xyz[v1], poly.xyz[v2]); - ref2 = [v2, v3], v1 = ref2[0], v2 = ref2[1]; + _ref2 = [v2, v3], v1 = _ref2[0], v2 = _ref2[1]; } centroid = mult(1.0 / f.length, centroid); normalV = unit(normalV); @@ -1414,11 +1470,11 @@ }; canonicalXYZ = function(poly, nIterations) { - var count, dpoly, l, ref; + var count, dpoly, _i; nIterations || (nIterations = 1); dpoly = dual(poly); console.log("Pseudo-canonicalizing " + poly.name + "..."); - for (count = l = 0, ref = nIterations; 0 <= ref ? l < ref : l > ref; count = 0 <= ref ? ++l : --l) { + for (count = _i = 0; 0 <= nIterations ? _i < nIterations : _i > nIterations; count = 0 <= nIterations ? ++_i : --_i) { dpoly.xyz = reciprocalN(poly); poly.xyz = reciprocalN(dpoly); } @@ -1426,11 +1482,11 @@ }; adjustXYZ = function(poly, nIterations) { - var count, dpoly, l, ref; + var count, dpoly, _i; nIterations || (nIterations = 1); dpoly = dual(poly); console.log("Planarizing " + poly.name + "..."); - for (count = l = 0, ref = nIterations; 0 <= ref ? l < ref : l > ref; count = 0 <= ref ? ++l : --l) { + for (count = _i = 0; 0 <= nIterations ? _i < nIterations : _i > nIterations; count = 0 <= nIterations ? ++_i : --_i) { dpoly.xyz = reciprocalC(poly); poly.xyz = reciprocalC(dpoly); } @@ -1438,7 +1494,7 @@ }; getDiagonals = function(verts) { - var Area2, Between, Collinear, Diagonal, Diagonalie, InCone, Intersect, IntersectProp, Left, LeftOn, XOR, broke, diagonals, ear, facelen, head, l, limiter, n, origIdx, ref, results, v0, v1, v2, v3, v4, y, z; + var Area2, Between, Collinear, Diagonal, Diagonalie, InCone, Intersect, IntersectProp, Left, LeftOn, XOR, broke, diagonals, ear, facelen, head, limiter, n, origIdx, v0, v1, v2, v3, v4, y, z, _i, _ref, _results; limiter = 999; diagonals = []; ear = []; @@ -1523,9 +1579,9 @@ } } origIdx = (function() { - results = []; - for (var l = 0, ref = facelen - 1; 0 <= ref ? l <= ref : l >= ref; 0 <= ref ? l++ : l--){ results.push(l); } - return results; + _results = []; + for (var _i = 0, _ref = facelen - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); } + return _results; }).apply(this); n = facelen; z = limiter; @@ -1582,49 +1638,49 @@ }; diagsToTris = function(f, diags) { - var aa, ab, ac, ad, ae, already_present, d, e1, e2, edges, extant_tri, i, l, len, len1, len2, len3, len4, len5, len6, len7, len8, o, redges, ref, ref1, ref2, ref3, ref4, ref5, tri, tris, u, uniques, v1, v2, w; + var already_present, d, e1, e2, edges, extant_tri, i, redges, tri, tris, uniques, v1, v2, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _len6, _len7, _len8, _m, _n, _o, _p, _q, _ref, _ref1, _ref2, _ref3, _ref4, _ref5; edges = []; redges = []; - ref = (function() { - var o, ref, results; - results = []; - for (i = o = 0, ref = f.length - 1; 0 <= ref ? o <= ref : o >= ref; i = 0 <= ref ? ++o : --o) { - results.push([i, (i + 1) % f.length]); + _ref = (function() { + var _j, _ref, _results; + _results = []; + for (i = _j = 0, _ref = f.length - 1; 0 <= _ref ? _j <= _ref : _j >= _ref; i = 0 <= _ref ? ++_j : --_j) { + _results.push([i, (i + 1) % f.length]); } - return results; + return _results; })(); - for (l = 0, len = ref.length; l < len; l++) { - ref1 = ref[l], v1 = ref1[0], v2 = ref1[1]; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + _ref1 = _ref[_i], v1 = _ref1[0], v2 = _ref1[1]; edges[v1] = [v2]; redges[v2] = [v1]; } - for (o = 0, len1 = diags.length; o < len1; o++) { - d = diags[o]; + for (_j = 0, _len1 = diags.length; _j < _len1; _j++) { + d = diags[_j]; edges[d[0]].push(d[1]); edges[d[1]].push(d[0]); redges[d[0]].push(d[1]); redges[d[1]].push(d[0]); } tris = []; - for (u = 0, len2 = diags.length; u < len2; u++) { - d = diags[u]; - ref2 = edges[d[1]]; - for (w = 0, len3 = ref2.length; w < len3; w++) { - e1 = ref2[w]; - ref3 = redges[d[0]]; - for (aa = 0, len4 = ref3.length; aa < len4; aa++) { - e2 = ref3[aa]; + for (_k = 0, _len2 = diags.length; _k < _len2; _k++) { + d = diags[_k]; + _ref2 = edges[d[1]]; + for (_l = 0, _len3 = _ref2.length; _l < _len3; _l++) { + e1 = _ref2[_l]; + _ref3 = redges[d[0]]; + for (_m = 0, _len4 = _ref3.length; _m < _len4; _m++) { + e2 = _ref3[_m]; if (e1 === e2) { tris.push([d[0], d[1], e1]); } } } - ref4 = edges[d[0]]; - for (ab = 0, len5 = ref4.length; ab < len5; ab++) { - e1 = ref4[ab]; - ref5 = redges[d[1]]; - for (ac = 0, len6 = ref5.length; ac < len6; ac++) { - e2 = ref5[ac]; + _ref4 = edges[d[0]]; + for (_n = 0, _len5 = _ref4.length; _n < _len5; _n++) { + e1 = _ref4[_n]; + _ref5 = redges[d[1]]; + for (_o = 0, _len6 = _ref5.length; _o < _len6; _o++) { + e2 = _ref5[_o]; if (e1 === e2) { tris.push([d[1], d[0], e1]); } @@ -1632,11 +1688,11 @@ } } uniques = [tris.pop()]; - for (ad = 0, len7 = tris.length; ad < len7; ad++) { - tri = tris[ad]; + for (_p = 0, _len7 = tris.length; _p < _len7; _p++) { + tri = tris[_p]; already_present = false; - for (ae = 0, len8 = uniques.length; ae < len8; ae++) { - extant_tri = uniques[ae]; + for (_q = 0, _len8 = uniques.length; _q < _len8; _q++) { + extant_tri = uniques[_q]; if (triEq(tri, extant_tri)) { already_present = true; break; @@ -1650,28 +1706,28 @@ }; triangulate = function(poly, colors) { - var TwoDface, diags, f, i, j, l, len, len1, newpoly, o, ref, tri, tris, v; + var TwoDface, diags, f, i, j, newpoly, tri, tris, v, _i, _j, _len, _len1, _ref; colors = colors || false; console.log("Triangulating faces of " + poly.name + "..."); newpoly = new polyhedron(); newpoly.xyz = clone(poly.xyz); newpoly.face_class = []; - ref = poly.face; - for (i = l = 0, len = ref.length; l < len; i = ++l) { - f = ref[i]; + _ref = poly.face; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + f = _ref[i]; if (f.length > 3) { TwoDface = project2dface((function() { - var len1, o, results; - results = []; - for (o = 0, len1 = f.length; o < len1; o++) { - v = f[o]; - results.push(poly.xyz[v]); + var _j, _len1, _results; + _results = []; + for (_j = 0, _len1 = f.length; _j < _len1; _j++) { + v = f[_j]; + _results.push(poly.xyz[v]); } - return results; + return _results; })()); diags = getDiagonals(TwoDface); tris = diagsToTris(f, diags); - for (j = o = 0, len1 = tris.length; o < len1; j = ++o) { + for (j = _j = 0, _len1 = tris.length; _j < _len1; j = ++_j) { tri = tris[j]; newpoly.face.push([f[tri[0]], f[tri[1]], f[tri[2]]]); if (colors) { @@ -1690,14 +1746,14 @@ }; topolog = function(poly) { - var f, l, len, len1, o, ref, str, v; + var f, str, v, _i, _j, _len, _len1, _ref; str = ""; - ref = poly.face; - for (l = 0, len = ref.length; l < len; l++) { - f = ref[l]; - for (o = 0, len1 = f.length; o < len1; o++) { - v = f[o]; - str += v + "->"; + _ref = poly.face; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + f = _ref[_i]; + for (_j = 0, _len1 = f.length; _j < _len1; _j++) { + v = f[_j]; + str += "" + v + "->"; } str += "\n"; } @@ -1705,15 +1761,15 @@ }; testrig = function() { - var l, len, len1, o, op, ops, seed, seeds; + var op, ops, seed, seeds, _i, _j, _len, _len1; seeds = ["T", "O", "C", "I", "D", "P3", "P4", "A4", "A5", "Y3", "Y4"]; ops = ["k", "a", "g", "p", "d", "n", "x", "*"]; console.log("===== Test Basic Ops ====="); - for (l = 0, len = ops.length; l < len; l++) { - op = ops[l]; + for (_i = 0, _len = ops.length; _i < _len; _i++) { + op = ops[_i]; console.log("Operator " + op); - for (o = 0, len1 = seeds.length; o < len1; o++) { - seed = seeds[o]; + for (_j = 0, _len1 = seeds.length; _j < _len1; _j++) { + seed = seeds[_j]; console.log(op + seed + ":", generatePoly(op + seed)); } } @@ -1746,6 +1802,7 @@ "g": gyro, "p": propellor, "r": reflect, + "h": hollow, "c": chamfer, "w": whirl, "n": insetN, @@ -1760,26 +1817,26 @@ specreplacements = [[/e/g, "aa"], [/b/g, "ta"], [/o/g, "jj"], [/m/g, "kj"], [/t(\d*)/g, "dk$1d"], [/j/g, "dad"], [/s/g, "dgd"], [/dd/g, ""], [/ad/g, "a"], [/gd/g, "g"], [/aO/g, "aC"], [/aI/g, "aD"], [/gO/g, "gC"], [/gI/g, "gD"]]; getOps = function(notation) { - var equiv, expanded, l, len, orig, ref; + var equiv, expanded, orig, _i, _len, _ref; expanded = notation; - for (l = 0, len = specreplacements.length; l < len; l++) { - ref = specreplacements[l], orig = ref[0], equiv = ref[1]; + for (_i = 0, _len = specreplacements.length; _i < _len; _i++) { + _ref = specreplacements[_i], orig = _ref[0], equiv = _ref[1]; expanded = expanded.replace(orig, equiv); } - console.log(notation + " executed as " + expanded); + console.log("" + notation + " executed as " + expanded); return expanded; }; newgeneratePoly = function(notation) { - var baseargs, basefunc, l, len, op, opargs, opfunc, oplist, ops_spec, poly; + var baseargs, basefunc, op, opargs, opfunc, oplist, ops_spec, poly, _i, _len; ops_spec = getOps(notation); oplist = op_parser.parse(ops_spec).reverse(); op = oplist.shift(); basefunc = basemap[op["op"]]; baseargs = op["args"]; poly = dispatch(basefunc, baseargs); - for (l = 0, len = oplist.length; l < len; l++) { - op = oplist[l]; + for (_i = 0, _len = oplist.length; _i < _len; _i++) { + op = oplist[_i]; opfunc = opmap[op["op"]]; opargs = [poly].concat(op["args"]); poly = dispatch(opfunc, opargs); @@ -1909,7 +1966,7 @@ }; drawpoly = function(poly, tvec) { - var clr, face, face_verts, fno, illum, l, len, len1, o, oldxyz, ref, ref1, ref2, v, v0, x, y; + var clr, face, face_verts, fno, illum, oldxyz, v, v0, x, y, _i, _j, _len, _len1, _ref, _ref1, _ref2; tvec || (tvec = [3, 3, 3]); oldxyz = _.map(poly.xyz, function(x) { return x; @@ -1918,27 +1975,27 @@ return mv3(globRotM, x); }); sortfaces(poly); - ref = poly.face; - for (fno = l = 0, len = ref.length; l < len; fno = ++l) { - face = ref[fno]; + _ref = poly.face; + for (fno = _i = 0, _len = _ref.length; _i < _len; fno = ++_i) { + face = _ref[fno]; ctx.beginPath(); v0 = face[face.length - 1]; - ref1 = perspT(add(tvec, poly.xyz[v0]), persp_z_max, persp_z_min, persp_ratio, perspective_scale), x = ref1[0], y = ref1[1]; + _ref1 = perspT(add(tvec, poly.xyz[v0]), persp_z_max, persp_z_min, persp_ratio, perspective_scale), x = _ref1[0], y = _ref1[1]; ctx.moveTo(x + _2d_x_offset, y + _2d_y_offset); - for (o = 0, len1 = face.length; o < len1; o++) { - v = face[o]; - ref2 = perspT(add(tvec, poly.xyz[v]), persp_z_max, persp_z_min, persp_ratio, perspective_scale), x = ref2[0], y = ref2[1]; + for (_j = 0, _len1 = face.length; _j < _len1; _j++) { + v = face[_j]; + _ref2 = perspT(add(tvec, poly.xyz[v]), persp_z_max, persp_z_min, persp_ratio, perspective_scale), x = _ref2[0], y = _ref2[1]; ctx.lineTo(x + _2d_x_offset, y + _2d_y_offset); } clr = palette(poly.face_class[fno]); face_verts = (function() { - var len2, results, u; - results = []; - for (u = 0, len2 = face.length; u < len2; u++) { - v = face[u]; - results.push(poly.xyz[v]); + var _k, _len2, _results; + _results = []; + for (_k = 0, _len2 = face.length; _k < _len2; _k++) { + v = face[_k]; + _results.push(poly.xyz[v]); } - return results; + return _results; })(); illum = dot(normal(face_verts), unit([1, -1, 0])); clr = mult((illum / 2.0 + .5) * 0.7 + 0.3, clr); @@ -1963,32 +2020,32 @@ }; drawShape = function() { - var i, l, len, p, results; + var i, p, _i, _len, _results; clear(); - results = []; - for (i = l = 0, len = globPolys.length; l < len; i = ++l) { + _results = []; + for (i = _i = 0, _len = globPolys.length; _i < _len; i = ++_i) { p = globPolys[i]; - results.push(drawpoly(p, [0 + 3 * i, 0, 3])); + _results.push(drawpoly(p, [0 + 3 * i, 0, 3])); } - return results; + return _results; }; updateStats = function() { - var i, l, len, p, results; - results = []; - for (i = l = 0, len = globPolys.length; l < len; i = ++l) { + var i, p, _i, _len, _results; + _results = []; + for (i = _i = 0, _len = globPolys.length; _i < _len; i = ++_i) { p = globPolys[i]; $("#basicstats").text(p.data()); - results.push($("#morestats").text(p.moreData())); + _results.push($("#morestats").text(p.moreData())); } - return results; + return _results; }; animateShape = function() { - var globtheta, i, l, len, p; + var globtheta, i, p, _i, _len; clear(); globtheta = (2 * Math.PI) / 180.0 * globtime.getSeconds() * 0.1; - for (i = l = 0, len = globPolys.length; l < len; i = ++l) { + for (i = _i = 0, _len = globPolys.length; _i < _len; i = ++_i) { p = globPolys[i]; drawpoly(p, [0 + 3 * i, 0, 3]); } diff --git a/polyhedronisme.min.js b/polyhedronisme.min.js index f3e7746..791b1fb 100644 --- a/polyhedronisme.min.js +++ b/polyhedronisme.min.js @@ -1 +1 @@ -(function(){var q,aV,aB,bp,an,a6,S,X,W,aI,ao,a2,aU,aL,h,o,ay,p,af,a4,z,y,aJ,bi,aZ,N,aA,bj,bn,g,n,bl,aO,L,bk,a7,I,az,ae,be,aj,u,bv,aq,D,aD,R,aK,aw,ac,v,aC,ba,am,J,a3,aF,P,j,al,w,a5,bu,a9,aM,E,F,aN,ad,av,e,m,K,a8,aX,aH,d,r,bt,ak,ap,au,bh,G,aY,Q,ag,br,x,M,A,bq,U,bf,ai,aR,bb,T,Z,s,bs,aP,bd,bc,aE,O,H,t,B,i,Y,aS,aG,ar,at,a1,aT,aQ,V,a0,bg,b,k,aa,C,f,ah,a,ab,l,bo,ax,aW,c,bm;aP=Math.random;Y=Math.round;am=Math.floor;V=Math.sqrt;a1=Math.sin;I=Math.cos;b=Math.tan;N=Math.asin;a4=Math.acos;aA=Math.atan;bb=Math.pow;af=Math.abs;aL=Math.PI;S=Math.LN10;e=Math.log;bb=Math.pow;m=function(bw){return e(bw)/S};at=function(by,bx){var bw;bw=bb(10,m(by)-am(m(by)));return""+(Y(bw*(bx-1)))};L=function(by){var bx,bw;if((by==null)||typeof by!=="object"){return by}bw=new by.constructor();for(bx in by){bw[bx]=L(by[bx])}return bw};bd=function(bx){var bw;bw=am(aP()*bx.length);return bx[bw]};d=function(bx,bw){return[bx*bw[0],bx*bw[1],bx*bw[2]]};p=function(bx,bw){return[bx[0]*bw[0],bx[1]*bw[1],bx[2]*bw[2]]};z=function(bx,bw){return[bx[0]+bw[0],bx[1]+bw[1],bx[2]+bw[2]]};bg=function(bx,bw){return[bx[0]-bw[0],bx[1]-bw[1],bx[2]-bw[2]]};D=function(bx,bw){return bx[0]*bw[0]+bx[1]*bw[1]+bx[2]*bw[2]};az=function(bx,bw){return[bx[1]*bw[2]-bx[2]*bw[1],bx[2]*bw[0]-bx[0]*bw[2],bx[0]*bw[1]-bx[1]*bw[0]]};K=function(bw){return V(D(bw,bw))};a8=function(bw){return D(bw,bw)};bo=function(bw){return d(1/V(a8(bw)),bw)};aX=function(bx,bw){return d(1/2,z(bx,bw))};l=function(by,bx,bw){return[(1-bw)*by[0]+bw*bx[0],(1-bw)*by[1]+bw*bx[1],(1-bw)*by[2]+bw*bx[2]]};au=function(bx,bw){return l(bx,bw,1/3)};aE=function(bw){return d(1/a8(bw),bw)};k=function(by,bx){var bw;bw=bg(bx,by);return bg(by,d(D(bw,by)/a8(bw),bw))};aw=function(bx,bw){return V(a8(k(bx,bw)))};av=function(bD,bC,bA){var bB,by,bx,bw,bz;by=bg(bC,bD);bB=bg(bD,bA);bx=a8(by);bz=-D(bB,by)/bx;if(bz<=0){return a8(bB)}else{if(bz>=1){bw=a8(bg(bC,bA))}}bw=a8(az(by,bB))/bx;return bw};aY=function(bA,bz,by){var bx,bw;bx=bg(bz,bA);bw=bg(by,bz);return az(bx,bw)};F=function(bC,bB,bz){var bx,bD,bA,by,bw,bG,bF,bE,bH;for(bx=0,bD=bC.length;bxbA;by=0<=bA?++bx:--bx){bw[by]=bz[by].slice(0)}return bw};r=function(bx,bw){return[bx[0][0]*bw[0]+bx[0][1]*bw[1]+bx[0][2]*bw[2],bx[1][0]*bw[0]+bx[1][1]*bw[1]+bx[1][2]*bw[2],bx[2][0]*bw[0]+bx[2][1]*bw[1]+bx[2][2]*bw[2]]};aH=function(bw,bx){return[[bw[0][0]*bx[0][0]+bw[0][1]*bx[1][0]+bw[0][2]*bx[2][0],bw[0][0]*bx[0][1]+bw[0][1]*bx[1][1]+bw[0][2]*bx[2][1],bw[0][0]*bx[0][2]+bw[0][1]*bx[1][2]+bw[0][2]*bx[2][2]],[bw[1][0]*bx[0][0]+bw[1][1]*bx[1][0]+bw[1][2]*bx[2][0],bw[1][0]*bx[0][1]+bw[1][1]*bx[1][1]+bw[1][2]*bx[2][1],bw[1][0]*bx[0][2]+bw[1][1]*bx[1][2]+bw[1][2]*bx[2][2]],[bw[2][0]*bx[0][0]+bw[2][1]*bx[1][0]+bw[2][2]*bx[2][0],bw[2][0]*bx[0][1]+bw[2][1]*bx[1][1]+bw[2][2]*bx[2][1],bw[2][0]*bx[0][2]+bw[2][1]*bx[1][2]+bw[2][2]*bx[2][2]]]};v=[[1,0,0],[0,1,0],[0,0,1]];i=function(bA,by,bz){var bB,bx,bw;bB=[[I(bA),-1*a1(bA),0],[a1(bA),I(bA),0],[0,0,1]];bw=[[I(by),0,-1*a1(by)],[0,1,0],[a1(by),0,I(by)]];bx=[[1,0,0],[0,I(bz),-1*a1(bz)],[0,a1(bz),I(bz)]];return aH(bx,aH(bw,bB))};aW=function(bA,bJ,bI,bE){var bC,bx,bz,by,bD,bH,bG,bw,bF,bB;bA/=2;bH=a1(bA);bC=I(bA);bG=bH*bH;bx=K([bJ,bI,bE]);if(bx===0){by=[0,0,1],bJ=by[0],bI=by[1],bE=by[2]}if(bx!==1){bD=bo([bJ,bI,bE]),bJ=bD[0],bI=bD[1],bE=bD[2]}if(bJ===1&&bI===0&&bE===0){bz=[[1,0,0],[0,1-2*bG,2*bH*bC],[0,-2*bH*bC,1-2*bG]]}else{if(bJ===0&&bI===1&&bE===0){bz=[[1-2*bG,0,-2*bH*bC],[0,1,0],[2*bH*bC,0,1-2*bG]]}else{if(bJ===0&&bI===0&&bE===1){bz=[[1-2*bG,2*bH*bC,0],[-2*bH*bC,1-2*bG,0],[0,0,1]]}else{bw=bJ*bJ;bF=bI*bI;bB=bE*bE;bz=[[1-2*(bF+bB)*bG,2*(bJ*bI*bG+bE*bH*bC),2*(bJ*bE*bG-bI*bH*bC)],[2*(bI*bJ*bG-bE*bH*bC),1-2*(bB+bw)*bG,2*(bI*bE*bG+bJ*bH*bC)],[2*(bE*bJ*bG+bI*bH*bC),2*(bE*bI*bG-bJ*bH*bC),1-2*(bw+bF)*bG]]}}}return bz};x=function(by,bx,bz,bC,bw){var bA,bB;bB=(bx*bC-bz)/(1-bC);bA=bw*bC/(1-bC);return[bA*by[0]/(by[2]+bB),bA*by[1]/(by[2]+bB)]};aN=function(bD,bA,bG,bE,bK,bz,by,bx){var bJ,bw,bF,bB,bH,bM,bO,bC,bI,bL,bN;bI=(bK*by-bz)/(1-by);bJ=bx*by/(1-by);bF=bD-bG;bM=bA-bE;bw=bJ*bJ;bL=bI*bI;bB=bF*bF;bO=bM*bM;bH=(2*bJ*bF*bI+V(4*bw*bB*bL+4*bB*(bw+bB+bO)*(1-bL)))/(2*(bw+bB+bO));bC=(bJ*bM*bI)/(bw+bB+bO)+(bM*V(4*bw*bL+4*(bw+bB+bO)*(1-bL)))/(2*(bw+bB+bO));bN=V(1-bH*bH-bC*bC);return[bH,bC,bN]};aF=function(by,bx){var bz,bw;bw=az(by,bx);bz=a4(D(by,bx));return aW(-1*bz,bw[0],bw[1],bw[2])};ba=function(bz){var by,bx,bw,bB,bA;by=[];bB=bz.slice(-1)[0];for(bx=0,bw=bz.length;bxbI;0<=bI?bH++:bH--){bC.push(bH)}return bC}).apply(this)).sort(by).map(function(bH){return bH[2]});bw.face=(function(){var bH,bJ,bI;bI=[];for(bJ=0,bH=bD.length;bJby;bC=0<=by?++bA:--bA){bG=bz[bC];bE=ba(this.face[bC]);for(bx=0,bD=bE.length;bx\n\n\n\n\n\n\n\n\nbB;bF=0<=bB?++bD:--bD){bx.xyz.push([-I(bF*by),-a1(bF*by),-bH])}for(bF=bz=0,bK=bA;0<=bK?bzbK;bF=0<=bK?++bz:--bz){bx.xyz.push([-I(bF*by),-a1(bF*by),bH])}bx.face.push((function(){bE=[];for(var bN=bJ=bA-1;bJ<=0?bN<=0:bN>=0;bJ<=0?bN++:bN--){bE.push(bN)}return bE}).apply(this));bx.face.push((function(){bC=[];for(var bO=bA,bN=2*bA;bA<=bN?bObN;bA<=bN?bO++:bO--){bC.push(bO)}return bC}).apply(this));for(bF=bw=0,bG=bA;0<=bG?bwbG;bF=0<=bG?++bw:--bw){bx.face.push([bF,(bF+1)%bA,(bF+1)%bA+bA,bF+bA])}bx=y(bx,1);return bx};aZ=function(bJ){var bO,bN,bM,bL,bK,bH,by,bG,bx,bF,bE,bC,bB,bI,bw,bz,bD,bA;bz=2*aL/bJ;bM=V(1-4/(4+2*I(bz/2)-2*I(bz)));bG=V(1-bM*bM);bN=V(bM*bM+bb(bG*I(bz/2),2));bG=-bG/bN;bM=-bM/bN;by=new aR();by.name="A"+bJ;for(bL=bK=0,bx=bJ;0<=bx?bKbx;bL=0<=bx?++bK:--bK){by.xyz.push([bG*I(bL*bz),bG*a1(bL*bz),bM])}for(bL=bH=0,bF=bJ;0<=bF?bHbF;bL=0<=bF?++bH:--bH){by.xyz.push([bG*I((bL+0.5)*bz),bG*a1((bL+0.5)*bz),-bM])}by.face.push((function(){bI=[];for(var bP=bE=bJ-1;bE<=0?bP<=0:bP>=0;bE<=0?bP++:bP--){bI.push(bP)}return bI}).apply(this));by.face.push((function(){bw=[];for(var bQ=bJ,bP=2*bJ-1;bJ<=bP?bQ<=bP:bQ>=bP;bJ<=bP?bQ++:bQ--){bw.push(bQ)}return bw}).apply(this));for(bL=bO=0,bB=bJ-1;0<=bB?bO<=bB:bO>=bB;bL=0<=bB?++bO:--bO){by.face.push([bL,(bL+1)%bJ,bL+bJ]);by.face.push([bL,bL+bJ,(bJ+bL-1)%bJ+bJ])}by=y(by,1);return by};bs=function(bz){var bH,bD,bB,by,bw,bA,bF,bE,bC,bx,bG;bx=2*aL/bz;bH=1;bw=new aR();bw.name="Y"+bz;for(bD=bB=0,bA=bz;0<=bA?bBbA;bD=0<=bA?++bB:--bB){bw.xyz.push([-I(bD*bx),-a1(bD*bx),-0.2])}bw.xyz.push([0,0,bH]);bw.face.push((function(){bC=[];for(var bI=bF=bz-1;bF<=0?bI<=0:bI>=0;bF<=0?bI++:bI--){bC.push(bI)}return bC}).apply(this));for(bD=bG=0,bE=bz;0<=bE?bGbE;bD=0<=bE?++bG:--bG){bw.face.push([bD,(bD+1)%bz,bz])}bw=g(bw,3);return bw};ai=(function(){function bw(){this.flags=new Object();this.verts=new Object();this.xyzs=new Object()}bw.prototype.newV=function(by,bx){if(this.verts[by]===void 0){this.verts[by]=0;return this.xyzs[by]=bx}};bw.prototype.newFlag=function(bx,bz,by){if(this.flags[bx]===void 0){this.flags[bx]={}}return this.flags[bx][bz]=by};bw.prototype.topoly=function(){var by,bC,bG,bB,bA,bx,bz,bD,bF,bE;bx=new aR();by=0;bz=this.verts;for(bB in bz){bF=bz[bB];bx.xyz[by]=this.xyzs[bB];this.verts[bB]=by;by++}by=0;bD=this.flags;for(bB in bD){bC=bD[bB];bx.face[by]=[];for(bA in bC){bF=bC[bA];bE=bF;break}bF=bE;bx.face[by].push(this.verts[bF]);bF=this.flags[bB][bF];bG=0;while(bF!==bE){bx.face[by].push(this.verts[bF]);bF=this.flags[bB][bF];bG++;if(bG>1000){console.log("Bad flag spec, have a neverending face:",bB,this.flags[bB]);break}}by++}bx.name="unknown polyhedron";return bx};return bw})();ad=function(bC,bM,bA){var bz,bS,bR,bO,bT,by,bP,bN,bQ,bE,bD,bF,bJ,bL,bK,bB,bI,bH,bG,bx,bw;bM||(bM=0);bA||(bA=0.1);console.log("Taking kis of "+(bM===0?"":bM)+"-sided faces of "+bC.name+"...");bO=new ai();bB=bC.xyz;for(bP=bN=0,bQ=bB.length;bN=bz;by=0<=bz?++bw:--bw){bA.xyz[by]=d(-1,bA.xyz[by])}for(by=bB=0,bx=bA.face.length-1;0<=bx?bB<=bx:bB>=bx;by=0<=bx?++bB:--bB){bA.face[by]=bA.face[by].reverse()}bA.name="r"+bA.name;return bA};aK=function(bz){var bW,bV,bU,bT,bX,bS,bE,bP,bQ,bO,bN,bR,bD,bC,bB,bA,bM,by,bK,bJ,bH,bG,bL,bI,bx,bw,bF;console.log("Taking dual of "+bz.name+"...");bP=new ai();bE=[];for(bQ=bN=0,by=bz.xyz.length-1;0<=by?bN<=by:bN>=by;bQ=0<=by?++bN:--bN){bE[bQ]={}}bK=bz.face;for(bQ=bM=0,bR=bK.length;bM=bJ;bQ=0<=bJ?++bF:--bF){bP.newV(""+bQ,bT[bQ])}bH=bz.face;for(bQ=bW=0,bC=bH.length;bW=by;bD=0<=by?++bB:--bB){bG=a7(bw);bw=aa(bw,bC);bw=bc(bw,bC);bw=bf(bw,bz);bE=_.max(_.map(_.zip(bw,bG),function(bI){var bH,bJ;bH=bI[0],bJ=bI[1];return K(bg(bH,bJ))}));if(bE<1e-8){break}}console.log("[canonicalization done, last |deltaV|="+bE+"]");bA=new aR(bw,bx.face,bx.name);console.log("canonicalize",bA);return bA};O=function(bz){var bA,by,bx,bw;by=bz.centers();for(bx=0,bw=by.length;bxbz;bA=0<=bz?++bw:--bw){bx.xyz=H(bB);bB.xyz=H(bx)}return new aR(bB.xyz,bB.face,bB.name)};y=function(bB,by){var bA,bx,bw,bz;by||(by=1);bx=aK(bB);console.log("Planarizing "+bB.name+"...");for(bA=bw=0,bz=by;0<=bz?bwbz;bA=0<=bz?++bw:--bw){bx.xyz=O(bB);bB.xyz=O(bx)}return new aR(bB.xyz,bB.face,bB.name)};J=function(bY){var bX,bT,bM,bR,bW,bF,bZ,bP,bK,bH,bV,bA,bS,bL,bC,bD,bQ,bG,bO,bU,bE,bN,bB,bz,by,bx,bw,bJ,bI;bG=999;bS=[];bL=[];bC=bY.length;bV=function(b0,b1){return(b0||b1)&&!(b0&&b1)};bX=function(b2,b1,b0){return(b1[0]-b2[0])*(b0[1]-b2[1])-(b0[0]-b2[0])*(b1[1]-b2[1])};bK=function(b2,b1,b0){return bX(b2,b1,b0)>0};bH=function(b2,b1,b0){return bX(b2,b1,b0)>=0};bM=function(b2,b1,b0){return bX(b2,b1,b0)===0};bT=function(b2,b1,b0){if(bM(b2,b1,b0)){return false}if(b2[0]!==b1[0]){return(b2[0]<=b0[0])&&(b0[0]<=b1[0])||(b2[0]>=b0[0])&&(b0[0]>=b1[0])}else{return(b2[1]<=b0[1])&&(b0[1]<=b1[1])||(b2[1]>=b0[1])&&(b0[1]>=b1[1])}};bP=function(b3,b2,b1,b0){if(bM(b3,b2,b1)||bM(b3,b2,b0)||bM(b1,b0,b3)||bM(b1,b0,b2)){return false}return bV(bK(b3,b2,b1),bK(b3,b2,b0))&&bV(bK(b1,b0,b3),bK(b1,b0,b2))};bZ=function(b3,b2,b1,b0){if(bP(b3,b2,b1,b0)){return true}else{if(bT(b3,b2,b1)||bT(b3,b2,b0)||bT(b1,b0,b3)||bT(b1,b0,b2)){return true}else{return false}}};bF=function(b2,b0){var b3,b1;b1=(b2+1+bC)%bC;b3=(b2-1+bC)%bC;if(bH(bY[b2],bY[b1],bY[b3])){return bK(bY[b2],bY[b0],bY[b3])&&bK(bY[b0],bY[b2],bY[b1])}return !(bH(bY[b2],bY[b0],bY[b1])&&bH(bY[b0],bY[b2],bY[b3]))};bW=function(b1,b0){var b3,b2;b3=0;while(true){b2=(b3+1+bC)%bC;if((b3!==b1)&&(b2!==b1)&&(b3!==b0)&&(b2!==b0)&&bP(bY[b1],bY[b0],bY[b3],bY[b2])){return false}b3=(b3+1+bC)%bC;if(b3===0){break}}return true};bR=function(b1,b0){return bF(b1,b0)&&bF(b0,b1)&&bW(b1,b0)};bz=0;while(true){by=(bz+1+bC)%bC;bB=(bz-1+bC)%bC;bL[bz]=bR(bB,by);bz=(bz+1+bC)%bC;if(bz===0){break}}bU=(function(){bN=[];for(var b0=0,b1=bC-1;0<=b1?b0<=b1:b0>=b1;0<=b1?b0++:b0--){bN.push(b0)}return bN}).apply(this);bO=bC;bI=bG;bD=0;while(bI>0&&bO>3){bI-=1;by=bD;bJ=bG;while(true){bJ-=1;bA=false;if(bL[by]){bx=(by+1+bC)%bC;bw=(bx+1+bC)%bC;bz=(by-1+bC)%bC;bB=(bz-1+bC)%bC;bS.push([bU[bz],bU[bx]]);bL[bz]=bR(bB,bx);bL[bx]=bR(bz,bw);bY=bY.slice(0,+by+1||9000000000).concat(bY.slice(bx));bU=bU.slice(0,+by+1||9000000000).concat(bU.slice(bx));if(bB>by){bB-=1}if(bz>by){bz-=1}if(bx>by){bx-=1}if(bw>by){bw-=1}bC--;bD=bx;bO--;bA=true}by=(by+1+bC)%bC;if(!(bJ>0&&!bA&&by!==bD)){break}}}return bS};a=function(bx,bw){if(((bx[0]===bw[0])&&(bx[1]===bw[1])&&(bx[2]===bw[2]))||(bx[0]===bw[1])&&(bx[1]===bw[2])&&(bx[2]===bw[0])||(bx[0]===bw[2])&&(bx[1]===bw[0])&&(bx[2]===bw[1])){return true}else{return false}};u=function(b3,bV){var bQ,bO,bM,bK,bI,bS,b4,bU,bT,bP,bW,b2,b1,bR,bE,bD,bC,bB,bA,bz,by,bx,b0,bw,bZ,bN,bL,bJ,bH,bG,bF,b5,bY,b8,b7,b6,bX;bP=[];bw=[];bZ=(function(){var cb,ca,b9;b9=[];for(b2=cb=0,ca=b3.length-1;0<=ca?cb<=ca:cb>=ca;b2=0<=ca?++cb:--cb){b9.push([b2,(b2+1)%b3.length])}return b9})();for(b1=0,bR=bZ.length;b13){bA=Z((function(){var bM,bO,bN;bN=[];for(bO=0,bM=bI.length;bO"}bD+="\n"}return console.log(bD)};C=function(){var bz,bw,bA,bC,bD,bB,by,bx;bx=["T","O","C","I","D","P3","P4","A4","A5","Y3","Y4"];bB=["k","a","g","p","d","n","x","*"];console.log("===== Test Basic Ops =====");for(bz=0,bw=bB.length;bz=1){bx=a9(bh(bD,bB))}}bx=a9(aA(bz,bC))/by;return bx};aZ=function(bB,bA,bz){var by,bx;by=bh(bA,bB);bx=bh(bz,bA);return aA(by,bx)};G=function(bE,bD,bC){var bI,bH,bG,bB,bA,bz,bF,by,bx;for(bB=0,bF=bE.length;bBbA;by=0<=bA?++bB:--bB){bx[by]=bz[by].slice(0)}return bx};s=function(by,bx){return[by[0][0]*bx[0]+by[0][1]*bx[1]+by[0][2]*bx[2],by[1][0]*bx[0]+by[1][1]*bx[1]+by[1][2]*bx[2],by[2][0]*bx[0]+by[2][1]*bx[1]+by[2][2]*bx[2]]};aI=function(bx,by){return[[bx[0][0]*by[0][0]+bx[0][1]*by[1][0]+bx[0][2]*by[2][0],bx[0][0]*by[0][1]+bx[0][1]*by[1][1]+bx[0][2]*by[2][1],bx[0][0]*by[0][2]+bx[0][1]*by[1][2]+bx[0][2]*by[2][2]],[bx[1][0]*by[0][0]+bx[1][1]*by[1][0]+bx[1][2]*by[2][0],bx[1][0]*by[0][1]+bx[1][1]*by[1][1]+bx[1][2]*by[2][1],bx[1][0]*by[0][2]+bx[1][1]*by[1][2]+bx[1][2]*by[2][2]],[bx[2][0]*by[0][0]+bx[2][1]*by[1][0]+bx[2][2]*by[2][0],bx[2][0]*by[0][1]+bx[2][1]*by[1][1]+bx[2][2]*by[2][1],bx[2][0]*by[0][2]+bx[2][1]*by[1][2]+bx[2][2]*by[2][2]]]};w=[[1,0,0],[0,1,0],[0,0,1]];j=function(bB,bz,bA){var bC,by,bx;bC=[[J(bB),-1*a2(bB),0],[a2(bB),J(bB),0],[0,0,1]];bx=[[J(bz),0,-1*a2(bz)],[0,1,0],[a2(bz),0,J(bz)]];by=[[1,0,0],[0,J(bA),-1*a2(bA)],[0,a2(bA),J(bA)]];return aI(by,aI(bx,bC))};aX=function(bA,bK,bI,bF){var bE,by,bz,bJ,bH,bx,bG,bC,bD,bB;bA/=2;bJ=a2(bA);bE=J(bA);bH=bJ*bJ;by=L([bK,bI,bF]);if(by===0){bD=[0,0,1],bK=bD[0],bI=bD[1],bF=bD[2]}if(by!==1){bB=bp([bK,bI,bF]),bK=bB[0],bI=bB[1],bF=bB[2]}if(bK===1&&bI===0&&bF===0){bz=[[1,0,0],[0,1-2*bH,2*bJ*bE],[0,-2*bJ*bE,1-2*bH]]}else{if(bK===0&&bI===1&&bF===0){bz=[[1-2*bH,0,-2*bJ*bE],[0,1,0],[2*bJ*bE,0,1-2*bH]]}else{if(bK===0&&bI===0&&bF===1){bz=[[1-2*bH,2*bJ*bE,0],[-2*bJ*bE,1-2*bH,0],[0,0,1]]}else{bx=bK*bK;bG=bI*bI;bC=bF*bF;bz=[[1-2*(bG+bC)*bH,2*(bK*bI*bH+bF*bJ*bE),2*(bK*bF*bH-bI*bJ*bE)],[2*(bI*bK*bH-bF*bJ*bE),1-2*(bC+bx)*bH,2*(bI*bF*bH+bK*bJ*bE)],[2*(bF*bK*bH+bI*bJ*bE),2*(bF*bI*bH-bK*bJ*bE),1-2*(bx+bG)*bH]]}}}return bz};y=function(bz,by,bA,bD,bx){var bB,bC;bC=(by*bD-bA)/(1-bD);bB=bx*bD/(1-bD);return[bB*bz[0]/(bz[2]+bC),bB*bz[1]/(bz[2]+bC)]};aO=function(bE,bB,bH,bF,bL,bA,bz,by){var bK,bx,bG,bC,bI,bN,bP,bD,bJ,bM,bO;bJ=(bL*bz-bA)/(1-bz);bK=by*bz/(1-bz);bG=bE-bH;bN=bB-bF;bx=bK*bK;bM=bJ*bJ;bC=bG*bG;bP=bN*bN;bI=(2*bK*bG*bJ+W(4*bx*bC*bM+4*bC*(bx+bC+bP)*(1-bM)))/(2*(bx+bC+bP));bD=(bK*bN*bJ)/(bx+bC+bP)+(bN*W(4*bx*bM+4*(bx+bC+bP)*(1-bM)))/(2*(bx+bC+bP));bO=W(1-bI*bI-bD*bD);return[bI,bD,bO]};aG=function(bz,by){var bA,bx;bx=aA(bz,by);bA=a5(E(bz,by));return aX(-1*bA,bx[0],bx[1],bx[2])};bb=function(bA){var by,bC,bB,bz,bx;by=[];bC=bA.slice(-1)[0];for(bz=0,bx=bA.length;bzbI;0<=bI?bJ++:bJ--){bA.push(bJ)}return bA}).apply(this)).sort(bz).map(function(bI){return bI[2]});bx.face=(function(){var bK,bI,bJ;bJ=[];for(bK=0,bI=bE.length;bKbG;bD=0<=bG?++bA:--bA){bF=by[bD];bB=bb(this.face[bD]);for(bz=0,bH=bB.length;bz\n\n\n\n\n\n\n\n\nbA;bJ=0<=bA?++bH:--bH){bx.xyz.push([-J(bJ*by),-a2(bJ*by),-bK])}for(bJ=bG=0;0<=bA?bGbA;bJ=0<=bA?++bG:--bG){bx.xyz.push([-J(bJ*by),-a2(bJ*by),bK])}bx.face.push((function(){bE=[];for(var bL=bI=bA-1;bI<=0?bL<=0:bL>=0;bI<=0?bL++:bL--){bE.push(bL)}return bE}).apply(this));bx.face.push((function(){bD=[];for(var bM=bA,bL=2*bA;bA<=bL?bMbL;bA<=bL?bM++:bM--){bD.push(bM)}return bD}).apply(this));for(bJ=bz=0;0<=bA?bzbA;bJ=0<=bA?++bz:--bz){bx.face.push([bJ,(bJ+1)%bA,(bJ+1)%bA+bA,bJ+bA])}bx=z(bx,1);return bx};a0=function(bB){var bN,bM,bL,by,bx,bz,bJ,bI,bE,bC,bA,bK,bH,bD,bG,bF;bz=2*aM/bB;bM=W(1-4/(4+2*J(bz/2)-2*J(bz)));bx=W(1-bM*bM);bN=W(bM*bM+bc(bx*J(bz/2),2));bx=-bx/bN;bM=-bM/bN;by=new aS();by.name="A"+bB;for(bL=bJ=0;0<=bB?bJbB;bL=0<=bB?++bJ:--bJ){by.xyz.push([bx*J(bL*bz),bx*a2(bL*bz),bM])}for(bL=bI=0;0<=bB?bIbB;bL=0<=bB?++bI:--bI){by.xyz.push([bx*J((bL+0.5)*bz),bx*a2((bL+0.5)*bz),-bM])}by.face.push((function(){bG=[];for(var bO=bK=bB-1;bK<=0?bO<=0:bO>=0;bK<=0?bO++:bO--){bG.push(bO)}return bG}).apply(this));by.face.push((function(){bF=[];for(var bP=bB,bO=2*bB-1;bB<=bO?bP<=bO:bP>=bO;bB<=bO?bP++:bP--){bF.push(bP)}return bF}).apply(this));for(bL=bA=0,bD=bB-1;0<=bD?bA<=bD:bA>=bD;bL=0<=bD?++bA:--bA){by.face.push([bL,(bL+1)%bB,bL+bB]);by.face.push([bL,bL+bB,(bB+bL-1)%bB+bB])}by=z(by,1);return by};bt=function(bz){var bG,bF,bx,by,bD,bC,bA,bE,bB;by=2*aM/bz;bG=1;bx=new aS();bx.name="Y"+bz;for(bF=bD=0;0<=bz?bDbz;bF=0<=bz?++bD:--bD){bx.xyz.push([-J(bF*by),-a2(bF*by),-0.2])}bx.xyz.push([0,0,bG]);bx.face.push((function(){bB=[];for(var bH=bE=bz-1;bE<=0?bH<=0:bH>=0;bE<=0?bH++:bH--){bB.push(bH)}return bB}).apply(this));for(bF=bA=0;0<=bz?bAbz;bF=0<=bz?++bA:--bA){bx.face.push([bF,(bF+1)%bz,bz])}bx=g(bx,3);return bx};aj=(function(){function bx(){this.flags=new Object();this.verts=new Object();this.xyzs=new Object()}bx.prototype.newV=function(bz,by){if(this.verts[bz]===void 0){this.verts[bz]=0;return this.xyzs[bz]=by}};bx.prototype.newFlag=function(by,bA,bz){if(this.flags[by]===void 0){this.flags[by]={}}return this.flags[by][bA]=bz};bx.prototype.topoly=function(){var bz,bE,bH,bD,bB,by,bF,bG,bC,bA;by=new aS();bz=0;bC=this.verts;for(bD in bC){bF=bC[bD];by.xyz[bz]=this.xyzs[bD];this.verts[bD]=bz;bz++}bz=0;bA=this.flags;for(bD in bA){bE=bA[bD];by.face[bz]=[];for(bB in bE){bF=bE[bB];bG=bF;break}bF=bG;by.face[bz].push(this.verts[bF]);bF=this.flags[bD][bF];bH=0;while(bF!==bG){by.face[bz].push(this.verts[bF]);bF=this.flags[bD][bF];bH++;if(bH>1000){console.log("Bad flag spec, have a neverending face:",bD,this.flags[bD]);break}}bz++}by.name="unknown polyhedron";return by};return bx})();ae=function(bG,bM,bF){var bE,bQ,bP,bN,bS,bD,bO,bI,bK,bL,bJ,bB,bz,bA,by,bx,bR,bU,bT,bH,bC;bM||(bM=0);bF||(bF=0.1);console.log("Taking kis of "+(bM===0?"":bM)+"-sided faces of "+bG.name+"...");bN=new aj();bH=bG.xyz;for(bO=bA=0,bR=bH.length;bA=bA;by=0<=bA?++bB:--bB){bC.xyz[by]=d(-1,bC.xyz[by])}for(by=bz=0,bx=bC.face.length-1;0<=bx?bz<=bx:bz>=bx;by=0<=bx?++bz:--bz){bC.face[by]=bC.face[by].reverse()}bC.name="r"+bC.name;return bC};aL=function(bI){var bQ,bW,bP,bJ,bN,bO,bM,bL,bG,bD,bE,bB,bz,by,bT,bX,bU,bS,bR,bx,bY,bV,bK,bH,bF,bC,bA;console.log("Taking dual of "+bI.name+"...");bN=new aj();bJ=[];for(bO=bE=0,bK=bI.xyz.length-1;0<=bK?bE<=bK:bE>=bK;bO=0<=bK?++bE:--bE){bJ[bO]={}}bH=bI.face;for(bO=bB=0,bT=bH.length;bB=bF;bO=0<=bF?++by:--by){bN.newV(""+bO,bQ[bO])}bC=bI.face;for(bO=bx=0,bU=bC.length;bx=bF;bD=0<=bF?++bB:--bB){bG=a8(bx);bx=ab(bx,bC);bx=bd(bx,bC);bx=bg(bx,bz);bE=_.max(_.map(_.zip(bx,bG),function(bI){var bH,bJ;bH=bI[0],bJ=bI[1];return L(bh(bH,bJ))}));if(bE<1e-8){break}}console.log("[canonicalization done, last |deltaV|="+bE+"]");bA=new aS(bx,by.face,by.name);console.log("canonicalize",bA);return bA};P=function(bA){var bB,by,bz,bx;by=bA.centers();for(bz=0,bx=by.length;bzby;bz=0<=by?++bA:--bA){bx.xyz=I(bB);bB.xyz=I(bx)}return new aS(bB.xyz,bB.face,bB.name)};z=function(bB,by){var bz,bx,bA;by||(by=1);bx=aL(bB);console.log("Planarizing "+bB.name+"...");for(bz=bA=0;0<=by?bAby;bz=0<=by?++bA:--bA){bx.xyz=P(bB);bB.xyz=P(bx)}return new aS(bB.xyz,bB.face,bB.name)};K=function(bZ){var bY,bU,bP,bS,bX,bH,b0,bR,bN,bJ,bW,bD,bT,bO,bF,bG,bI,bQ,bV,bE,bC,bB,by,bx,bM,bK,bA,bL,bz;bI=999;bT=[];bO=[];bF=bZ.length;bW=function(b1,b2){return(b1||b2)&&!(b1&&b2)};bY=function(b3,b2,b1){return(b2[0]-b3[0])*(b1[1]-b3[1])-(b1[0]-b3[0])*(b2[1]-b3[1])};bN=function(b3,b2,b1){return bY(b3,b2,b1)>0};bJ=function(b3,b2,b1){return bY(b3,b2,b1)>=0};bP=function(b3,b2,b1){return bY(b3,b2,b1)===0};bU=function(b3,b2,b1){if(bP(b3,b2,b1)){return false}if(b3[0]!==b2[0]){return(b3[0]<=b1[0])&&(b1[0]<=b2[0])||(b3[0]>=b1[0])&&(b1[0]>=b2[0])}else{return(b3[1]<=b1[1])&&(b1[1]<=b2[1])||(b3[1]>=b1[1])&&(b1[1]>=b2[1])}};bR=function(b4,b3,b2,b1){if(bP(b4,b3,b2)||bP(b4,b3,b1)||bP(b2,b1,b4)||bP(b2,b1,b3)){return false}return bW(bN(b4,b3,b2),bN(b4,b3,b1))&&bW(bN(b2,b1,b4),bN(b2,b1,b3))};b0=function(b4,b3,b2,b1){if(bR(b4,b3,b2,b1)){return true}else{if(bU(b4,b3,b2)||bU(b4,b3,b1)||bU(b2,b1,b4)||bU(b2,b1,b3)){return true}else{return false}}};bH=function(b3,b1){var b4,b2;b2=(b3+1+bF)%bF;b4=(b3-1+bF)%bF;if(bJ(bZ[b3],bZ[b2],bZ[b4])){return bN(bZ[b3],bZ[b1],bZ[b4])&&bN(bZ[b1],bZ[b3],bZ[b2])}return !(bJ(bZ[b3],bZ[b1],bZ[b2])&&bJ(bZ[b1],bZ[b3],bZ[b4]))};bX=function(b2,b1){var b4,b3;b4=0;while(true){b3=(b4+1+bF)%bF;if((b4!==b2)&&(b3!==b2)&&(b4!==b1)&&(b3!==b1)&&bR(bZ[b2],bZ[b1],bZ[b4],bZ[b3])){return false}b4=(b4+1+bF)%bF;if(b4===0){break}}return true};bS=function(b2,b1){return bH(b2,b1)&&bH(b1,b2)&&bX(b2,b1)};bC=0;while(true){bB=(bC+1+bF)%bF;bE=(bC-1+bF)%bF;bO[bC]=bS(bE,bB);bC=(bC+1+bF)%bF;if(bC===0){break}}bV=(function(){bz=[];for(var b2=0,b1=bF-1;0<=b1?b2<=b1:b2>=b1;0<=b1?b2++:b2--){bz.push(b2)}return bz}).apply(this);bQ=bF;bK=bI;bG=0;while(bK>0&&bQ>3){bK-=1;bB=bG;bM=bI;while(true){bM-=1;bD=false;if(bO[bB]){by=(bB+1+bF)%bF;bx=(by+1+bF)%bF;bC=(bB-1+bF)%bF;bE=(bC-1+bF)%bF;bT.push([bV[bC],bV[by]]);bO[bC]=bS(bE,by);bO[by]=bS(bC,bx);bZ=bZ.slice(0,+bB+1||9000000000).concat(bZ.slice(by));bV=bV.slice(0,+bB+1||9000000000).concat(bV.slice(by));if(bE>bB){bE-=1}if(bC>bB){bC-=1}if(by>bB){by-=1}if(bx>bB){bx-=1}bF--;bG=by;bQ--;bD=true}bB=(bB+1+bF)%bF;if(!(bM>0&&!bD&&bB!==bG)){break}}}return bT};a=function(by,bx){if(((by[0]===bx[0])&&(by[1]===bx[1])&&(by[2]===bx[2]))||(by[0]===bx[1])&&(by[1]===bx[2])&&(by[2]===bx[0])||(by[0]===bx[2])&&(by[1]===bx[0])&&(by[2]===bx[1])){return true}else{return false}};v=function(b4,bR){var bO,b5,bQ,bP,bM,bS,b2,bx,bH,b6,b9,b8,b7,b3,b1,b0,bZ,bN,bF,bE,bD,bC,bB,bA,bz,by,bY,bX,bW,bV,bU,bT,bL,bK,bJ,bI,bG;bM=[];bx=[];bT=(function(){var cb,cc,ca;ca=[];for(b2=cb=0,cc=b4.length-1;0<=cc?cb<=cc:cb>=cc;b2=0<=cc?++cb:--cb){ca.push([b2,(b2+1)%b4.length])}return ca})();for(b3=0,bN=bT.length;b33){bB=aa((function(){var bP,bO,bN;bN=[];for(bP=0,bO=bI.length;bP"}bD+="\n"}return console.log(bD)};D=function(){var bE,bB,bA,bz,bD,bC,by,bx;bz=["T","O","C","I","D","P3","P4","A4","A5","Y3","Y4"];bB=["k","a","g","p","d","n","x","*"];console.log("===== Test Basic Ops =====");for(bD=0,by=bB.length;bD #newpoly.xyz = canonicalXYZ(newpoly, 3) # this tends to make results look like shit newpoly - # ExtrudeN # ------------------------------------------------------------------------------------------ extrudeN = (poly, n)-> @@ -467,6 +466,72 @@ extrudeN = (poly, n)-> #newpoly.xyz = canonicalXYZ(newpoly, 3) # this tends to make results look like shit newpoly +# hollow / skeletonize +# ------------------------------------------------------------------------------------------ +hollow = (poly, n, inset_dist, thickness)-> + n or= 0 + inset_dist or= 0.5 + thickness or= 0.2 + + console.log "Skeletonizing #{if n==0 then "" else n}-sided faces of #{poly.name}..." + + dualnormals = dual(poly).normals() + normals = poly.normals() + centers = poly.centers() + + flag = new polyflag() + for p,i in poly.xyz + # each old vertex is a new vertex + flag.newV "v#{i}", p + flag.newV "downv#{i}", add(p,mult(-1*thickness,dualnormals[i])) + + for f,i in poly.face #new inset vertex for every vert in face + #if f.length is n or n is 0 + for v in f + flag.newV "fin"+i+"v"+v, tween(poly.xyz[v],centers[i],inset_dist) + flag.newV "findown"+i+"v"+v, add(tween(poly.xyz[v],centers[i],inset_dist),mult(-1*thickness,normals[i])) + + #foundAny = false # alert if don't find any + for f,i in poly.face + v1 = "v"+f[f.length-1] + for v in f + v2 = "v"+v + #if f.length is n or n is 0 + foundAny = true + fname = i + v1 + flag.newFlag fname, v1, v2 + flag.newFlag fname, v2, "fin"+i+v2 + flag.newFlag fname, "fin"+i+v2, "fin"+i+v1 + flag.newFlag fname, "fin"+i+v1, v1 + + fname = "sides"+i + v1 + flag.newFlag fname, "fin"+i+v1, "fin"+i+v2 + flag.newFlag fname, "fin"+i+v2, "findown"+i+v2 + flag.newFlag fname, "findown"+i+v2, "findown"+i+v1 + flag.newFlag fname, "findown"+i+v1, "fin"+i+v1 + + fname = "bottom"+i + v1 + flag.newFlag fname, "down"+v2, "down"+v1 + flag.newFlag fname, "down"+v1, "findown"+i+v1 + flag.newFlag fname, "findown"+i+v1, "findown"+i+v2 + flag.newFlag fname, "findown"+i+v2, "down"+v2 + + #new inset, extruded face + #flag.newFlag "ex"+i, "fin"+i+v1, "fin"+i+v2 + #else + # flag.newFlag i, v1, v2 # same old flag, if non-n + v1=v2 # current becomes previous + + #if not foundAny + # console.log "No #{n}-fold components were found." + + newpoly = flag.topoly() + #newpoly.name = "h" + (if n is 0 then "" else n) + poly.name + newpoly.name = "h" + poly.name + #newpoly.xyz = adjustXYZ(newpoly, 3) + #newpoly.xyz = canonicalXYZ(newpoly, 3) # this tends to make results look like shit + newpoly + # StellaN # ------------------------------------------------------------------------------------------