This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ====== Tutorial on hyperbolic surfaces ====== A //hyperbolic surface with cusps// is a topological surface together with a hyperbolic structure of finite area. ''%%polymake%%'' can deal with hyperbolic surfaces in view of Penners coordinates of the decorated Teichmüller space (lambda lengths). These allow to pick a hyperbolic surface by choosing a triangulation of the surface along with one positive parameter for each edge. The [[https://arxiv.org/abs/1708.08714v1|secondary fan]] of a hyperbolic surface stratifies the space of weight vectors (horocyclic decorations) according to which Delaunay triangulations are induced by the Epstein-Penner convex hull construction. For each point on the surface, there is a [[https://arxiv.org/abs/1708.08714v1|secondary polyhedron]] whose normal fan is the secondary fan. This tutorial shows how to deal with secondary fans and secondary polyhedra of hyperbolic surfaces. ==== Construction of hyperbolic surfaces ==== To define a hyperbolic surface we need to specify (a) a triangulation and (b) Penner coordinates. (a) The triangulation is obtained by specifying the ''%%DCEL%%'' as an ''%%Matrix<Int>%%''. This constructs a doubly connected edge list as follows: Each row of the nput of ''%%DCEL%%'' reads { (//2i//).head , (//2i+1//).head , (//2i//).next , (//2i+1//).next }. In general, for each edge //i// of the triangulation there are two half edges //2i// and //2i+1//, one for each orientation. (b) The ''%%PENNER_COORDINATES%%'' assign a positive rational number to each edge of the triangulation, ordered in the same sense as prescribed by the ''%%DCEL%%''. ==== Example 1: hyperbolic sphere with three cusps ==== <code perl> > application 'fan'; > application 'topaz'; > $S3 = new Matrix<Int>([[1,0,2,5],[2,1,4,1],[0,2,0,3]]); > $s = new HyperbolicSurface(DCEL=>$S3,PENNER_COORDINATES=>[1,1,1]); </code> In this example the doubly connected edge list looks like this: <html><img src="/lib/exe/fetch.php?media=tutorials/release/4.11/hyperbolic_surface_tutorial/paper_skizzen_2_281_29.png" tooltip="paper_skizzen_2_281_29.png" class="center-block"></html> ==== The secondary fan ==== The secondary fan of the hyperbolic sphere from above can now be computed as follows. <code perl> > $f = $s->SECONDARY_FAN; > $f->properties; type: PolyhedralFan<Rational> MAXIMAL_CONES {0 1 2} {0 1 3} {1 2 4} {0 2 5} RAYS 0 1 1 1 0 1 1 1 0 0 0 1 1 0 0 0 1 0 > $f->VISUAL; </code> <HTML> <!-- polymake for knusper Thu Mar 3 00:31:34 2022 fan: --> <html> <head> <meta charset=utf-8> <title>fan:</title> <style> /* // COMMON_CODE_BLOCK_BEGIN */ html {overflow: scroll;} strong{font-size: 18px;} canvas { z-index: 8; } input[type='radio'] {margin-left:0;} input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;} .group{padding-bottom: 15px;} .settings * {z-index: 11; } .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;} .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;} .showSettingsButton{visibility: visible; z-index: 12; position: absolute } .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5} button{margin-left: 0; margin-top: 10px} img{cursor: pointer;} .suboption{padding-top: 15px;} #model9120382796 { width: 100%; height: 100%; } .threejs_container { width: 100%; height: 75vh;} .settings{max-height: 74vh} input[type=range] { -webkit-appearance: none; padding:0; width:90%; margin-left: auto; margin-right: auto; margin-top: 15px; margin-bottom: 15px; display: block; } input[type=range]:focus { outline: none; } input[type=range]::-webkit-slider-runnable-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-webkit-slider-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; -webkit-appearance: none; margin-top: -5px; } input[type=range]:focus::-webkit-slider-runnable-track { background: #E3E3E3; } input[type=range]::-moz-range-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-moz-range-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]::-ms-track { height: 4px; cursor: pointer; animate: 0.2s; background: transparent; border-color: transparent; color: transparent; } input[type=range]::-ms-fill-lower { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-fill-upper { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]:focus::-ms-fill-lower { background: #E3E3E3; } input[type=range]:focus::-ms-fill-upper { background: #E3E3E3; } /* // COMMON_CODE_BLOCK_END */ </style> </head> <body> <div class='threejs_container'> <div id='settings_0' class='settings'> <div class=group id='explode_0'> <strong>Explode</strong> <input id='explodeRange_0' type='range' min='0.00001' max=6 step=0.01 value=0.00001> <div class=indented><input id='explodeCheckbox_0' type='checkbox'>Automatic explosion</div> <div class=suboption>Exploding speed</div> <input id='explodingSpeedRange_0' type='range' min=0 max=0.5 step=0.001 value=0.05> </div> <div class=group id='transparency_0' class='transparency'> <strong>Transparency</strong> <input id='transparencyRange_0' type='range' min=0 max=1 step=0.01 value=0> <div class=indented><input id='depthWriteCheckbox_0' type='checkbox'>depthWrite</div> </div> <div class=group id='rotation_0'> <strong>Rotation</strong> <div class=indented> <div><input type='checkbox' id='changeRotationX_0'> x-axis</div> <div><input type='checkbox' id='changeRotationY_0'> y-axis</div> <div><input type='checkbox' id='changeRotationZ_0'> z-axis</div> <button id='resetButton_0'>Reset</button> </div> <div class=suboption>Rotation speed</div> <input id='rotationSpeedRange_0' type='range' min=0 max=5 step=0.01 value=2> </div> <div class=group id='display_0'> <strong>Display</strong> <div class=indented> <div id='shownObjectTypesList_0' class='shownObjectsList'></div> </div> <div class=suboption>Objects</div> <div class=indented> <div id='shownObjectsList_0' class='shownObjectsList'></div> </div> </div> <div class=group id='camera_0'> <strong>Camera</strong> <div class=indented> <form> <select id="cameraType_0"> <option value='perspective' selected> Perspective<br></option> <option value='orthographic' > Orthographic<br></option> </select> </form> </div> </div> <div class=group id='svg_0'> <strong>SVG</strong> <div class=indented> <form> <input type="radio" name='screenshotMode' value='download' id='download_0' checked> Download<br> <input type="radio" name='screenshotMode' value='tab' id='tab_0' > New tab<br> </form> <button id='takeScreenshot_0'>Screenshot</button> </div> </div> </div> <!-- end of settings --> <img id='hideSettingsButton_0' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px"> <img id='showSettingsButton_0' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px"> <div id="model9120382796"></div> </div> <script> requirejs.config({ paths: { three: '/kernelspecs/r118/polymake/three', TrackballControls: '/kernelspecs/r118/polymake/TrackballControls', OrbitControls: '/kernelspecs/r118/polymake/OrbitControls', Projector: '/kernelspecs/r118/polymake/Projector', SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer', WEBGL: '/kernelspecs/r118/polymake/WebGL', }, shim: { 'three': { exports: 'THREE'}, 'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' }, 'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' }, 'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' }, 'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' }, 'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' }, } }); require(['three'],function(THREE){ window.THREE = THREE; require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'], function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) { THREE.TrackballControls = TrackballControls; THREE.OrbitControls = OrbitControls; THREE.Projector = Projector; THREE.SVGRenderer = SVGRenderer; THREE.WEBGL = WEBGL; // COMMON_CODE_BLOCK_BEGIN const intervalLength = 25; // for automatic animations const explodableModel = true; const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false }; const foldables = []; var three = document.getElementById("model9120382796"); var scene = new THREE.Scene(); var renderer = new THREE.WebGLRenderer( { antialias: true } ); var svgRenderer = new THREE.SVGRenderer( { antialias: true } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setClearColor(0xFFFFFF, 1); svgRenderer.setClearColor(0xFFFFFF, 1); three.appendChild(renderer.domElement); var frustumSize = 4; var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()]; cameras.forEach(function(cam) { cam.position.set(0, 0, 5); cam.lookAt(0, 0, 0); cam.up.set(0, 1, 0); }); var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)]; var camera, control; controls[0].zoomSpeed = 0.2; controls[0].rotateSpeed = 4; // class to allow move points together with labels and spheres var PMPoint = function (x,y,z) { this.vector = new THREE.Vector3(x,y,z); this.sprite = null; this.sphere = null; } PMPoint.prototype.addLabel = function(labelsprite) { this.sprite = labelsprite; this.sprite.position.copy(this.vector); } PMPoint.prototype.addSphere = function(spheremesh) { this.sphere = spheremesh; this.sphere.position.copy(this.vector); } PMPoint.prototype.set = function(x,y,z) { this.vector.set(x,y,z); if (this.sprite) { this.sprite.position.copy(this.vector); } if (this.sphere) { this.sphere.position.copy(this.vector); } } PMPoint.prototype.radius = function() { if (this.sphere) { return this.sphere.geometry.parameters.radius; } else { return 0; } }; // select the target node var target = document.querySelector('#model9120382796'); // create an observer instance var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.removedNodes && mutation.removedNodes.length > 0) { cancelAnimationFrame(renderId); observer.disconnect(); console.log("cancelled frame "+renderId); } }); }); // configuration of the observer: var config = { childList: true, characterData: true } // pass in the target node, as well as the observer options while (target) { if (target.className=="output") { observer.observe(target, config); break; } target = target.parentNode; } // COMMON_CODE_BLOCK_END var obj0 = new THREE.Object3D(); obj0.name = "Rays"; obj0.userData.explodable = 0; obj0.userData.points = []; obj0.userData.points.push(new PMPoint(0, 0, 0)); obj0.userData.points.push(new PMPoint(0, 0.707107, 0.707107)); obj0.userData.points.push(new PMPoint(0.707107, 0, 0.707107)); obj0.userData.points.push(new PMPoint(0.707107, 0.707107, 0)); obj0.userData.points.push(new PMPoint(0, 0, 1)); obj0.userData.points.push(new PMPoint(1, 0, 0)); obj0.userData.points.push(new PMPoint(0, 1, 0)); obj0.userData.pointradii = 0.02; <!-- Vertex style --> obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj0.userData.pointlabels = [" ", "0", "1", "2", "3", "4", "5"]; obj0.userData.edgeindices = [1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0]; <!-- Edge style --> obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); init_object(obj0); scene.add(obj0); var obj1 = new THREE.Object3D(); obj1.name = "unnamed__1"; obj1.userData.explodable = 1; obj1.userData.points = []; obj1.userData.points.push(new PMPoint(0, 0.707107, 0.707107)); obj1.userData.points.push(new PMPoint(0.707107, 0, 0.707107)); obj1.userData.points.push(new PMPoint(0.707107, 0.707107, 0)); obj1.userData.points.push(new PMPoint(0, 0, 0)); obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj1.userData.facets = [[2, 3, 0], [1, 3, 2], [0, 3, 1], [2, 0, 1]]; <!-- Facet style --> obj1.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj1); scene.add(obj1); var obj2 = new THREE.Object3D(); obj2.name = "unnamed__2"; obj2.userData.explodable = 1; obj2.userData.points = []; obj2.userData.points.push(new PMPoint(0, 0.707107, 0.707107)); obj2.userData.points.push(new PMPoint(0.707107, 0, 0.707107)); obj2.userData.points.push(new PMPoint(0, 0, 1)); obj2.userData.points.push(new PMPoint(0, 0, 0)); obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj2.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]]; <!-- Facet style --> obj2.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj2); scene.add(obj2); var obj3 = new THREE.Object3D(); obj3.name = "unnamed__3"; obj3.userData.explodable = 1; obj3.userData.points = []; obj3.userData.points.push(new PMPoint(0.707107, 0, 0.707107)); obj3.userData.points.push(new PMPoint(0.707107, 0.707107, 0)); obj3.userData.points.push(new PMPoint(1, 0, 0)); obj3.userData.points.push(new PMPoint(0, 0, 0)); obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj3.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]]; <!-- Facet style --> obj3.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj3); scene.add(obj3); var obj4 = new THREE.Object3D(); obj4.name = "unnamed__4"; obj4.userData.explodable = 1; obj4.userData.points = []; obj4.userData.points.push(new PMPoint(0, 0.707107, 0.707107)); obj4.userData.points.push(new PMPoint(0.707107, 0.707107, 0)); obj4.userData.points.push(new PMPoint(0, 1, 0)); obj4.userData.points.push(new PMPoint(0, 0, 0)); obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj4.userData.facets = [[0, 3, 1], [2, 3, 0], [1, 3, 2], [0, 1, 2]]; <!-- Facet style --> obj4.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj4); scene.add(obj4); // COMMON_CODE_BLOCK_BEGIN function textSpriteMaterial(message, parameters) { if ( parameters === undefined ) parameters = {}; var fontface = "Helvetica"; var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15; fontsize = fontsize*10; var lines = message.split('\\n'); var size = 512; for(var i = 0; i<lines.length; i++){ var tmp = lines[i].length; while(tmp*fontsize > size){ fontsize--; } } var canvas = document.createElement('canvas'); canvas.width = size; canvas.height = size; var context = canvas.getContext('2d'); context.fillStyle = "rgba(255, 255, 255, 0)"; context.fill(); context.font = fontsize + "px " + fontface; // text color context.fillStyle = "rgba(0, 0, 0, 1.0)"; for(var i = 0; i<lines.length; i++){ context.fillText(lines[i], size/2, size/2+i*fontsize); } // canvas contents will be used for a texture var texture = new THREE.Texture(canvas); texture.needsUpdate = true; var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 }); return spriteMaterial; } // ---------------------- INITIALIZING OBJECTS-------------------------------------- // --------------------------------------------------------------------------------- function init_object(obj) { if (obj.userData.hasOwnProperty("pointmaterial")) { init_points(obj); modelContains.points = true; } if (obj.userData.hasOwnProperty("pointlabels")) { init_pointlabels(obj); modelContains.pointlabels = true; } if (obj.userData.hasOwnProperty("edgematerial")) { init_lines(obj); modelContains.lines = true; } if (obj.userData.hasOwnProperty("edgelabels")) { init_edgelabels(obj); modelContains.edgelabels = true; } if (obj.userData.hasOwnProperty("arrowstyle")) { init_arrowheads(obj); modelContains.arrowheads = true; } if (obj.userData.hasOwnProperty("facetmaterial")) { init_faces(obj); modelContains.faces = true; } } function init_points(obj) { var pointgroup = new THREE.Group(); pointgroup.name = "points"; var points = obj.userData.points; var radii = obj.userData.pointradii; var materials = obj.userData.pointmaterial; var geometry,material; if (!Array.isArray(radii)) { geometry = new THREE.SphereBufferGeometry(radii); } if (!Array.isArray(materials)) { material = materials; } for (var i=0; i<points.length; i++) { var point = points[i]; if (Array.isArray(radii)) { if (radii[i] == 0) { continue; } geometry = new THREE.SphereBufferGeometry(radii[i]); } if (Array.isArray(materials)) { material = materials[i]; } var sphere = new THREE.Mesh(geometry, material); point.addSphere(sphere); pointgroup.add(sphere); } obj.add(pointgroup); } function init_pointlabels(obj) { var points = obj.userData.points; var labels = obj.userData.pointlabels; var pointlabels = new THREE.Group(); pointlabels.name = "pointlabels"; if (Array.isArray(labels)) { for (var i=0; i<points.length; i++) { var point = points[i]; var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<points.length; i++) { var point = points[i]; var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } obj.add(pointlabels); } function init_lines(obj) { var edgeindices = obj.userData.edgeindices; var points = obj.userData.points; var materials = obj.userData.edgematerial; var geometry = new THREE.BufferGeometry(); var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 ); var geometry = new THREE.BufferGeometry(); geometry.setAttribute('position', bufattr); if (Array.isArray(materials)) { for (var i=0; i<materials.length; i++) { geometry.addGroup(2*i,2,i); } } var lines = new THREE.LineSegments(geometry, materials); lines.name = "lines"; obj.add(lines); updateEdgesPosition(obj); } function init_edgelabels(obj) { var points = obj.userData.points; var edgeindices = obj.userData.edgeindices; var labels = obj.userData.edgelabels; var edgelabels = new THREE.Group(); edgelabels.name = "edgelabels"; if (Array.isArray(labels)) { for (var i=0; i<edgeindices.length/2; i++) { var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<edgeindices.length/2; i++) { var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } obj.add(edgelabels); } function init_arrowheads(obj) { var arrowheads = new THREE.Group(); arrowheads.name = "arrowheads"; var arrowstyle = obj.userData.arrowstyle; var edgeindices = obj.userData.edgeindices; var edgematerials = obj.userData.edgematerial; var points = obj.userData.points; var material; if (!Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials.color} ); } for (var i=0; i<edgeindices.length; i=i+2) { var start = points[edgeindices[i]]; var end = points[edgeindices[i+1]]; var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius(); if (dist <= 0) { continue; } var dir = new THREE.Vector3().subVectors(end.vector,start.vector); dir.normalize(); var axis = new THREE.Vector3().set(dir.z,0,-dir.x); axis.normalize(); var radians = Math.acos( dir.y ); var radius = dist/25; var height = dist/5; var geometry = new THREE.ConeBufferGeometry(radius,height); var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2)); if (Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} ); } var cone = new THREE.Mesh( geometry, material ); cone.quaternion.setFromAxisAngle(axis,radians);; cone.position.copy(position);; arrowheads.add(cone); } obj.add(arrowheads); } function init_faces(obj) { var points = obj.userData.points; var facets = obj.userData.facets; obj.userData.triangleindices = []; for (var i=0; i<facets.length; i++) { facet = facets[i]; for (var t=0; t<facet.length-2; t++) { obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]); } } var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute(bufarr,3); var materials = obj.userData.facetmaterial; var geometry = new THREE.BufferGeometry(); var frontmaterials = []; var backmaterials = []; geometry.setAttribute('position',bufattr); if (Array.isArray(materials)) { var tricount = 0; var facet; for (var i=0; i<facets.length; i++) { facet = facets[i]; geometry.addGroup(tricount,(facet.length-2)*3,i); tricount += (facet.length-2)*3; } for (var j=0; j<materials.length; j++) { var fmat = materials[j].clone() fmat.side = THREE.FrontSide; frontmaterials.push(fmat); var bmat = materials[j].clone() bmat.side = THREE.BackSide; backmaterials.push(bmat); obj.userData.facetmaterial = frontmaterials.concat(backmaterials); } } else if (materials instanceof THREE.Material) { frontmaterials = materials.clone() frontmaterials.side = THREE.FrontSide; backmaterials = materials.clone() backmaterials.side = THREE.BackSide; obj.userData.facetmaterial = [frontmaterials, backmaterials]; } // duplicating the object with front and back should avoid transparency issues var backmesh = new THREE.Mesh(geometry, backmaterials); // meshname is used to show/hide objects backmesh.name = "backfaces"; obj.add(backmesh); var frontmesh = new THREE.Mesh(geometry, frontmaterials); frontmesh.name = "frontfaces"; obj.add(frontmesh); updateFacesPosition(obj); } // //INITIALIZING function updateFacesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.triangleindices; var faces = obj.getObjectByName("frontfaces"); var ba = faces.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } faces.geometry.attributes.position.needsUpdate = true; } function updateEdgesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.edgeindices; var lines = obj.getObjectByName("lines"); var ba = lines.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } lines.geometry.attributes.position.needsUpdate = true; } function onWindowResize() { renderer.setSize( three.clientWidth, three.clientHeight ); svgRenderer.setSize( three.clientWidth, three.clientHeight ); updateCamera(); } function updateCamera() { var width = three.clientWidth; var height = three.clientHeight; var aspect = width / height; if (camera.type == "OrthographicCamera") { camera.left = frustumSize * aspect / - 2; camera.right = frustumSize * aspect / 2; camera.top = frustumSize / 2; camera.bottom = - frustumSize / 2; } else if (camera.type == "PerspectiveCamera") { camera.aspect = aspect; } camera.updateProjectionMatrix(); } function changeCamera(event) { var selindex = event.currentTarget.selectedIndex; camera = cameras[selindex]; control = controls[selindex]; control.enabled = true; for (var i=0; i<controls.length; i++) { if (i!=selindex) { controls[i].enabled = false; } } updateCamera(); } var camtypenode = document.getElementById('cameraType_0'); camtypenode.onchange = changeCamera; camtypenode.dispatchEvent(new Event('change')); onWindowResize(); window.addEventListener('resize', onWindowResize); var xRotationEnabled = false; var yRotationEnabled = false; var zRotationEnabled = false; var rotationSpeedFactor = 1; var settingsShown = false; var labelsShown = true; var intervals = []; var timeouts = []; var explodingSpeed = 0.05; var explodeScale = 0.000001; var XMLS = new XMLSerializer(); var svgElement; var renderId; var render = function () { renderId = requestAnimationFrame(render); // comment in for automatic explosion // explode(updateFactor()); var phi = 0.02 * rotationSpeedFactor; if (xRotationEnabled) { scene.rotation.x += phi; } if (yRotationEnabled) { scene.rotation.y += phi; } if (zRotationEnabled) { scene.rotation.z += phi; } control.update(); renderer.render(scene, camera); }; if ( THREE.WEBGL.isWebGLAvailable() ) { render(); } else { var warning = WEBGL.getWebGLErrorMessage(); three.appendChild( warning ); } function changeTransparency() { var opacity = 1-Number(event.currentTarget.value); for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].opacity = opacity; } } else { child.userData.facetmaterial.opacity = opacity; } } } } function toggleDepthWrite(event) { depthwrite = event.currentTarget.checked; for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].depthWrite = depthwrite; } } else { child.userData.facetmaterial.depthWrite = depthWrite; } } } } function changeRotationX(event){ xRotationEnabled = event.currentTarget.checked; } function changeRotationY(event){ yRotationEnabled = event.currentTarget.checked; } function changeRotationZ(event){ zRotationEnabled = event.currentTarget.checked; } function changeRotationSpeedFactor(event){ rotationSpeedFactor = Number(event.currentTarget.value); } function resetScene(){ scene.rotation.set(0,0,0); camera.position.set(0,0,5); camera.up.set(0,1,0); } function showSettings(event){ document.getElementById('settings_0').style.visibility = 'visible'; document.getElementById('showSettingsButton_0').style.visibility = 'hidden'; document.getElementById('hideSettingsButton_0').style.visibility = 'visible'; settingsShown = true; } function hideSettings(event){ document.getElementById('settings_0').style.visibility = 'hidden'; document.getElementById('showSettingsButton_0').style.visibility = 'visible'; document.getElementById('hideSettingsButton_0').style.visibility = 'hidden'; settingsShown = false; } var pos = 150* Math.PI; function updateFactor() { pos++; return Math.sin(.01*pos)+1; } // ------------------------ FOLDING ------------------------------------------------ // --------------------------------------------------------------------------------- // rotate point p around axis defined by points p1 and p2 by given angle function rotate(p, p1, p2, angle ){ angle = -angle; var x = p.x, y = p.y, z = p.z, a = p1.x, b = p1.y, c = p1.z, u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z; var result = []; var L = u*u + v*v + w*w; var sqrt = Math.sqrt; var cos = Math.cos; var sin = Math.sin; result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L; result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L; result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L; return result; } var fold = function(event){ var obj = foldables[Number(event.currentTarget.name)]; var foldvalue = Number(event.currentTarget.value); var scale = foldvalue - obj.userData.oldscale; for (var j=0; j<obj.userData.axes.length; j++) { rotateVertices(obj, j, scale); } update(obj); obj.userData.oldscale += scale; lookAtBarycenter(obj); } function lookAtBarycenter(obj){ control.target = barycenter(obj); } function barycenter(obj) { var center = new THREE.Vector3(0,0,0); var points = obj.userData.points; for (var i=0; i<points.length; i++){ center.add(points[i].vector); } center.divideScalar(points.length); return center; } function rotateVertices(obj, edge, scale) { var axes = obj.userData.axes; var subtrees = obj.userData.subtrees; var points = obj.userData.points; var angles = obj.userData.angles; if (edge < axes.length){ for (var j=0; j<subtrees[edge].length; j++){ var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge])); points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]); } } } function update(obj) { updateFacesPosition(obj); updateEdgesPosition(obj); } if (foldables.length) { var settings = document.getElementById('settings_0'); var foldDiv = document.createElement('div'); foldDiv.id = 'fold_0'; var title = document.createElement('strong'); title.innerHTML = 'Fold'; foldDiv.appendChild(title); foldDiv.className = 'group'; for (var i=0; i<foldables.length; i++) { var range = document.createElement('input'); range.type = 'range'; range.min = 0; range.max = 1; range.value = 0; range.step = 0.001; range.name = String(i); range.oninput = fold; foldDiv.appendChild(range); } lookAtBarycenter(foldables[0]); settings.insertBefore(foldDiv,settings.childNodes[0]); } // ---------------------- EXPLOSION ------------------------------------------------ // --------------------------------------------------------------------------------- if (explodableModel) { for (var i=0; i<scene.children.length; i++) { obj = scene.children[i]; if ( obj.userData.explodable ) { computeCentroid(obj); } } document.getElementById('explodeRange_0').oninput = triggerExplode; document.getElementById('explodeCheckbox_0').onchange = triggerAutomaticExplode; document.getElementById('explodingSpeedRange_0').oninput = setExplodingSpeed; explode(0.000001); } function computeCentroid(obj) { centroid = new THREE.Vector3(); obj.userData.points.forEach(function(pmpoint) { centroid.add(pmpoint.vector); }); centroid.divideScalar(obj.userData.points.length); obj.userData.centroid = centroid; } function explode(factor) { for (var i=0; i<scene.children.length; i++) { var obj = scene.children[i]; if (obj.userData.hasOwnProperty("centroid")) { var c = obj.userData.centroid; obj.position.set(c.x*factor, c.y*factor, c.z*factor); } } } function triggerExplode(event){ explodeScale = Number(event.currentTarget.value); explode(explodeScale); } function setExplodingSpeed(event){ explodingSpeed = Number(event.currentTarget.value); } function triggerAutomaticExplode(event){ if (event.currentTarget.checked){ startExploding(); } else { clearIntervals(); } } function startExploding(){ intervals.push(setInterval(explodingInterval, 25)); } function explodingInterval(){ explodeScale += explodingSpeed; if (explodeScale <= 6){ explode(explodeScale); } else{ explode(6); explodeScale = 6; clearIntervals(); timeouts.push(setTimeout(startUnexploding, 3000)); } document.getElementById('explodeRange_0').value = explodeScale; } function startUnexploding(){ intervals.push(setInterval(unexplodingInterval, 25)); } function unexplodingInterval(){ explodeScale -= explodingSpeed; if (explodeScale >= 0){ explode(explodeScale); } else { explode(0); explodeScale = 0; clearIntervals(); timeouts.push(setTimeout(startExploding, 3000)); } document.getElementById('explodeRange_0').value = explodeScale; } function clearIntervals(){ intervals.forEach(function(interval){ clearInterval(interval); }); intervals = []; timeouts.forEach(function(timeout){ clearTimeout(timeout); }); timeouts = []; } // ---------------------- DISPLAY -------------------------------------------------- // --------------------------------------------------------------------------------- const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" }; const objectTypeVisible = {}; Object.assign(objectTypeVisible,modelContains); const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort(); const shownObjectTypesList = document.getElementById('shownObjectTypesList_0'); function setVisibility(bool,objname) { for (var i=0; i<scene.children.length; i++){ var obj = scene.children[i].getObjectByName(objname); if (obj) { obj.visible = bool; } } } function toggleObjectTypeVisibility(event){ var name = event.currentTarget.name; var checked = event.currentTarget.checked; objectTypeVisible[name] = checked; if (name == "faces") { setVisibility(checked,"frontfaces"); setVisibility(checked,"backfaces"); } else { setVisibility(checked,name); } } for (var i=0; i<sortedObjectTypeKeys.length; i++){ var key = sortedObjectTypeKeys[i]; if (modelContains[key]) { var objTypeNode = document.createElement('span'); objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = key; checkbox.onchange = toggleObjectTypeVisibility; shownObjectTypesList.appendChild(checkbox); shownObjectTypesList.appendChild(objTypeNode); } } // ------------------------------------------------------ function toggleObjectVisibility(event){ var nr = Number(event.currentTarget.name); scene.children[nr].visible = event.currentTarget.checked; } // append checkboxes for displaying or hiding objects var shownObjectsList = document.getElementById('shownObjectsList_0'); for (var i=0; i<scene.children.length; i++){ obj = scene.children[i]; var objNode = document.createElement('span'); objNode.innerHTML = obj.name + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = String(i); checkbox.onchange = toggleObjectVisibility; shownObjectsList.appendChild(checkbox); shownObjectsList.appendChild(objNode); } // ---------------------- SVG ------------------------------------------------------ // --------------------------------------------------------------------------------- function takeSvgScreenshot() { if (objectTypeVisible["pointlabels"]) { setVisibility(false,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(false,"edgelabels"); } svgRenderer.render(scene,camera); svgElement = XMLS.serializeToString(svgRenderer.domElement); if (objectTypeVisible["pointlabels"]) { setVisibility(true,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(true,"edgelabels"); } if (document.getElementById('tab_0').checked){ //show in new tab var myWindow = window.open("",""); myWindow.document.body.innerHTML = svgElement; } else{ // download svg file download("screenshot.svg", svgElement); } } function download(filename, text) { var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } document.getElementById('transparencyRange_0').oninput = changeTransparency; document.getElementById('depthWriteCheckbox_0').onchange = toggleDepthWrite; document.getElementById('changeRotationX_0').onchange = changeRotationX; document.getElementById('changeRotationY_0').onchange = changeRotationY; document.getElementById('changeRotationZ_0').onchange = changeRotationZ; document.getElementById('resetButton_0').onclick = resetScene; document.getElementById('rotationSpeedRange_0').oninput = changeRotationSpeedFactor; document.getElementById('takeScreenshot_0').onclick = takeSvgScreenshot; document.getElementById('showSettingsButton_0').onclick = showSettings; document.getElementById('hideSettingsButton_0').onclick = hideSettings; // ------------------ SHORTCUTS -------------------------------------------- // ------------------------------------------------------------------------- /** * http://www.openjs.com/scripts/events/keyboard_shortcuts/ * Version : 2.01.B * By Binny V A * License : BSD */ shortcut = { 'all_shortcuts':{},//All the shortcuts are stored in this array 'add': function(shortcut_combination,callback,opt) { //Provide a set of default options var default_options = { 'type':'keydown', 'propagate':false, 'disable_in_input':false, 'target':document, 'keycode':false } if(!opt) opt = default_options; else { for(var dfo in default_options) { if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo]; } } var ele = opt.target; if(typeof opt.target == 'string') ele = document.getElementById(opt.target); var ths = this; shortcut_combination = shortcut_combination.toLowerCase(); //The function to be called at keypress var func = function(e) { e = e || window.event; if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields var element; if(e.target) element=e.target; else if(e.srcElement) element=e.srcElement; if(element.nodeType==3) element=element.parentNode; if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return; } //Find Which key is pressed if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; var character = String.fromCharCode(code).toLowerCase(); if(code == 188) character=","; //If the user presses , when the type is onkeydown if(code == 190) character="."; //If the user presses , when the type is onkeydown var keys = shortcut_combination.split("+"); //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked var kp = 0; //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken var shift_nums = { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&", "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<", ".":">", "/":"?", "\\":"|" } //Special Keys - and their codes var special_keys = { 'esc':27, 'escape':27, 'tab':9, 'space':32, 'return':13, 'enter':13, 'backspace':8, 'scrolllock':145, 'scroll_lock':145, 'scroll':145, 'capslock':20, 'caps_lock':20, 'caps':20, 'numlock':144, 'num_lock':144, 'num':144, 'pause':19, 'break':19, 'insert':45, 'home':36, 'delete':46, 'end':35, 'pageup':33, 'page_up':33, 'pu':33, 'pagedown':34, 'page_down':34, 'pd':34, 'left':37, 'up':38, 'right':39, 'down':40, 'f1':112, 'f2':113, 'f3':114, 'f4':115, 'f5':116, 'f6':117, 'f7':118, 'f8':119, 'f9':120, 'f10':121, 'f11':122, 'f12':123 } var modifiers = { shift: { wanted:false, pressed:false}, ctrl : { wanted:false, pressed:false}, alt : { wanted:false, pressed:false}, meta : { wanted:false, pressed:false} //Meta is Mac specific }; if(e.ctrlKey) modifiers.ctrl.pressed = true; if(e.shiftKey) modifiers.shift.pressed = true; if(e.altKey) modifiers.alt.pressed = true; if(e.metaKey) modifiers.meta.pressed = true; for(var i=0; k=keys[i],i<keys.length; i++) { //Modifiers if(k == 'ctrl' || k == 'control') { kp++; modifiers.ctrl.wanted = true; } else if(k == 'shift') { kp++; modifiers.shift.wanted = true; } else if(k == 'alt') { kp++; modifiers.alt.wanted = true; } else if(k == 'meta') { kp++; modifiers.meta.wanted = true; } else if(k.length > 1) { //If it is a special key if(special_keys[k] == code) kp++; } else if(opt['keycode']) { if(opt['keycode'] == code) kp++; } else { //The special keys did not match if(character == k) kp++; else { if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase character = shift_nums[character]; if(character == k) kp++; } } } } if(kp == keys.length && modifiers.ctrl.pressed == modifiers.ctrl.wanted && modifiers.shift.pressed == modifiers.shift.wanted && modifiers.alt.pressed == modifiers.alt.wanted && modifiers.meta.pressed == modifiers.meta.wanted) { callback(e); if(!opt['propagate']) { //Stop the event //e.cancelBubble is supported by IE - this will kill the bubbling process. e.cancelBubble = true; e.returnValue = false; //e.stopPropagation works in Firefox. if (e.stopPropagation) { e.stopPropagation(); e.preventDefault(); } return false; } } } this.all_shortcuts[shortcut_combination] = { 'callback':func, 'target':ele, 'event': opt['type'] }; //Attach the function with the event if(ele.addEventListener) ele.addEventListener(opt['type'], func, false); else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func); else ele['on'+opt['type']] = func; }, //Remove the shortcut - just specify the shortcut and I will remove the binding 'remove':function(shortcut_combination) { shortcut_combination = shortcut_combination.toLowerCase(); var binding = this.all_shortcuts[shortcut_combination]; delete(this.all_shortcuts[shortcut_combination]) if(!binding) return; var type = binding['event']; var ele = binding['target']; var callback = binding['callback']; if(ele.detachEvent) ele.detachEvent('on'+type, callback); else if(ele.removeEventListener) ele.removeEventListener(type, callback, false); else ele['on'+type] = false; } } shortcut.add("Alt+Left",function() { var event = new Event('click'); if (settingsShown){ document.getElementById('hideSettingsButton_0').dispatchEvent(event); } else { document.getElementById('showSettingsButton_0').dispatchEvent(event); } }); // COMMON_CODE_BLOCK_END });}); </script> </body> </html> </HTML> <code perl> > $s->properties; name: s type: HyperbolicSurface DCEL N_vertices: 3 Halfedges list: (edgeIndex: twinIndex nextIndex prevIndex headIndex) 0: 1 2 4 1 (0 ---> 1) 1: 0 5 3 0 (1 ---> 0) 2: 3 4 0 2 (1 ---> 2) 3: 2 1 5 1 (2 ---> 1) 4: 5 0 2 0 (2 ---> 0) 5: 4 3 1 2 (0 ---> 2) FLIP_WORDS {} {0} {1} {2} PENNER_COORDINATES 1 1 1 SECONDARY_FAN type: PolyhedralFan<Rational> </code> The ''%%FLIP_WORDS%%'' indicate how to obtain the Delaunay triangulations. The k-th flip word is a list of integers (the indices of the edges) that describe which edge flips produce the k-th Delaunay triangulation. Note that the k-th Delaunay triangulation also corresponds to the k-th maximal cone of the ''%%SECONDARY_FAN%%''. ==== GKZ vectors & secondary polyhedra ==== In order to compute ''%%GKZ_VECTORS%%'' or a ''%%secondary_polyhedron%%'' of a hyperbolic surface one needs to additionally specify a ''%%SPECIAL_POINT%%'' on the surface. This is done by choosing two rational numbers. Continuing with the above example, lets look at the following. <code perl> > $s = new HyperbolicSurface(DCEL=>$S3,PENNER_COORDINATES=>[1,1,1],SPECIAL_POINT=>[1,0]); </code> Now we may compute an approximation of the ''%%GKZ_VECTORS%%'' of the surface. The approximation depends on a parameter //depth// that restricts the depth of the (covering) triangles that are summed over in the definition of the GKZ vectors. <code perl> > print $s->GKZ_VECTORS(3); 1 33346854621/25672050625 33346854621/25672050625 19782163/27238250 1 2361/3250 3955357/5447650 33346854621/25672050625 1 10549213550005124385885122/6365327663846199230365625 11433978/13287625 30327974429709/105771923977850 1 11433978/13287625 10549213550005124385885122/6365327663846199230365625 30327974429709/105771923977850 </code> The secondary polyhedron can be computed similarly using the function ''%%secondary_polyhedron%%''. <code perl> > $p = secondary_polyhedron($s,10); > $p->properties; name: p type: Polytope<Float> CONE_AMBIENT_DIM 4 VERTICES 1 1.315301353 1.315301353 0.7316378744 1 0.7316489581 0.7316267908 1.315301353 1 1.752046187 0.8750928112 0.2910011302 1 0.8750928112 1.752046187 0.2910011302 0 -1 0 0 0 0 -1 0 0 0 0 -1 VERTICES_IN_FACETS {0 1 3 4} {0 1 2 5} {0 2 3 6} {1 4 5} {2 5 6} {3 4 6} > $p->VISUAL(FacetColor=>'255 180 80'); </code> <HTML> <!-- polymake for knusper Thu Mar 3 00:31:35 2022 p_bounded --> <html> <head> <meta charset=utf-8> <title>p_bounded</title> <style> /* // COMMON_CODE_BLOCK_BEGIN */ html {overflow: scroll;} strong{font-size: 18px;} canvas { z-index: 8; } input[type='radio'] {margin-left:0;} input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;} .group{padding-bottom: 15px;} .settings * {z-index: 11; } .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;} .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;} .showSettingsButton{visibility: visible; z-index: 12; position: absolute } .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5} button{margin-left: 0; margin-top: 10px} img{cursor: pointer;} .suboption{padding-top: 15px;} #model5211478894 { width: 100%; height: 100%; } .threejs_container { width: 100%; height: 75vh;} .settings{max-height: 74vh} input[type=range] { -webkit-appearance: none; padding:0; width:90%; margin-left: auto; margin-right: auto; margin-top: 15px; margin-bottom: 15px; display: block; } input[type=range]:focus { outline: none; } input[type=range]::-webkit-slider-runnable-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-webkit-slider-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; -webkit-appearance: none; margin-top: -5px; } input[type=range]:focus::-webkit-slider-runnable-track { background: #E3E3E3; } input[type=range]::-moz-range-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-moz-range-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]::-ms-track { height: 4px; cursor: pointer; animate: 0.2s; background: transparent; border-color: transparent; color: transparent; } input[type=range]::-ms-fill-lower { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-fill-upper { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]:focus::-ms-fill-lower { background: #E3E3E3; } input[type=range]:focus::-ms-fill-upper { background: #E3E3E3; } /* // COMMON_CODE_BLOCK_END */ </style> </head> <body> <div class='threejs_container'> <div id='settings_1' class='settings'> <div class=group id='transparency_1' class='transparency'> <strong>Transparency</strong> <input id='transparencyRange_1' type='range' min=0 max=1 step=0.01 value=0> <div class=indented><input id='depthWriteCheckbox_1' type='checkbox'>depthWrite</div> </div> <div class=group id='rotation_1'> <strong>Rotation</strong> <div class=indented> <div><input type='checkbox' id='changeRotationX_1'> x-axis</div> <div><input type='checkbox' id='changeRotationY_1'> y-axis</div> <div><input type='checkbox' id='changeRotationZ_1'> z-axis</div> <button id='resetButton_1'>Reset</button> </div> <div class=suboption>Rotation speed</div> <input id='rotationSpeedRange_1' type='range' min=0 max=5 step=0.01 value=2> </div> <div class=group id='display_1'> <strong>Display</strong> <div class=indented> <div id='shownObjectTypesList_1' class='shownObjectsList'></div> </div> <div class=suboption>Objects</div> <div class=indented> <div id='shownObjectsList_1' class='shownObjectsList'></div> </div> </div> <div class=group id='camera_1'> <strong>Camera</strong> <div class=indented> <form> <select id="cameraType_1"> <option value='perspective' selected> Perspective<br></option> <option value='orthographic' > Orthographic<br></option> </select> </form> </div> </div> <div class=group id='svg_1'> <strong>SVG</strong> <div class=indented> <form> <input type="radio" name='screenshotMode' value='download' id='download_1' checked> Download<br> <input type="radio" name='screenshotMode' value='tab' id='tab_1' > New tab<br> </form> <button id='takeScreenshot_1'>Screenshot</button> </div> </div> </div> <!-- end of settings --> <img id='hideSettingsButton_1' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px"> <img id='showSettingsButton_1' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px"> <div id="model5211478894"></div> </div> <script> requirejs.config({ paths: { three: '/kernelspecs/r118/polymake/three', TrackballControls: '/kernelspecs/r118/polymake/TrackballControls', OrbitControls: '/kernelspecs/r118/polymake/OrbitControls', Projector: '/kernelspecs/r118/polymake/Projector', SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer', WEBGL: '/kernelspecs/r118/polymake/WebGL', }, shim: { 'three': { exports: 'THREE'}, 'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' }, 'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' }, 'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' }, 'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' }, 'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' }, } }); require(['three'],function(THREE){ window.THREE = THREE; require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'], function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) { THREE.TrackballControls = TrackballControls; THREE.OrbitControls = OrbitControls; THREE.Projector = Projector; THREE.SVGRenderer = SVGRenderer; THREE.WEBGL = WEBGL; // COMMON_CODE_BLOCK_BEGIN const intervalLength = 25; // for automatic animations const explodableModel = false; const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false }; const foldables = []; var three = document.getElementById("model5211478894"); var scene = new THREE.Scene(); var renderer = new THREE.WebGLRenderer( { antialias: true } ); var svgRenderer = new THREE.SVGRenderer( { antialias: true } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setClearColor(0xFFFFFF, 1); svgRenderer.setClearColor(0xFFFFFF, 1); three.appendChild(renderer.domElement); var frustumSize = 4; var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()]; cameras.forEach(function(cam) { cam.position.set(0, 0, 5); cam.lookAt(0, 0, 0); cam.up.set(0, 1, 0); }); var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)]; var camera, control; controls[0].zoomSpeed = 0.2; controls[0].rotateSpeed = 4; // class to allow move points together with labels and spheres var PMPoint = function (x,y,z) { this.vector = new THREE.Vector3(x,y,z); this.sprite = null; this.sphere = null; } PMPoint.prototype.addLabel = function(labelsprite) { this.sprite = labelsprite; this.sprite.position.copy(this.vector); } PMPoint.prototype.addSphere = function(spheremesh) { this.sphere = spheremesh; this.sphere.position.copy(this.vector); } PMPoint.prototype.set = function(x,y,z) { this.vector.set(x,y,z); if (this.sprite) { this.sprite.position.copy(this.vector); } if (this.sphere) { this.sphere.position.copy(this.vector); } } PMPoint.prototype.radius = function() { if (this.sphere) { return this.sphere.geometry.parameters.radius; } else { return 0; } }; // select the target node var target = document.querySelector('#model5211478894'); // create an observer instance var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.removedNodes && mutation.removedNodes.length > 0) { cancelAnimationFrame(renderId); observer.disconnect(); console.log("cancelled frame "+renderId); } }); }); // configuration of the observer: var config = { childList: true, characterData: true } // pass in the target node, as well as the observer options while (target) { if (target.className=="output") { observer.observe(target, config); break; } target = target.parentNode; } // COMMON_CODE_BLOCK_END var obj0 = new THREE.Object3D(); obj0.name = "p_bounded"; obj0.userData.explodable = 1; obj0.userData.points = []; obj0.userData.points.push(new PMPoint(1.75205, 0.876119, 0.291727)); obj0.userData.points.push(new PMPoint(1.75205, -0.492876, 0.290856)); obj0.userData.points.push(new PMPoint(0.731446, -0.492876, 1.3153)); obj0.userData.points.push(new PMPoint(-0.492828, 1.75205, -0.938159)); obj0.userData.points.push(new PMPoint(-0.492828, -0.492876, 1.3153)); obj0.userData.points.push(new PMPoint(-0.492828, -0.492876, -0.938159)); obj0.userData.points.push(new PMPoint(1.75205, -0.492876, -0.938159)); obj0.userData.points.push(new PMPoint(1.75205, 0.875004, -0.938159)); obj0.userData.points.push(new PMPoint(0.875004, 1.75205, -0.938159)); obj0.userData.points.push(new PMPoint(-0.492828, 0.731423, 1.3153)); obj0.userData.points.push(new PMPoint(-0.492828, 1.75205, 0.290856)); obj0.userData.points.push(new PMPoint(0.876119, 1.75205, 0.291731)); obj0.userData.points.push(new PMPoint(0.732223, 0.732203, 1.3153)); obj0.userData.points.push(new PMPoint(1.31428, 1.31428, 0.731417)); obj0.userData.pointradii = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; <!-- Vertex style --> obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj0.userData.pointlabels = [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "]; obj0.userData.edgeindices = [0, 1, 1, 2, 2, 4, 3, 5, 4, 5, 1, 6, 5, 6, 0, 7, 6, 7, 3, 8, 7, 8, 4, 9, 3, 10, 9, 10, 8, 11, 10, 11, 2, 12, 9, 12, 0, 13, 11, 13, 12, 13]; <!-- Edge style --> obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj0.userData.facets = [[12, 13, 11, 10, 9], [0, 13, 12, 2, 1], [11, 13, 0, 7, 8], [12, 9, 4, 2], [7, 0, 1, 6], [10, 11, 8, 3], [9, 10, 3, 5, 4], [4, 5, 6, 1, 2], [8, 7, 6, 5, 3]]; <!-- Facet style --> obj0.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj0); scene.add(obj0); // COMMON_CODE_BLOCK_BEGIN function textSpriteMaterial(message, parameters) { if ( parameters === undefined ) parameters = {}; var fontface = "Helvetica"; var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15; fontsize = fontsize*10; var lines = message.split('\\n'); var size = 512; for(var i = 0; i<lines.length; i++){ var tmp = lines[i].length; while(tmp*fontsize > size){ fontsize--; } } var canvas = document.createElement('canvas'); canvas.width = size; canvas.height = size; var context = canvas.getContext('2d'); context.fillStyle = "rgba(255, 255, 255, 0)"; context.fill(); context.font = fontsize + "px " + fontface; // text color context.fillStyle = "rgba(0, 0, 0, 1.0)"; for(var i = 0; i<lines.length; i++){ context.fillText(lines[i], size/2, size/2+i*fontsize); } // canvas contents will be used for a texture var texture = new THREE.Texture(canvas); texture.needsUpdate = true; var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 }); return spriteMaterial; } // ---------------------- INITIALIZING OBJECTS-------------------------------------- // --------------------------------------------------------------------------------- function init_object(obj) { if (obj.userData.hasOwnProperty("pointmaterial")) { init_points(obj); modelContains.points = true; } if (obj.userData.hasOwnProperty("pointlabels")) { init_pointlabels(obj); modelContains.pointlabels = true; } if (obj.userData.hasOwnProperty("edgematerial")) { init_lines(obj); modelContains.lines = true; } if (obj.userData.hasOwnProperty("edgelabels")) { init_edgelabels(obj); modelContains.edgelabels = true; } if (obj.userData.hasOwnProperty("arrowstyle")) { init_arrowheads(obj); modelContains.arrowheads = true; } if (obj.userData.hasOwnProperty("facetmaterial")) { init_faces(obj); modelContains.faces = true; } } function init_points(obj) { var pointgroup = new THREE.Group(); pointgroup.name = "points"; var points = obj.userData.points; var radii = obj.userData.pointradii; var materials = obj.userData.pointmaterial; var geometry,material; if (!Array.isArray(radii)) { geometry = new THREE.SphereBufferGeometry(radii); } if (!Array.isArray(materials)) { material = materials; } for (var i=0; i<points.length; i++) { var point = points[i]; if (Array.isArray(radii)) { if (radii[i] == 0) { continue; } geometry = new THREE.SphereBufferGeometry(radii[i]); } if (Array.isArray(materials)) { material = materials[i]; } var sphere = new THREE.Mesh(geometry, material); point.addSphere(sphere); pointgroup.add(sphere); } obj.add(pointgroup); } function init_pointlabels(obj) { var points = obj.userData.points; var labels = obj.userData.pointlabels; var pointlabels = new THREE.Group(); pointlabels.name = "pointlabels"; if (Array.isArray(labels)) { for (var i=0; i<points.length; i++) { var point = points[i]; var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<points.length; i++) { var point = points[i]; var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } obj.add(pointlabels); } function init_lines(obj) { var edgeindices = obj.userData.edgeindices; var points = obj.userData.points; var materials = obj.userData.edgematerial; var geometry = new THREE.BufferGeometry(); var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 ); var geometry = new THREE.BufferGeometry(); geometry.setAttribute('position', bufattr); if (Array.isArray(materials)) { for (var i=0; i<materials.length; i++) { geometry.addGroup(2*i,2,i); } } var lines = new THREE.LineSegments(geometry, materials); lines.name = "lines"; obj.add(lines); updateEdgesPosition(obj); } function init_edgelabels(obj) { var points = obj.userData.points; var edgeindices = obj.userData.edgeindices; var labels = obj.userData.edgelabels; var edgelabels = new THREE.Group(); edgelabels.name = "edgelabels"; if (Array.isArray(labels)) { for (var i=0; i<edgeindices.length/2; i++) { var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<edgeindices.length/2; i++) { var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } obj.add(edgelabels); } function init_arrowheads(obj) { var arrowheads = new THREE.Group(); arrowheads.name = "arrowheads"; var arrowstyle = obj.userData.arrowstyle; var edgeindices = obj.userData.edgeindices; var edgematerials = obj.userData.edgematerial; var points = obj.userData.points; var material; if (!Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials.color} ); } for (var i=0; i<edgeindices.length; i=i+2) { var start = points[edgeindices[i]]; var end = points[edgeindices[i+1]]; var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius(); if (dist <= 0) { continue; } var dir = new THREE.Vector3().subVectors(end.vector,start.vector); dir.normalize(); var axis = new THREE.Vector3().set(dir.z,0,-dir.x); axis.normalize(); var radians = Math.acos( dir.y ); var radius = dist/25; var height = dist/5; var geometry = new THREE.ConeBufferGeometry(radius,height); var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2)); if (Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} ); } var cone = new THREE.Mesh( geometry, material ); cone.quaternion.setFromAxisAngle(axis,radians);; cone.position.copy(position);; arrowheads.add(cone); } obj.add(arrowheads); } function init_faces(obj) { var points = obj.userData.points; var facets = obj.userData.facets; obj.userData.triangleindices = []; for (var i=0; i<facets.length; i++) { facet = facets[i]; for (var t=0; t<facet.length-2; t++) { obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]); } } var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute(bufarr,3); var materials = obj.userData.facetmaterial; var geometry = new THREE.BufferGeometry(); var frontmaterials = []; var backmaterials = []; geometry.setAttribute('position',bufattr); if (Array.isArray(materials)) { var tricount = 0; var facet; for (var i=0; i<facets.length; i++) { facet = facets[i]; geometry.addGroup(tricount,(facet.length-2)*3,i); tricount += (facet.length-2)*3; } for (var j=0; j<materials.length; j++) { var fmat = materials[j].clone() fmat.side = THREE.FrontSide; frontmaterials.push(fmat); var bmat = materials[j].clone() bmat.side = THREE.BackSide; backmaterials.push(bmat); obj.userData.facetmaterial = frontmaterials.concat(backmaterials); } } else if (materials instanceof THREE.Material) { frontmaterials = materials.clone() frontmaterials.side = THREE.FrontSide; backmaterials = materials.clone() backmaterials.side = THREE.BackSide; obj.userData.facetmaterial = [frontmaterials, backmaterials]; } // duplicating the object with front and back should avoid transparency issues var backmesh = new THREE.Mesh(geometry, backmaterials); // meshname is used to show/hide objects backmesh.name = "backfaces"; obj.add(backmesh); var frontmesh = new THREE.Mesh(geometry, frontmaterials); frontmesh.name = "frontfaces"; obj.add(frontmesh); updateFacesPosition(obj); } // //INITIALIZING function updateFacesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.triangleindices; var faces = obj.getObjectByName("frontfaces"); var ba = faces.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } faces.geometry.attributes.position.needsUpdate = true; } function updateEdgesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.edgeindices; var lines = obj.getObjectByName("lines"); var ba = lines.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } lines.geometry.attributes.position.needsUpdate = true; } function onWindowResize() { renderer.setSize( three.clientWidth, three.clientHeight ); svgRenderer.setSize( three.clientWidth, three.clientHeight ); updateCamera(); } function updateCamera() { var width = three.clientWidth; var height = three.clientHeight; var aspect = width / height; if (camera.type == "OrthographicCamera") { camera.left = frustumSize * aspect / - 2; camera.right = frustumSize * aspect / 2; camera.top = frustumSize / 2; camera.bottom = - frustumSize / 2; } else if (camera.type == "PerspectiveCamera") { camera.aspect = aspect; } camera.updateProjectionMatrix(); } function changeCamera(event) { var selindex = event.currentTarget.selectedIndex; camera = cameras[selindex]; control = controls[selindex]; control.enabled = true; for (var i=0; i<controls.length; i++) { if (i!=selindex) { controls[i].enabled = false; } } updateCamera(); } var camtypenode = document.getElementById('cameraType_1'); camtypenode.onchange = changeCamera; camtypenode.dispatchEvent(new Event('change')); onWindowResize(); window.addEventListener('resize', onWindowResize); var xRotationEnabled = false; var yRotationEnabled = false; var zRotationEnabled = false; var rotationSpeedFactor = 1; var settingsShown = false; var labelsShown = true; var intervals = []; var timeouts = []; var explodingSpeed = 0.05; var explodeScale = 0.000001; var XMLS = new XMLSerializer(); var svgElement; var renderId; var render = function () { renderId = requestAnimationFrame(render); // comment in for automatic explosion // explode(updateFactor()); var phi = 0.02 * rotationSpeedFactor; if (xRotationEnabled) { scene.rotation.x += phi; } if (yRotationEnabled) { scene.rotation.y += phi; } if (zRotationEnabled) { scene.rotation.z += phi; } control.update(); renderer.render(scene, camera); }; if ( THREE.WEBGL.isWebGLAvailable() ) { render(); } else { var warning = WEBGL.getWebGLErrorMessage(); three.appendChild( warning ); } function changeTransparency() { var opacity = 1-Number(event.currentTarget.value); for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].opacity = opacity; } } else { child.userData.facetmaterial.opacity = opacity; } } } } function toggleDepthWrite(event) { depthwrite = event.currentTarget.checked; for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].depthWrite = depthwrite; } } else { child.userData.facetmaterial.depthWrite = depthWrite; } } } } function changeRotationX(event){ xRotationEnabled = event.currentTarget.checked; } function changeRotationY(event){ yRotationEnabled = event.currentTarget.checked; } function changeRotationZ(event){ zRotationEnabled = event.currentTarget.checked; } function changeRotationSpeedFactor(event){ rotationSpeedFactor = Number(event.currentTarget.value); } function resetScene(){ scene.rotation.set(0,0,0); camera.position.set(0,0,5); camera.up.set(0,1,0); } function showSettings(event){ document.getElementById('settings_1').style.visibility = 'visible'; document.getElementById('showSettingsButton_1').style.visibility = 'hidden'; document.getElementById('hideSettingsButton_1').style.visibility = 'visible'; settingsShown = true; } function hideSettings(event){ document.getElementById('settings_1').style.visibility = 'hidden'; document.getElementById('showSettingsButton_1').style.visibility = 'visible'; document.getElementById('hideSettingsButton_1').style.visibility = 'hidden'; settingsShown = false; } var pos = 150* Math.PI; function updateFactor() { pos++; return Math.sin(.01*pos)+1; } // ------------------------ FOLDING ------------------------------------------------ // --------------------------------------------------------------------------------- // rotate point p around axis defined by points p1 and p2 by given angle function rotate(p, p1, p2, angle ){ angle = -angle; var x = p.x, y = p.y, z = p.z, a = p1.x, b = p1.y, c = p1.z, u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z; var result = []; var L = u*u + v*v + w*w; var sqrt = Math.sqrt; var cos = Math.cos; var sin = Math.sin; result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L; result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L; result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L; return result; } var fold = function(event){ var obj = foldables[Number(event.currentTarget.name)]; var foldvalue = Number(event.currentTarget.value); var scale = foldvalue - obj.userData.oldscale; for (var j=0; j<obj.userData.axes.length; j++) { rotateVertices(obj, j, scale); } update(obj); obj.userData.oldscale += scale; lookAtBarycenter(obj); } function lookAtBarycenter(obj){ control.target = barycenter(obj); } function barycenter(obj) { var center = new THREE.Vector3(0,0,0); var points = obj.userData.points; for (var i=0; i<points.length; i++){ center.add(points[i].vector); } center.divideScalar(points.length); return center; } function rotateVertices(obj, edge, scale) { var axes = obj.userData.axes; var subtrees = obj.userData.subtrees; var points = obj.userData.points; var angles = obj.userData.angles; if (edge < axes.length){ for (var j=0; j<subtrees[edge].length; j++){ var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge])); points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]); } } } function update(obj) { updateFacesPosition(obj); updateEdgesPosition(obj); } if (foldables.length) { var settings = document.getElementById('settings_1'); var foldDiv = document.createElement('div'); foldDiv.id = 'fold_1'; var title = document.createElement('strong'); title.innerHTML = 'Fold'; foldDiv.appendChild(title); foldDiv.className = 'group'; for (var i=0; i<foldables.length; i++) { var range = document.createElement('input'); range.type = 'range'; range.min = 0; range.max = 1; range.value = 0; range.step = 0.001; range.name = String(i); range.oninput = fold; foldDiv.appendChild(range); } lookAtBarycenter(foldables[0]); settings.insertBefore(foldDiv,settings.childNodes[0]); } // ---------------------- EXPLOSION ------------------------------------------------ // --------------------------------------------------------------------------------- if (explodableModel) { for (var i=0; i<scene.children.length; i++) { obj = scene.children[i]; if ( obj.userData.explodable ) { computeCentroid(obj); } } document.getElementById('explodeRange_1').oninput = triggerExplode; document.getElementById('explodeCheckbox_1').onchange = triggerAutomaticExplode; document.getElementById('explodingSpeedRange_1').oninput = setExplodingSpeed; explode(0.000001); } function computeCentroid(obj) { centroid = new THREE.Vector3(); obj.userData.points.forEach(function(pmpoint) { centroid.add(pmpoint.vector); }); centroid.divideScalar(obj.userData.points.length); obj.userData.centroid = centroid; } function explode(factor) { for (var i=0; i<scene.children.length; i++) { var obj = scene.children[i]; if (obj.userData.hasOwnProperty("centroid")) { var c = obj.userData.centroid; obj.position.set(c.x*factor, c.y*factor, c.z*factor); } } } function triggerExplode(event){ explodeScale = Number(event.currentTarget.value); explode(explodeScale); } function setExplodingSpeed(event){ explodingSpeed = Number(event.currentTarget.value); } function triggerAutomaticExplode(event){ if (event.currentTarget.checked){ startExploding(); } else { clearIntervals(); } } function startExploding(){ intervals.push(setInterval(explodingInterval, 25)); } function explodingInterval(){ explodeScale += explodingSpeed; if (explodeScale <= 6){ explode(explodeScale); } else{ explode(6); explodeScale = 6; clearIntervals(); timeouts.push(setTimeout(startUnexploding, 3000)); } document.getElementById('explodeRange_1').value = explodeScale; } function startUnexploding(){ intervals.push(setInterval(unexplodingInterval, 25)); } function unexplodingInterval(){ explodeScale -= explodingSpeed; if (explodeScale >= 0){ explode(explodeScale); } else { explode(0); explodeScale = 0; clearIntervals(); timeouts.push(setTimeout(startExploding, 3000)); } document.getElementById('explodeRange_1').value = explodeScale; } function clearIntervals(){ intervals.forEach(function(interval){ clearInterval(interval); }); intervals = []; timeouts.forEach(function(timeout){ clearTimeout(timeout); }); timeouts = []; } // ---------------------- DISPLAY -------------------------------------------------- // --------------------------------------------------------------------------------- const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" }; const objectTypeVisible = {}; Object.assign(objectTypeVisible,modelContains); const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort(); const shownObjectTypesList = document.getElementById('shownObjectTypesList_1'); function setVisibility(bool,objname) { for (var i=0; i<scene.children.length; i++){ var obj = scene.children[i].getObjectByName(objname); if (obj) { obj.visible = bool; } } } function toggleObjectTypeVisibility(event){ var name = event.currentTarget.name; var checked = event.currentTarget.checked; objectTypeVisible[name] = checked; if (name == "faces") { setVisibility(checked,"frontfaces"); setVisibility(checked,"backfaces"); } else { setVisibility(checked,name); } } for (var i=0; i<sortedObjectTypeKeys.length; i++){ var key = sortedObjectTypeKeys[i]; if (modelContains[key]) { var objTypeNode = document.createElement('span'); objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = key; checkbox.onchange = toggleObjectTypeVisibility; shownObjectTypesList.appendChild(checkbox); shownObjectTypesList.appendChild(objTypeNode); } } // ------------------------------------------------------ function toggleObjectVisibility(event){ var nr = Number(event.currentTarget.name); scene.children[nr].visible = event.currentTarget.checked; } // append checkboxes for displaying or hiding objects var shownObjectsList = document.getElementById('shownObjectsList_1'); for (var i=0; i<scene.children.length; i++){ obj = scene.children[i]; var objNode = document.createElement('span'); objNode.innerHTML = obj.name + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = String(i); checkbox.onchange = toggleObjectVisibility; shownObjectsList.appendChild(checkbox); shownObjectsList.appendChild(objNode); } // ---------------------- SVG ------------------------------------------------------ // --------------------------------------------------------------------------------- function takeSvgScreenshot() { if (objectTypeVisible["pointlabels"]) { setVisibility(false,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(false,"edgelabels"); } svgRenderer.render(scene,camera); svgElement = XMLS.serializeToString(svgRenderer.domElement); if (objectTypeVisible["pointlabels"]) { setVisibility(true,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(true,"edgelabels"); } if (document.getElementById('tab_1').checked){ //show in new tab var myWindow = window.open("",""); myWindow.document.body.innerHTML = svgElement; } else{ // download svg file download("screenshot.svg", svgElement); } } function download(filename, text) { var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } document.getElementById('transparencyRange_1').oninput = changeTransparency; document.getElementById('depthWriteCheckbox_1').onchange = toggleDepthWrite; document.getElementById('changeRotationX_1').onchange = changeRotationX; document.getElementById('changeRotationY_1').onchange = changeRotationY; document.getElementById('changeRotationZ_1').onchange = changeRotationZ; document.getElementById('resetButton_1').onclick = resetScene; document.getElementById('rotationSpeedRange_1').oninput = changeRotationSpeedFactor; document.getElementById('takeScreenshot_1').onclick = takeSvgScreenshot; document.getElementById('showSettingsButton_1').onclick = showSettings; document.getElementById('hideSettingsButton_1').onclick = hideSettings; // ------------------ SHORTCUTS -------------------------------------------- // ------------------------------------------------------------------------- /** * http://www.openjs.com/scripts/events/keyboard_shortcuts/ * Version : 2.01.B * By Binny V A * License : BSD */ shortcut = { 'all_shortcuts':{},//All the shortcuts are stored in this array 'add': function(shortcut_combination,callback,opt) { //Provide a set of default options var default_options = { 'type':'keydown', 'propagate':false, 'disable_in_input':false, 'target':document, 'keycode':false } if(!opt) opt = default_options; else { for(var dfo in default_options) { if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo]; } } var ele = opt.target; if(typeof opt.target == 'string') ele = document.getElementById(opt.target); var ths = this; shortcut_combination = shortcut_combination.toLowerCase(); //The function to be called at keypress var func = function(e) { e = e || window.event; if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields var element; if(e.target) element=e.target; else if(e.srcElement) element=e.srcElement; if(element.nodeType==3) element=element.parentNode; if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return; } //Find Which key is pressed if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; var character = String.fromCharCode(code).toLowerCase(); if(code == 188) character=","; //If the user presses , when the type is onkeydown if(code == 190) character="."; //If the user presses , when the type is onkeydown var keys = shortcut_combination.split("+"); //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked var kp = 0; //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken var shift_nums = { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&", "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<", ".":">", "/":"?", "\\":"|" } //Special Keys - and their codes var special_keys = { 'esc':27, 'escape':27, 'tab':9, 'space':32, 'return':13, 'enter':13, 'backspace':8, 'scrolllock':145, 'scroll_lock':145, 'scroll':145, 'capslock':20, 'caps_lock':20, 'caps':20, 'numlock':144, 'num_lock':144, 'num':144, 'pause':19, 'break':19, 'insert':45, 'home':36, 'delete':46, 'end':35, 'pageup':33, 'page_up':33, 'pu':33, 'pagedown':34, 'page_down':34, 'pd':34, 'left':37, 'up':38, 'right':39, 'down':40, 'f1':112, 'f2':113, 'f3':114, 'f4':115, 'f5':116, 'f6':117, 'f7':118, 'f8':119, 'f9':120, 'f10':121, 'f11':122, 'f12':123 } var modifiers = { shift: { wanted:false, pressed:false}, ctrl : { wanted:false, pressed:false}, alt : { wanted:false, pressed:false}, meta : { wanted:false, pressed:false} //Meta is Mac specific }; if(e.ctrlKey) modifiers.ctrl.pressed = true; if(e.shiftKey) modifiers.shift.pressed = true; if(e.altKey) modifiers.alt.pressed = true; if(e.metaKey) modifiers.meta.pressed = true; for(var i=0; k=keys[i],i<keys.length; i++) { //Modifiers if(k == 'ctrl' || k == 'control') { kp++; modifiers.ctrl.wanted = true; } else if(k == 'shift') { kp++; modifiers.shift.wanted = true; } else if(k == 'alt') { kp++; modifiers.alt.wanted = true; } else if(k == 'meta') { kp++; modifiers.meta.wanted = true; } else if(k.length > 1) { //If it is a special key if(special_keys[k] == code) kp++; } else if(opt['keycode']) { if(opt['keycode'] == code) kp++; } else { //The special keys did not match if(character == k) kp++; else { if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase character = shift_nums[character]; if(character == k) kp++; } } } } if(kp == keys.length && modifiers.ctrl.pressed == modifiers.ctrl.wanted && modifiers.shift.pressed == modifiers.shift.wanted && modifiers.alt.pressed == modifiers.alt.wanted && modifiers.meta.pressed == modifiers.meta.wanted) { callback(e); if(!opt['propagate']) { //Stop the event //e.cancelBubble is supported by IE - this will kill the bubbling process. e.cancelBubble = true; e.returnValue = false; //e.stopPropagation works in Firefox. if (e.stopPropagation) { e.stopPropagation(); e.preventDefault(); } return false; } } } this.all_shortcuts[shortcut_combination] = { 'callback':func, 'target':ele, 'event': opt['type'] }; //Attach the function with the event if(ele.addEventListener) ele.addEventListener(opt['type'], func, false); else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func); else ele['on'+opt['type']] = func; }, //Remove the shortcut - just specify the shortcut and I will remove the binding 'remove':function(shortcut_combination) { shortcut_combination = shortcut_combination.toLowerCase(); var binding = this.all_shortcuts[shortcut_combination]; delete(this.all_shortcuts[shortcut_combination]) if(!binding) return; var type = binding['event']; var ele = binding['target']; var callback = binding['callback']; if(ele.detachEvent) ele.detachEvent('on'+type, callback); else if(ele.removeEventListener) ele.removeEventListener(type, callback, false); else ele['on'+type] = false; } } shortcut.add("Alt+Left",function() { var event = new Event('click'); if (settingsShown){ document.getElementById('hideSettingsButton_1').dispatchEvent(event); } else { document.getElementById('showSettingsButton_1').dispatchEvent(event); } }); // COMMON_CODE_BLOCK_END });}); </script> </body> </html> </HTML> We may look at the GKZ domes of the individual Delaunay triangulations. <code perl> > $d0 = $s->gkz_dome(0,5); > $d0->VISUAL(FacetColor=>'80 180 255'); </code> <HTML> <!-- polymake for knusper Thu Mar 3 00:31:37 2022 pcom:d0 --> <html> <head> <meta charset=utf-8> <title>pcom:d0</title> <style> /* // COMMON_CODE_BLOCK_BEGIN */ html {overflow: scroll;} strong{font-size: 18px;} canvas { z-index: 8; } input[type='radio'] {margin-left:0;} input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;} .group{padding-bottom: 15px;} .settings * {z-index: 11; } .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;} .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;} .showSettingsButton{visibility: visible; z-index: 12; position: absolute } .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5} button{margin-left: 0; margin-top: 10px} img{cursor: pointer;} .suboption{padding-top: 15px;} #model94916611057 { width: 100%; height: 100%; } .threejs_container { width: 100%; height: 75vh;} .settings{max-height: 74vh} input[type=range] { -webkit-appearance: none; padding:0; width:90%; margin-left: auto; margin-right: auto; margin-top: 15px; margin-bottom: 15px; display: block; } input[type=range]:focus { outline: none; } input[type=range]::-webkit-slider-runnable-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-webkit-slider-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; -webkit-appearance: none; margin-top: -5px; } input[type=range]:focus::-webkit-slider-runnable-track { background: #E3E3E3; } input[type=range]::-moz-range-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-moz-range-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]::-ms-track { height: 4px; cursor: pointer; animate: 0.2s; background: transparent; border-color: transparent; color: transparent; } input[type=range]::-ms-fill-lower { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-fill-upper { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]:focus::-ms-fill-lower { background: #E3E3E3; } input[type=range]:focus::-ms-fill-upper { background: #E3E3E3; } /* // COMMON_CODE_BLOCK_END */ </style> </head> <body> <div class='threejs_container'> <div id='settings_2' class='settings'> <div class=group id='explode_2'> <strong>Explode</strong> <input id='explodeRange_2' type='range' min='0.00001' max=6 step=0.01 value=0.00001> <div class=indented><input id='explodeCheckbox_2' type='checkbox'>Automatic explosion</div> <div class=suboption>Exploding speed</div> <input id='explodingSpeedRange_2' type='range' min=0 max=0.5 step=0.001 value=0.05> </div> <div class=group id='transparency_2' class='transparency'> <strong>Transparency</strong> <input id='transparencyRange_2' type='range' min=0 max=1 step=0.01 value=0> <div class=indented><input id='depthWriteCheckbox_2' type='checkbox'>depthWrite</div> </div> <div class=group id='rotation_2'> <strong>Rotation</strong> <div class=indented> <div><input type='checkbox' id='changeRotationX_2'> x-axis</div> <div><input type='checkbox' id='changeRotationY_2'> y-axis</div> <div><input type='checkbox' id='changeRotationZ_2'> z-axis</div> <button id='resetButton_2'>Reset</button> </div> <div class=suboption>Rotation speed</div> <input id='rotationSpeedRange_2' type='range' min=0 max=5 step=0.01 value=2> </div> <div class=group id='display_2'> <strong>Display</strong> <div class=indented> <div id='shownObjectTypesList_2' class='shownObjectsList'></div> </div> <div class=suboption>Objects</div> <div class=indented> <div id='shownObjectsList_2' class='shownObjectsList'></div> </div> </div> <div class=group id='camera_2'> <strong>Camera</strong> <div class=indented> <form> <select id="cameraType_2"> <option value='perspective' selected> Perspective<br></option> <option value='orthographic' > Orthographic<br></option> </select> </form> </div> </div> <div class=group id='svg_2'> <strong>SVG</strong> <div class=indented> <form> <input type="radio" name='screenshotMode' value='download' id='download_2' checked> Download<br> <input type="radio" name='screenshotMode' value='tab' id='tab_2' > New tab<br> </form> <button id='takeScreenshot_2'>Screenshot</button> </div> </div> </div> <!-- end of settings --> <img id='hideSettingsButton_2' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px"> <img id='showSettingsButton_2' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px"> <div id="model94916611057"></div> </div> <script> requirejs.config({ paths: { three: '/kernelspecs/r118/polymake/three', TrackballControls: '/kernelspecs/r118/polymake/TrackballControls', OrbitControls: '/kernelspecs/r118/polymake/OrbitControls', Projector: '/kernelspecs/r118/polymake/Projector', SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer', WEBGL: '/kernelspecs/r118/polymake/WebGL', }, shim: { 'three': { exports: 'THREE'}, 'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' }, 'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' }, 'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' }, 'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' }, 'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' }, } }); require(['three'],function(THREE){ window.THREE = THREE; require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'], function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) { THREE.TrackballControls = TrackballControls; THREE.OrbitControls = OrbitControls; THREE.Projector = Projector; THREE.SVGRenderer = SVGRenderer; THREE.WEBGL = WEBGL; // COMMON_CODE_BLOCK_BEGIN const intervalLength = 25; // for automatic animations const explodableModel = true; const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false }; const foldables = []; var three = document.getElementById("model94916611057"); var scene = new THREE.Scene(); var renderer = new THREE.WebGLRenderer( { antialias: true } ); var svgRenderer = new THREE.SVGRenderer( { antialias: true } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setClearColor(0xFFFFFF, 1); svgRenderer.setClearColor(0xFFFFFF, 1); three.appendChild(renderer.domElement); var frustumSize = 4; var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()]; cameras.forEach(function(cam) { cam.position.set(0, 0, 5); cam.lookAt(0, 0, 0); cam.up.set(0, 1, 0); }); var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)]; var camera, control; controls[0].zoomSpeed = 0.2; controls[0].rotateSpeed = 4; // class to allow move points together with labels and spheres var PMPoint = function (x,y,z) { this.vector = new THREE.Vector3(x,y,z); this.sprite = null; this.sphere = null; } PMPoint.prototype.addLabel = function(labelsprite) { this.sprite = labelsprite; this.sprite.position.copy(this.vector); } PMPoint.prototype.addSphere = function(spheremesh) { this.sphere = spheremesh; this.sphere.position.copy(this.vector); } PMPoint.prototype.set = function(x,y,z) { this.vector.set(x,y,z); if (this.sprite) { this.sprite.position.copy(this.vector); } if (this.sphere) { this.sphere.position.copy(this.vector); } } PMPoint.prototype.radius = function() { if (this.sphere) { return this.sphere.geometry.parameters.radius; } else { return 0; } }; // select the target node var target = document.querySelector('#model94916611057'); // create an observer instance var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.removedNodes && mutation.removedNodes.length > 0) { cancelAnimationFrame(renderId); observer.disconnect(); console.log("cancelled frame "+renderId); } }); }); // configuration of the observer: var config = { childList: true, characterData: true } // pass in the target node, as well as the observer options while (target) { if (target.className=="output") { observer.observe(target, config); break; } target = target.parentNode; } // COMMON_CODE_BLOCK_END var obj0 = new THREE.Object3D(); obj0.name = "unnamed__1"; obj0.userData.explodable = 1; obj0.userData.points = []; obj0.userData.points.push(new PMPoint(-1, 0, 0.5)); obj0.userData.points.push(new PMPoint(1, 0, 0.5)); obj0.userData.points.push(new PMPoint(0, 1, 0.125)); obj0.userData.pointradii = 0.02; <!-- Vertex style --> obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj0.userData.pointlabels = ["0", "1", "2"]; obj0.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj0.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj0.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj0); scene.add(obj0); var obj1 = new THREE.Object3D(); obj1.name = "unnamed__2"; obj1.userData.explodable = 1; obj1.userData.points = []; obj1.userData.points.push(new PMPoint(-1, 0, 0.5)); obj1.userData.points.push(new PMPoint(1, 0, 0.5)); obj1.userData.points.push(new PMPoint(0, -1, 0.125)); obj1.userData.pointradii = 0.02; <!-- Vertex style --> obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj1.userData.pointlabels = ["0", "1", "3"]; obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj1.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj1.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj1); scene.add(obj1); var obj2 = new THREE.Object3D(); obj2.name = "unnamed__3"; obj2.userData.explodable = 1; obj2.userData.points = []; obj2.userData.points.push(new PMPoint(1, 0, 0.5)); obj2.userData.points.push(new PMPoint(0, 1, 0.125)); obj2.userData.points.push(new PMPoint(0.6, 0.8, 0.02)); obj2.userData.pointradii = 0.02; <!-- Vertex style --> obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj2.userData.pointlabels = ["1", "2", "4"]; obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj2.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj2); scene.add(obj2); var obj3 = new THREE.Object3D(); obj3.name = "unnamed__4"; obj3.userData.explodable = 1; obj3.userData.points = []; obj3.userData.points.push(new PMPoint(-1, 0, 0.5)); obj3.userData.points.push(new PMPoint(0, 1, 0.125)); obj3.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj3.userData.pointradii = 0.02; <!-- Vertex style --> obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj3.userData.pointlabels = ["0", "2", "5"]; obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj3.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj3.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj3); scene.add(obj3); var obj4 = new THREE.Object3D(); obj4.name = "unnamed__5"; obj4.userData.explodable = 1; obj4.userData.points = []; obj4.userData.points.push(new PMPoint(-1, 0, 0.5)); obj4.userData.points.push(new PMPoint(0, -1, 0.125)); obj4.userData.points.push(new PMPoint(-0.6, -0.8, 0.02)); obj4.userData.pointradii = 0.02; <!-- Vertex style --> obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj4.userData.pointlabels = ["0", "3", "6"]; obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj4.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj4.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj4); scene.add(obj4); var obj5 = new THREE.Object3D(); obj5.name = "unnamed__6"; obj5.userData.explodable = 1; obj5.userData.points = []; obj5.userData.points.push(new PMPoint(1, 0, 0.5)); obj5.userData.points.push(new PMPoint(0, -1, 0.125)); obj5.userData.points.push(new PMPoint(0.6, -0.8, 0.02)); obj5.userData.pointradii = 0.02; <!-- Vertex style --> obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj5.userData.pointlabels = ["1", "3", "7"]; obj5.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj5.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj5); scene.add(obj5); var obj6 = new THREE.Object3D(); obj6.name = "unnamed__7"; obj6.userData.explodable = 1; obj6.userData.points = []; obj6.userData.points.push(new PMPoint(1, 0, 0.5)); obj6.userData.points.push(new PMPoint(0.6, 0.8, 0.02)); obj6.userData.points.push(new PMPoint(0.8, 0.6, 0.005)); obj6.userData.pointradii = 0.02; <!-- Vertex style --> obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj6.userData.pointlabels = ["1", "4", "8"]; obj6.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj6.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj6); scene.add(obj6); var obj7 = new THREE.Object3D(); obj7.name = "unnamed__8"; obj7.userData.explodable = 1; obj7.userData.points = []; obj7.userData.points.push(new PMPoint(0, 1, 0.125)); obj7.userData.points.push(new PMPoint(0.6, 0.8, 0.02)); obj7.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858)); obj7.userData.pointradii = 0.02; <!-- Vertex style --> obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj7.userData.pointlabels = ["2", "4", "9"]; obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj7.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj7.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj7); scene.add(obj7); var obj8 = new THREE.Object3D(); obj8.name = "unnamed__9"; obj8.userData.explodable = 1; obj8.userData.points = []; obj8.userData.points.push(new PMPoint(0, 1, 0.125)); obj8.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj8.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858)); obj8.userData.pointradii = 0.02; <!-- Vertex style --> obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj8.userData.pointlabels = ["2", "5", "10"]; obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj8.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj8.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj8); scene.add(obj8); var obj9 = new THREE.Object3D(); obj9.name = "unnamed__10"; obj9.userData.explodable = 1; obj9.userData.points = []; obj9.userData.points.push(new PMPoint(-1, 0, 0.5)); obj9.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj9.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj9.userData.pointradii = 0.02; <!-- Vertex style --> obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj9.userData.pointlabels = ["0", "5", "11"]; obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj9.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj9.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj9); scene.add(obj9); var obj10 = new THREE.Object3D(); obj10.name = "unnamed__11"; obj10.userData.explodable = 1; obj10.userData.points = []; obj10.userData.points.push(new PMPoint(-1, 0, 0.5)); obj10.userData.points.push(new PMPoint(-0.6, -0.8, 0.02)); obj10.userData.points.push(new PMPoint(-0.8, -0.6, 0.005)); obj10.userData.pointradii = 0.02; <!-- Vertex style --> obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj10.userData.pointlabels = ["0", "6", "12"]; obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj10.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj10.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj10); scene.add(obj10); var obj11 = new THREE.Object3D(); obj11.name = "unnamed__12"; obj11.userData.explodable = 1; obj11.userData.points = []; obj11.userData.points.push(new PMPoint(0, -1, 0.125)); obj11.userData.points.push(new PMPoint(-0.6, -0.8, 0.02)); obj11.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858)); obj11.userData.pointradii = 0.02; <!-- Vertex style --> obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj11.userData.pointlabels = ["3", "6", "13"]; obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj11.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj11); scene.add(obj11); var obj12 = new THREE.Object3D(); obj12.name = "unnamed__13"; obj12.userData.explodable = 1; obj12.userData.points = []; obj12.userData.points.push(new PMPoint(0, -1, 0.125)); obj12.userData.points.push(new PMPoint(0.6, -0.8, 0.02)); obj12.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858)); obj12.userData.pointradii = 0.02; <!-- Vertex style --> obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj12.userData.pointlabels = ["3", "7", "14"]; obj12.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj12.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj12); scene.add(obj12); var obj13 = new THREE.Object3D(); obj13.name = "unnamed__14"; obj13.userData.explodable = 1; obj13.userData.points = []; obj13.userData.points.push(new PMPoint(1, 0, 0.5)); obj13.userData.points.push(new PMPoint(0.6, -0.8, 0.02)); obj13.userData.points.push(new PMPoint(0.8, -0.6, 0.005)); obj13.userData.pointradii = 0.02; <!-- Vertex style --> obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj13.userData.pointlabels = ["1", "7", "15"]; obj13.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj13.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj13); scene.add(obj13); var obj14 = new THREE.Object3D(); obj14.name = "unnamed__15"; obj14.userData.explodable = 1; obj14.userData.points = []; obj14.userData.points.push(new PMPoint(1, 0, 0.5)); obj14.userData.points.push(new PMPoint(0.8, 0.6, 0.005)); obj14.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301)); obj14.userData.pointradii = 0.02; <!-- Vertex style --> obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj14.userData.pointlabels = ["1", "8", "16"]; obj14.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj14.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj14); scene.add(obj14); var obj15 = new THREE.Object3D(); obj15.name = "unnamed__16"; obj15.userData.explodable = 1; obj15.userData.points = []; obj15.userData.points.push(new PMPoint(0.6, 0.8, 0.02)); obj15.userData.points.push(new PMPoint(0.8, 0.6, 0.005)); obj15.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453)); obj15.userData.pointradii = 0.02; <!-- Vertex style --> obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj15.userData.pointlabels = ["4", "8", "17"]; obj15.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj15.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj15.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj15); scene.add(obj15); var obj16 = new THREE.Object3D(); obj16.name = "unnamed__17"; obj16.userData.explodable = 1; obj16.userData.points = []; obj16.userData.points.push(new PMPoint(0.6, 0.8, 0.02)); obj16.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858)); obj16.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526)); obj16.userData.pointradii = 0.02; <!-- Vertex style --> obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj16.userData.pointlabels = ["4", "9", "18"]; obj16.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj16.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj16.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj16); scene.add(obj16); var obj17 = new THREE.Object3D(); obj17.name = "unnamed__18"; obj17.userData.explodable = 1; obj17.userData.points = []; obj17.userData.points.push(new PMPoint(0, 1, 0.125)); obj17.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858)); obj17.userData.points.push(new PMPoint(0.28, 0.96, 0.0008)); obj17.userData.pointradii = 0.02; <!-- Vertex style --> obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj17.userData.pointlabels = ["2", "9", "19"]; obj17.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj17.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj17.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj17); scene.add(obj17); var obj18 = new THREE.Object3D(); obj18.name = "unnamed__19"; obj18.userData.explodable = 1; obj18.userData.points = []; obj18.userData.points.push(new PMPoint(0, 1, 0.125)); obj18.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858)); obj18.userData.points.push(new PMPoint(-0.28, 0.96, 0.0008)); obj18.userData.pointradii = 0.02; <!-- Vertex style --> obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj18.userData.pointlabels = ["2", "10", "20"]; obj18.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj18.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj18.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj18); scene.add(obj18); var obj19 = new THREE.Object3D(); obj19.name = "unnamed__20"; obj19.userData.explodable = 1; obj19.userData.points = []; obj19.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj19.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858)); obj19.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526)); obj19.userData.pointradii = 0.02; <!-- Vertex style --> obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj19.userData.pointlabels = ["5", "10", "21"]; obj19.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj19.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj19.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj19); scene.add(obj19); var obj20 = new THREE.Object3D(); obj20.name = "unnamed__21"; obj20.userData.explodable = 1; obj20.userData.points = []; obj20.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj20.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj20.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453)); obj20.userData.pointradii = 0.02; <!-- Vertex style --> obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj20.userData.pointlabels = ["5", "11", "22"]; obj20.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj20.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj20.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj20); scene.add(obj20); var obj21 = new THREE.Object3D(); obj21.name = "unnamed__22"; obj21.userData.explodable = 1; obj21.userData.points = []; obj21.userData.points.push(new PMPoint(-1, 0, 0.5)); obj21.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj21.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301)); obj21.userData.pointradii = 0.02; <!-- Vertex style --> obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj21.userData.pointlabels = ["0", "11", "23"]; obj21.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj21.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj21.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj21); scene.add(obj21); var obj22 = new THREE.Object3D(); obj22.name = "unnamed__23"; obj22.userData.explodable = 1; obj22.userData.points = []; obj22.userData.points.push(new PMPoint(-1, 0, 0.5)); obj22.userData.points.push(new PMPoint(-0.8, -0.6, 0.005)); obj22.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301)); obj22.userData.pointradii = 0.02; <!-- Vertex style --> obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj22.userData.pointlabels = ["0", "12", "24"]; obj22.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj22.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj22.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj22); scene.add(obj22); var obj23 = new THREE.Object3D(); obj23.name = "unnamed__24"; obj23.userData.explodable = 1; obj23.userData.points = []; obj23.userData.points.push(new PMPoint(-0.6, -0.8, 0.02)); obj23.userData.points.push(new PMPoint(-0.8, -0.6, 0.005)); obj23.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453)); obj23.userData.pointradii = 0.02; <!-- Vertex style --> obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj23.userData.pointlabels = ["6", "12", "25"]; obj23.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj23.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj23); scene.add(obj23); var obj24 = new THREE.Object3D(); obj24.name = "unnamed__25"; obj24.userData.explodable = 1; obj24.userData.points = []; obj24.userData.points.push(new PMPoint(-0.6, -0.8, 0.02)); obj24.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858)); obj24.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526)); obj24.userData.pointradii = 0.02; <!-- Vertex style --> obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj24.userData.pointlabels = ["6", "13", "26"]; obj24.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj24.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj24.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj24); scene.add(obj24); var obj25 = new THREE.Object3D(); obj25.name = "unnamed__26"; obj25.userData.explodable = 1; obj25.userData.points = []; obj25.userData.points.push(new PMPoint(0, -1, 0.125)); obj25.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858)); obj25.userData.points.push(new PMPoint(-0.28, -0.96, 0.0008)); obj25.userData.pointradii = 0.02; <!-- Vertex style --> obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj25.userData.pointlabels = ["3", "13", "27"]; obj25.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj25.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj25.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj25); scene.add(obj25); var obj26 = new THREE.Object3D(); obj26.name = "unnamed__27"; obj26.userData.explodable = 1; obj26.userData.points = []; obj26.userData.points.push(new PMPoint(0, -1, 0.125)); obj26.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858)); obj26.userData.points.push(new PMPoint(0.28, -0.96, 0.0008)); obj26.userData.pointradii = 0.02; <!-- Vertex style --> obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj26.userData.pointlabels = ["3", "14", "28"]; obj26.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj26.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj26.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj26); scene.add(obj26); var obj27 = new THREE.Object3D(); obj27.name = "unnamed__28"; obj27.userData.explodable = 1; obj27.userData.points = []; obj27.userData.points.push(new PMPoint(0.6, -0.8, 0.02)); obj27.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858)); obj27.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526)); obj27.userData.pointradii = 0.02; <!-- Vertex style --> obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj27.userData.pointlabels = ["7", "14", "29"]; obj27.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj27.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj27.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj27); scene.add(obj27); var obj28 = new THREE.Object3D(); obj28.name = "unnamed__29"; obj28.userData.explodable = 1; obj28.userData.points = []; obj28.userData.points.push(new PMPoint(0.6, -0.8, 0.02)); obj28.userData.points.push(new PMPoint(0.8, -0.6, 0.005)); obj28.userData.points.push(new PMPoint(0.724138, -0.689655, 0.00059453)); obj28.userData.pointradii = 0.02; <!-- Vertex style --> obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj28.userData.pointlabels = ["7", "15", "30"]; obj28.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj28.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj28.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj28); scene.add(obj28); var obj29 = new THREE.Object3D(); obj29.name = "unnamed__30"; obj29.userData.explodable = 1; obj29.userData.points = []; obj29.userData.points.push(new PMPoint(1, 0, 0.5)); obj29.userData.points.push(new PMPoint(0.8, -0.6, 0.005)); obj29.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301)); obj29.userData.pointradii = 0.02; <!-- Vertex style --> obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj29.userData.pointlabels = ["1", "15", "31"]; obj29.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj29.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj29.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj29); scene.add(obj29); var obj30 = new THREE.Object3D(); obj30.name = "unnamed__31"; obj30.userData.explodable = 1; obj30.userData.points = []; obj30.userData.points.push(new PMPoint(1, 0, 0.5)); obj30.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301)); obj30.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645)); obj30.userData.pointradii = 0.02; <!-- Vertex style --> obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj30.userData.pointlabels = ["1", "16", "32"]; obj30.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj30.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj30.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj30); scene.add(obj30); var obj31 = new THREE.Object3D(); obj31.name = "unnamed__32"; obj31.userData.explodable = 1; obj31.userData.points = []; obj31.userData.points.push(new PMPoint(0.8, 0.6, 0.005)); obj31.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301)); obj31.userData.points.push(new PMPoint(0.849057, 0.528302, 0.000177999)); obj31.userData.pointradii = 0.02; <!-- Vertex style --> obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj31.userData.pointlabels = ["8", "16", "33"]; obj31.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj31.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj31.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj31); scene.add(obj31); var obj32 = new THREE.Object3D(); obj32.name = "unnamed__33"; obj32.userData.explodable = 1; obj32.userData.points = []; obj32.userData.points.push(new PMPoint(0.8, 0.6, 0.005)); obj32.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453)); obj32.userData.points.push(new PMPoint(0.753425, 0.657534, 9.38262e-05)); obj32.userData.pointradii = 0.02; <!-- Vertex style --> obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj32.userData.pointlabels = ["8", "17", "34"]; obj32.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj32.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj32.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj32); scene.add(obj32); var obj33 = new THREE.Object3D(); obj33.name = "unnamed__34"; obj33.userData.explodable = 1; obj33.userData.points = []; obj33.userData.points.push(new PMPoint(0.6, 0.8, 0.02)); obj33.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453)); obj33.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633)); obj33.userData.pointradii = 0.02; <!-- Vertex style --> obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj33.userData.pointlabels = ["4", "17", "35"]; obj33.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj33.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj33.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj33); scene.add(obj33); var obj34 = new THREE.Object3D(); obj34.name = "unnamed__35"; obj34.userData.explodable = 1; obj34.userData.points = []; obj34.userData.points.push(new PMPoint(0.6, 0.8, 0.02)); obj34.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526)); obj34.userData.points.push(new PMPoint(0.507692, 0.861538, 0.000118343)); obj34.userData.pointradii = 0.02; <!-- Vertex style --> obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj34.userData.pointlabels = ["4", "18", "36"]; obj34.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj34.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj34.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj34); scene.add(obj34); var obj35 = new THREE.Object3D(); obj35.name = "unnamed__36"; obj35.userData.explodable = 1; obj35.userData.points = []; obj35.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858)); obj35.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526)); obj35.userData.points.push(new PMPoint(0.438202, 0.898876, 6.31233e-05)); obj35.userData.pointradii = 0.02; <!-- Vertex style --> obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj35.userData.pointlabels = ["9", "18", "37"]; obj35.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj35.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj35.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj35); scene.add(obj35); var obj36 = new THREE.Object3D(); obj36.name = "unnamed__37"; obj36.userData.explodable = 1; obj36.userData.points = []; obj36.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858)); obj36.userData.points.push(new PMPoint(0.28, 0.96, 0.0008)); obj36.userData.points.push(new PMPoint(0.324324, 0.945946, 9.13075e-05)); obj36.userData.pointradii = 0.02; <!-- Vertex style --> obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj36.userData.pointlabels = ["9", "19", "38"]; obj36.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj36.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj36.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj36); scene.add(obj36); var obj37 = new THREE.Object3D(); obj37.name = "unnamed__38"; obj37.userData.explodable = 1; obj37.userData.points = []; obj37.userData.points.push(new PMPoint(0, 1, 0.125)); obj37.userData.points.push(new PMPoint(0.28, 0.96, 0.0008)); obj37.userData.points.push(new PMPoint(0.219512, 0.97561, 0.000297442)); obj37.userData.pointradii = 0.02; <!-- Vertex style --> obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj37.userData.pointlabels = ["2", "19", "39"]; obj37.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj37.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj37.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj37); scene.add(obj37); var obj38 = new THREE.Object3D(); obj38.name = "unnamed__39"; obj38.userData.explodable = 1; obj38.userData.points = []; obj38.userData.points.push(new PMPoint(0, 1, 0.125)); obj38.userData.points.push(new PMPoint(-0.28, 0.96, 0.0008)); obj38.userData.points.push(new PMPoint(-0.219512, 0.97561, 0.000297442)); obj38.userData.pointradii = 0.02; <!-- Vertex style --> obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj38.userData.pointlabels = ["2", "20", "40"]; obj38.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj38.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj38.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj38); scene.add(obj38); var obj39 = new THREE.Object3D(); obj39.name = "unnamed__40"; obj39.userData.explodable = 1; obj39.userData.points = []; obj39.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858)); obj39.userData.points.push(new PMPoint(-0.28, 0.96, 0.0008)); obj39.userData.points.push(new PMPoint(-0.324324, 0.945946, 9.13075e-05)); obj39.userData.pointradii = 0.02; <!-- Vertex style --> obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj39.userData.pointlabels = ["10", "20", "41"]; obj39.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj39.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj39.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj39); scene.add(obj39); var obj40 = new THREE.Object3D(); obj40.name = "unnamed__41"; obj40.userData.explodable = 1; obj40.userData.points = []; obj40.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858)); obj40.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526)); obj40.userData.points.push(new PMPoint(-0.438202, 0.898876, 6.31233e-05)); obj40.userData.pointradii = 0.02; <!-- Vertex style --> obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj40.userData.pointlabels = ["10", "21", "42"]; obj40.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj40.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj40.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj40); scene.add(obj40); var obj41 = new THREE.Object3D(); obj41.name = "unnamed__42"; obj41.userData.explodable = 1; obj41.userData.points = []; obj41.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj41.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526)); obj41.userData.points.push(new PMPoint(-0.507692, 0.861538, 0.000118343)); obj41.userData.pointradii = 0.02; <!-- Vertex style --> obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj41.userData.pointlabels = ["5", "21", "43"]; obj41.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj41.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj41.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj41); scene.add(obj41); var obj42 = new THREE.Object3D(); obj42.name = "unnamed__43"; obj42.userData.explodable = 1; obj42.userData.points = []; obj42.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj42.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453)); obj42.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633)); obj42.userData.pointradii = 0.02; <!-- Vertex style --> obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj42.userData.pointlabels = ["5", "22", "44"]; obj42.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj42.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj42.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj42); scene.add(obj42); var obj43 = new THREE.Object3D(); obj43.name = "unnamed__44"; obj43.userData.explodable = 1; obj43.userData.points = []; obj43.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj43.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453)); obj43.userData.points.push(new PMPoint(-0.753425, 0.657534, 9.38262e-05)); obj43.userData.pointradii = 0.02; <!-- Vertex style --> obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj43.userData.pointlabels = ["11", "22", "45"]; obj43.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj43.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj43.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj43); scene.add(obj43); var obj44 = new THREE.Object3D(); obj44.name = "unnamed__45"; obj44.userData.explodable = 1; obj44.userData.points = []; obj44.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj44.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301)); obj44.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.000177999)); obj44.userData.pointradii = 0.02; <!-- Vertex style --> obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj44.userData.pointlabels = ["11", "23", "46"]; obj44.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj44.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj44.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj44); scene.add(obj44); var obj45 = new THREE.Object3D(); obj45.name = "unnamed__46"; obj45.userData.explodable = 1; obj45.userData.points = []; obj45.userData.points.push(new PMPoint(-1, 0, 0.5)); obj45.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301)); obj45.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645)); obj45.userData.pointradii = 0.02; <!-- Vertex style --> obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj45.userData.pointlabels = ["0", "23", "47"]; obj45.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj45.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj45.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj45); scene.add(obj45); var obj46 = new THREE.Object3D(); obj46.name = "unnamed__47"; obj46.userData.explodable = 1; obj46.userData.points = []; obj46.userData.points.push(new PMPoint(-1, 0, 0.5)); obj46.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301)); obj46.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645)); obj46.userData.pointradii = 0.02; <!-- Vertex style --> obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj46.userData.pointlabels = ["0", "24", "48"]; obj46.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj46.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj46.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj46); scene.add(obj46); var obj47 = new THREE.Object3D(); obj47.name = "unnamed__48"; obj47.userData.explodable = 1; obj47.userData.points = []; obj47.userData.points.push(new PMPoint(-0.8, -0.6, 0.005)); obj47.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301)); obj47.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.000177999)); obj47.userData.pointradii = 0.02; <!-- Vertex style --> obj47.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj47.userData.pointlabels = ["12", "24", "49"]; obj47.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj47.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj47.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj47.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj47); scene.add(obj47); var obj48 = new THREE.Object3D(); obj48.name = "unnamed__49"; obj48.userData.explodable = 1; obj48.userData.points = []; obj48.userData.points.push(new PMPoint(-0.8, -0.6, 0.005)); obj48.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453)); obj48.userData.points.push(new PMPoint(-0.753425, -0.657534, 9.38262e-05)); obj48.userData.pointradii = 0.02; <!-- Vertex style --> obj48.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj48.userData.pointlabels = ["12", "25", "50"]; obj48.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj48.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj48.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj48.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj48); scene.add(obj48); var obj49 = new THREE.Object3D(); obj49.name = "unnamed__50"; obj49.userData.explodable = 1; obj49.userData.points = []; obj49.userData.points.push(new PMPoint(-0.6, -0.8, 0.02)); obj49.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453)); obj49.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633)); obj49.userData.pointradii = 0.02; <!-- Vertex style --> obj49.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj49.userData.pointlabels = ["6", "25", "51"]; obj49.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj49.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj49.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj49.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj49); scene.add(obj49); var obj50 = new THREE.Object3D(); obj50.name = "unnamed__51"; obj50.userData.explodable = 1; obj50.userData.points = []; obj50.userData.points.push(new PMPoint(-0.6, -0.8, 0.02)); obj50.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526)); obj50.userData.points.push(new PMPoint(-0.507692, -0.861538, 0.000118343)); obj50.userData.pointradii = 0.02; <!-- Vertex style --> obj50.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj50.userData.pointlabels = ["6", "26", "52"]; obj50.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj50.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj50.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj50.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj50); scene.add(obj50); var obj51 = new THREE.Object3D(); obj51.name = "unnamed__52"; obj51.userData.explodable = 1; obj51.userData.points = []; obj51.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858)); obj51.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526)); obj51.userData.points.push(new PMPoint(-0.438202, -0.898876, 6.31233e-05)); obj51.userData.pointradii = 0.02; <!-- Vertex style --> obj51.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj51.userData.pointlabels = ["13", "26", "53"]; obj51.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj51.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj51.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj51.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj51); scene.add(obj51); var obj52 = new THREE.Object3D(); obj52.name = "unnamed__53"; obj52.userData.explodable = 1; obj52.userData.points = []; obj52.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858)); obj52.userData.points.push(new PMPoint(-0.28, -0.96, 0.0008)); obj52.userData.points.push(new PMPoint(-0.324324, -0.945946, 9.13075e-05)); obj52.userData.pointradii = 0.02; <!-- Vertex style --> obj52.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj52.userData.pointlabels = ["13", "27", "54"]; obj52.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj52.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj52.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj52.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj52); scene.add(obj52); var obj53 = new THREE.Object3D(); obj53.name = "unnamed__54"; obj53.userData.explodable = 1; obj53.userData.points = []; obj53.userData.points.push(new PMPoint(0, -1, 0.125)); obj53.userData.points.push(new PMPoint(-0.28, -0.96, 0.0008)); obj53.userData.points.push(new PMPoint(-0.219512, -0.97561, 0.000297442)); obj53.userData.pointradii = 0.02; <!-- Vertex style --> obj53.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj53.userData.pointlabels = ["3", "27", "55"]; obj53.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj53.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj53.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj53.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj53); scene.add(obj53); var obj54 = new THREE.Object3D(); obj54.name = "unnamed__55"; obj54.userData.explodable = 1; obj54.userData.points = []; obj54.userData.points.push(new PMPoint(0, -1, 0.125)); obj54.userData.points.push(new PMPoint(0.28, -0.96, 0.0008)); obj54.userData.points.push(new PMPoint(0.219512, -0.97561, 0.000297442)); obj54.userData.pointradii = 0.02; <!-- Vertex style --> obj54.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj54.userData.pointlabels = ["3", "28", "56"]; obj54.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj54.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj54.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj54.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj54); scene.add(obj54); var obj55 = new THREE.Object3D(); obj55.name = "unnamed__56"; obj55.userData.explodable = 1; obj55.userData.points = []; obj55.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858)); obj55.userData.points.push(new PMPoint(0.28, -0.96, 0.0008)); obj55.userData.points.push(new PMPoint(0.324324, -0.945946, 9.13075e-05)); obj55.userData.pointradii = 0.02; <!-- Vertex style --> obj55.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj55.userData.pointlabels = ["14", "28", "57"]; obj55.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj55.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj55.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj55.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj55); scene.add(obj55); var obj56 = new THREE.Object3D(); obj56.name = "unnamed__57"; obj56.userData.explodable = 1; obj56.userData.points = []; obj56.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858)); obj56.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526)); obj56.userData.points.push(new PMPoint(0.438202, -0.898876, 6.31233e-05)); obj56.userData.pointradii = 0.02; <!-- Vertex style --> obj56.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj56.userData.pointlabels = ["14", "29", "58"]; obj56.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj56.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj56.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj56.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj56); scene.add(obj56); var obj57 = new THREE.Object3D(); obj57.name = "unnamed__58"; obj57.userData.explodable = 1; obj57.userData.points = []; obj57.userData.points.push(new PMPoint(0.6, -0.8, 0.02)); obj57.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526)); obj57.userData.points.push(new PMPoint(0.507692, -0.861538, 0.000118343)); obj57.userData.pointradii = 0.02; <!-- Vertex style --> obj57.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj57.userData.pointlabels = ["7", "29", "59"]; obj57.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj57.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj57.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj57.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj57); scene.add(obj57); var obj58 = new THREE.Object3D(); obj58.name = "unnamed__59"; obj58.userData.explodable = 1; obj58.userData.points = []; obj58.userData.points.push(new PMPoint(0.6, -0.8, 0.02)); obj58.userData.points.push(new PMPoint(0.724138, -0.689655, 0.00059453)); obj58.userData.points.push(new PMPoint(0.689655, -0.724138, 0.000148633)); obj58.userData.pointradii = 0.02; <!-- Vertex style --> obj58.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj58.userData.pointlabels = ["7", "30", "60"]; obj58.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj58.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj58.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj58.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj58); scene.add(obj58); var obj59 = new THREE.Object3D(); obj59.name = "unnamed__60"; obj59.userData.explodable = 1; obj59.userData.points = []; obj59.userData.points.push(new PMPoint(0.8, -0.6, 0.005)); obj59.userData.points.push(new PMPoint(0.724138, -0.689655, 0.00059453)); obj59.userData.points.push(new PMPoint(0.753425, -0.657534, 9.38262e-05)); obj59.userData.pointradii = 0.02; <!-- Vertex style --> obj59.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj59.userData.pointlabels = ["15", "30", "61"]; obj59.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj59.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj59.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj59.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj59); scene.add(obj59); var obj60 = new THREE.Object3D(); obj60.name = "unnamed__61"; obj60.userData.explodable = 1; obj60.userData.points = []; obj60.userData.points.push(new PMPoint(0.8, -0.6, 0.005)); obj60.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301)); obj60.userData.points.push(new PMPoint(0.849057, -0.528302, 0.000177999)); obj60.userData.pointradii = 0.02; <!-- Vertex style --> obj60.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj60.userData.pointlabels = ["15", "31", "62"]; obj60.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj60.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj60.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj60.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj60); scene.add(obj60); var obj61 = new THREE.Object3D(); obj61.name = "unnamed__62"; obj61.userData.explodable = 1; obj61.userData.points = []; obj61.userData.points.push(new PMPoint(1, 0, 0.5)); obj61.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301)); obj61.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645)); obj61.userData.pointradii = 0.02; <!-- Vertex style --> obj61.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj61.userData.pointlabels = ["1", "31", "63"]; obj61.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj61.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj61.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj61.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj61); scene.add(obj61); var obj62 = new THREE.Object3D(); obj62.name = "unnamed__63"; obj62.userData.explodable = 1; obj62.userData.points = []; obj62.userData.points.push(new PMPoint(1, 0, 0.5)); obj62.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645)); obj62.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00036523)); obj62.userData.pointradii = 0.02; <!-- Vertex style --> obj62.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj62.userData.pointlabels = ["1", "32", "64"]; obj62.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj62.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj62.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj62.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj62); scene.add(obj62); var obj63 = new THREE.Object3D(); obj63.name = "unnamed__64"; obj63.userData.explodable = 1; obj63.userData.points = []; obj63.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301)); obj63.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645)); obj63.userData.points.push(new PMPoint(0.905882, 0.423529, 6.92042e-05)); obj63.userData.pointradii = 0.02; <!-- Vertex style --> obj63.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj63.userData.pointlabels = ["16", "32", "65"]; obj63.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj63.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj63.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj63.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj63); scene.add(obj63); var obj64 = new THREE.Object3D(); obj64.name = "unnamed__65"; obj64.userData.explodable = 1; obj64.userData.points = []; obj64.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301)); obj64.userData.points.push(new PMPoint(0.849057, 0.528302, 0.000177999)); obj64.userData.points.push(new PMPoint(0.861538, 0.507692, 2.95858e-05)); obj64.userData.pointradii = 0.02; <!-- Vertex style --> obj64.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj64.userData.pointlabels = ["16", "33", "66"]; obj64.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj64.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj64.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj64.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj64); scene.add(obj64); var obj65 = new THREE.Object3D(); obj65.name = "unnamed__66"; obj65.userData.explodable = 1; obj65.userData.points = []; obj65.userData.points.push(new PMPoint(0.8, 0.6, 0.005)); obj65.userData.points.push(new PMPoint(0.849057, 0.528302, 0.000177999)); obj65.userData.points.push(new PMPoint(0.834862, 0.550459, 4.2084e-05)); obj65.userData.pointradii = 0.02; <!-- Vertex style --> obj65.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj65.userData.pointlabels = ["8", "33", "67"]; obj65.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj65.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj65.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj65.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj65); scene.add(obj65); var obj66 = new THREE.Object3D(); obj66.name = "unnamed__67"; obj66.userData.explodable = 1; obj66.userData.points = []; obj66.userData.points.push(new PMPoint(0.8, 0.6, 0.005)); obj66.userData.points.push(new PMPoint(0.753425, 0.657534, 9.38262e-05)); obj66.userData.points.push(new PMPoint(0.766423, 0.642336, 2.66397e-05)); obj66.userData.pointradii = 0.02; <!-- Vertex style --> obj66.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj66.userData.pointlabels = ["8", "34", "68"]; obj66.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj66.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj66.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj66.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj66); scene.add(obj66); var obj67 = new THREE.Object3D(); obj67.name = "unnamed__68"; obj67.userData.explodable = 1; obj67.userData.points = []; obj67.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453)); obj67.userData.points.push(new PMPoint(0.753425, 0.657534, 9.38262e-05)); obj67.userData.points.push(new PMPoint(0.742268, 0.670103, 1.32852e-05)); obj67.userData.pointradii = 0.02; <!-- Vertex style --> obj67.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj67.userData.pointlabels = ["17", "34", "69"]; obj67.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj67.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj67.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj67.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj67); scene.add(obj67); var obj68 = new THREE.Object3D(); obj68.name = "unnamed__69"; obj68.userData.explodable = 1; obj68.userData.points = []; obj68.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453)); obj68.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633)); obj68.userData.points.push(new PMPoint(0.704142, 0.710059, 1.75064e-05)); obj68.userData.pointradii = 0.02; <!-- Vertex style --> obj68.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj68.userData.pointlabels = ["17", "35", "70"]; obj68.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj68.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj68.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj68.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj68); scene.add(obj68); var obj69 = new THREE.Object3D(); obj69.name = "unnamed__70"; obj69.userData.explodable = 1; obj69.userData.points = []; obj69.userData.points.push(new PMPoint(0.6, 0.8, 0.02)); obj69.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633)); obj69.userData.points.push(new PMPoint(0.670103, 0.742268, 5.31406e-05)); obj69.userData.pointradii = 0.02; <!-- Vertex style --> obj69.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj69.userData.pointlabels = ["4", "35", "71"]; obj69.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj69.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj69.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj69.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj69); scene.add(obj69); var obj70 = new THREE.Object3D(); obj70.name = "unnamed__71"; obj70.userData.explodable = 1; obj70.userData.points = []; obj70.userData.points.push(new PMPoint(0.6, 0.8, 0.02)); obj70.userData.points.push(new PMPoint(0.507692, 0.861538, 0.000118343)); obj70.userData.points.push(new PMPoint(0.528302, 0.849057, 4.44998e-05)); obj70.userData.pointradii = 0.02; <!-- Vertex style --> obj70.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj70.userData.pointlabels = ["4", "36", "72"]; obj70.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj70.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj70.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj70.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj70); scene.add(obj70); var obj71 = new THREE.Object3D(); obj71.name = "unnamed__72"; obj71.userData.explodable = 1; obj71.userData.points = []; obj71.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526)); obj71.userData.points.push(new PMPoint(0.507692, 0.861538, 0.000118343)); obj71.userData.points.push(new PMPoint(0.492228, 0.870466, 1.34232e-05)); obj71.userData.pointradii = 0.02; <!-- Vertex style --> obj71.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj71.userData.pointlabels = ["18", "36", "73"]; obj71.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj71.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj71.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj71.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj71); scene.add(obj71); var obj72 = new THREE.Object3D(); obj72.name = "unnamed__73"; obj72.userData.explodable = 1; obj72.userData.points = []; obj72.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526)); obj72.userData.points.push(new PMPoint(0.438202, 0.898876, 6.31233e-05)); obj72.userData.points.push(new PMPoint(0.450644, 0.892704, 0)); obj72.userData.pointradii = 0.02; <!-- Vertex style --> obj72.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj72.userData.pointlabels = ["18", "37", "74"]; obj72.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj72.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj72.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj72.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj72); scene.add(obj72); var obj73 = new THREE.Object3D(); obj73.name = "unnamed__74"; obj73.userData.explodable = 1; obj73.userData.points = []; obj73.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858)); obj73.userData.points.push(new PMPoint(0.438202, 0.898876, 6.31233e-05)); obj73.userData.points.push(new PMPoint(0.423529, 0.905882, 1.7301e-05)); obj73.userData.pointradii = 0.02; <!-- Vertex style --> obj73.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj73.userData.pointlabels = ["9", "37", "75"]; obj73.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj73.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj73.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj73.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj73); scene.add(obj73); var obj74 = new THREE.Object3D(); obj74.name = "unnamed__75"; obj74.userData.explodable = 1; obj74.userData.points = []; obj74.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858)); obj74.userData.points.push(new PMPoint(0.324324, 0.945946, 9.13075e-05)); obj74.userData.points.push(new PMPoint(0.342282, 0.939597, 2.25215e-05)); obj74.userData.pointradii = 0.02; <!-- Vertex style --> obj74.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj74.userData.pointlabels = ["9", "38", "76"]; obj74.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj74.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj74.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj74.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj74); scene.add(obj74); var obj75 = new THREE.Object3D(); obj75.name = "unnamed__76"; obj75.userData.explodable = 1; obj75.userData.points = []; obj75.userData.points.push(new PMPoint(0.28, 0.96, 0.0008)); obj75.userData.points.push(new PMPoint(0.324324, 0.945946, 9.13075e-05)); obj75.userData.points.push(new PMPoint(0.308108, 0.951351, 1.46092e-05)); obj75.userData.pointradii = 0.02; <!-- Vertex style --> obj75.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj75.userData.pointlabels = ["19", "38", "77"]; obj75.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj75.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj75.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj75.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj75); scene.add(obj75); var obj76 = new THREE.Object3D(); obj76.name = "unnamed__77"; obj76.userData.explodable = 1; obj76.userData.points = []; obj76.userData.points.push(new PMPoint(0.28, 0.96, 0.0008)); obj76.userData.points.push(new PMPoint(0.219512, 0.97561, 0.000297442)); obj76.userData.points.push(new PMPoint(0.246154, 0.969231, 2.95858e-05)); obj76.userData.pointradii = 0.02; <!-- Vertex style --> obj76.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj76.userData.pointlabels = ["19", "39", "78"]; obj76.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj76.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj76.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj76.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj76); scene.add(obj76); var obj77 = new THREE.Object3D(); obj77.name = "unnamed__78"; obj77.userData.explodable = 1; obj77.userData.points = []; obj77.userData.points.push(new PMPoint(0, 1, 0.125)); obj77.userData.points.push(new PMPoint(0.219512, 0.97561, 0.000297442)); obj77.userData.points.push(new PMPoint(0.180328, 0.983607, 0.000134372)); obj77.userData.pointradii = 0.02; <!-- Vertex style --> obj77.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj77.userData.pointlabels = ["2", "39", "79"]; obj77.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj77.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj77.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj77.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj77); scene.add(obj77); var obj78 = new THREE.Object3D(); obj78.name = "unnamed__79"; obj78.userData.explodable = 1; obj78.userData.points = []; obj78.userData.points.push(new PMPoint(0, 1, 0.125)); obj78.userData.points.push(new PMPoint(-0.219512, 0.97561, 0.000297442)); obj78.userData.points.push(new PMPoint(-0.180328, 0.983607, 0.000134372)); obj78.userData.pointradii = 0.02; <!-- Vertex style --> obj78.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj78.userData.pointlabels = ["2", "40", "80"]; obj78.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj78.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj78.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj78.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj78); scene.add(obj78); var obj79 = new THREE.Object3D(); obj79.name = "unnamed__80"; obj79.userData.explodable = 1; obj79.userData.points = []; obj79.userData.points.push(new PMPoint(-0.28, 0.96, 0.0008)); obj79.userData.points.push(new PMPoint(-0.219512, 0.97561, 0.000297442)); obj79.userData.points.push(new PMPoint(-0.246154, 0.969231, 2.95858e-05)); obj79.userData.pointradii = 0.02; <!-- Vertex style --> obj79.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj79.userData.pointlabels = ["20", "40", "81"]; obj79.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj79.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj79.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj79.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj79); scene.add(obj79); var obj80 = new THREE.Object3D(); obj80.name = "unnamed__81"; obj80.userData.explodable = 1; obj80.userData.points = []; obj80.userData.points.push(new PMPoint(-0.28, 0.96, 0.0008)); obj80.userData.points.push(new PMPoint(-0.324324, 0.945946, 9.13075e-05)); obj80.userData.points.push(new PMPoint(-0.308108, 0.951351, 1.46092e-05)); obj80.userData.pointradii = 0.02; <!-- Vertex style --> obj80.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj80.userData.pointlabels = ["20", "41", "82"]; obj80.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj80.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj80.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj80.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj80); scene.add(obj80); var obj81 = new THREE.Object3D(); obj81.name = "unnamed__82"; obj81.userData.explodable = 1; obj81.userData.points = []; obj81.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858)); obj81.userData.points.push(new PMPoint(-0.324324, 0.945946, 9.13075e-05)); obj81.userData.points.push(new PMPoint(-0.342282, 0.939597, 2.25215e-05)); obj81.userData.pointradii = 0.02; <!-- Vertex style --> obj81.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj81.userData.pointlabels = ["10", "41", "83"]; obj81.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj81.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj81.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj81.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj81); scene.add(obj81); var obj82 = new THREE.Object3D(); obj82.name = "unnamed__83"; obj82.userData.explodable = 1; obj82.userData.points = []; obj82.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858)); obj82.userData.points.push(new PMPoint(-0.438202, 0.898876, 6.31233e-05)); obj82.userData.points.push(new PMPoint(-0.423529, 0.905882, 1.7301e-05)); obj82.userData.pointradii = 0.02; <!-- Vertex style --> obj82.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj82.userData.pointlabels = ["10", "42", "84"]; obj82.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj82.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj82.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj82.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj82); scene.add(obj82); var obj83 = new THREE.Object3D(); obj83.name = "unnamed__84"; obj83.userData.explodable = 1; obj83.userData.points = []; obj83.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526)); obj83.userData.points.push(new PMPoint(-0.438202, 0.898876, 6.31233e-05)); obj83.userData.points.push(new PMPoint(-0.450644, 0.892704, 0)); obj83.userData.pointradii = 0.02; <!-- Vertex style --> obj83.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj83.userData.pointlabels = ["21", "42", "85"]; obj83.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj83.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj83.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj83.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj83); scene.add(obj83); var obj84 = new THREE.Object3D(); obj84.name = "unnamed__85"; obj84.userData.explodable = 1; obj84.userData.points = []; obj84.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526)); obj84.userData.points.push(new PMPoint(-0.507692, 0.861538, 0.000118343)); obj84.userData.points.push(new PMPoint(-0.492228, 0.870466, 1.34232e-05)); obj84.userData.pointradii = 0.02; <!-- Vertex style --> obj84.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj84.userData.pointlabels = ["21", "43", "86"]; obj84.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj84.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj84.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj84.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj84); scene.add(obj84); var obj85 = new THREE.Object3D(); obj85.name = "unnamed__86"; obj85.userData.explodable = 1; obj85.userData.points = []; obj85.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj85.userData.points.push(new PMPoint(-0.507692, 0.861538, 0.000118343)); obj85.userData.points.push(new PMPoint(-0.528302, 0.849057, 4.44998e-05)); obj85.userData.pointradii = 0.02; <!-- Vertex style --> obj85.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj85.userData.pointlabels = ["5", "43", "87"]; obj85.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj85.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj85.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj85.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj85); scene.add(obj85); var obj86 = new THREE.Object3D(); obj86.name = "unnamed__87"; obj86.userData.explodable = 1; obj86.userData.points = []; obj86.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj86.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633)); obj86.userData.points.push(new PMPoint(-0.670103, 0.742268, 5.31406e-05)); obj86.userData.pointradii = 0.02; <!-- Vertex style --> obj86.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj86.userData.pointlabels = ["5", "44", "88"]; obj86.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj86.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj86.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj86.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj86); scene.add(obj86); var obj87 = new THREE.Object3D(); obj87.name = "unnamed__88"; obj87.userData.explodable = 1; obj87.userData.points = []; obj87.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453)); obj87.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633)); obj87.userData.points.push(new PMPoint(-0.704142, 0.710059, 1.75064e-05)); obj87.userData.pointradii = 0.02; <!-- Vertex style --> obj87.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj87.userData.pointlabels = ["22", "44", "89"]; obj87.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj87.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj87.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj87.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj87); scene.add(obj87); var obj88 = new THREE.Object3D(); obj88.name = "unnamed__89"; obj88.userData.explodable = 1; obj88.userData.points = []; obj88.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453)); obj88.userData.points.push(new PMPoint(-0.753425, 0.657534, 9.38262e-05)); obj88.userData.points.push(new PMPoint(-0.742268, 0.670103, 1.32852e-05)); obj88.userData.pointradii = 0.02; <!-- Vertex style --> obj88.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj88.userData.pointlabels = ["22", "45", "90"]; obj88.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj88.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj88.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj88.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj88); scene.add(obj88); var obj89 = new THREE.Object3D(); obj89.name = "unnamed__90"; obj89.userData.explodable = 1; obj89.userData.points = []; obj89.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj89.userData.points.push(new PMPoint(-0.753425, 0.657534, 9.38262e-05)); obj89.userData.points.push(new PMPoint(-0.766423, 0.642336, 2.66397e-05)); obj89.userData.pointradii = 0.02; <!-- Vertex style --> obj89.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj89.userData.pointlabels = ["11", "45", "91"]; obj89.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj89.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj89.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj89.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj89); scene.add(obj89); var obj90 = new THREE.Object3D(); obj90.name = "unnamed__91"; obj90.userData.explodable = 1; obj90.userData.points = []; obj90.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj90.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.000177999)); obj90.userData.points.push(new PMPoint(-0.834862, 0.550459, 4.2084e-05)); obj90.userData.pointradii = 0.02; <!-- Vertex style --> obj90.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj90.userData.pointlabels = ["11", "46", "92"]; obj90.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj90.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj90.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj90.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj90); scene.add(obj90); var obj91 = new THREE.Object3D(); obj91.name = "unnamed__92"; obj91.userData.explodable = 1; obj91.userData.points = []; obj91.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301)); obj91.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.000177999)); obj91.userData.points.push(new PMPoint(-0.861538, 0.507692, 2.95858e-05)); obj91.userData.pointradii = 0.02; <!-- Vertex style --> obj91.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj91.userData.pointlabels = ["23", "46", "93"]; obj91.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj91.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj91.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj91.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj91); scene.add(obj91); var obj92 = new THREE.Object3D(); obj92.name = "unnamed__93"; obj92.userData.explodable = 1; obj92.userData.points = []; obj92.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301)); obj92.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645)); obj92.userData.points.push(new PMPoint(-0.905882, 0.423529, 6.92042e-05)); obj92.userData.pointradii = 0.02; <!-- Vertex style --> obj92.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj92.userData.pointlabels = ["23", "47", "94"]; obj92.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj92.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj92.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj92.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj92); scene.add(obj92); var obj93 = new THREE.Object3D(); obj93.name = "unnamed__94"; obj93.userData.explodable = 1; obj93.userData.points = []; obj93.userData.points.push(new PMPoint(-1, 0, 0.5)); obj93.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645)); obj93.userData.points.push(new PMPoint(-0.945946, 0.324324, 0.00036523)); obj93.userData.pointradii = 0.02; <!-- Vertex style --> obj93.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj93.userData.pointlabels = ["0", "47", "95"]; obj93.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj93.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj93.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj93.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj93); scene.add(obj93); // COMMON_CODE_BLOCK_BEGIN function textSpriteMaterial(message, parameters) { if ( parameters === undefined ) parameters = {}; var fontface = "Helvetica"; var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15; fontsize = fontsize*10; var lines = message.split('\\n'); var size = 512; for(var i = 0; i<lines.length; i++){ var tmp = lines[i].length; while(tmp*fontsize > size){ fontsize--; } } var canvas = document.createElement('canvas'); canvas.width = size; canvas.height = size; var context = canvas.getContext('2d'); context.fillStyle = "rgba(255, 255, 255, 0)"; context.fill(); context.font = fontsize + "px " + fontface; // text color context.fillStyle = "rgba(0, 0, 0, 1.0)"; for(var i = 0; i<lines.length; i++){ context.fillText(lines[i], size/2, size/2+i*fontsize); } // canvas contents will be used for a texture var texture = new THREE.Texture(canvas); texture.needsUpdate = true; var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 }); return spriteMaterial; } // ---------------------- INITIALIZING OBJECTS-------------------------------------- // --------------------------------------------------------------------------------- function init_object(obj) { if (obj.userData.hasOwnProperty("pointmaterial")) { init_points(obj); modelContains.points = true; } if (obj.userData.hasOwnProperty("pointlabels")) { init_pointlabels(obj); modelContains.pointlabels = true; } if (obj.userData.hasOwnProperty("edgematerial")) { init_lines(obj); modelContains.lines = true; } if (obj.userData.hasOwnProperty("edgelabels")) { init_edgelabels(obj); modelContains.edgelabels = true; } if (obj.userData.hasOwnProperty("arrowstyle")) { init_arrowheads(obj); modelContains.arrowheads = true; } if (obj.userData.hasOwnProperty("facetmaterial")) { init_faces(obj); modelContains.faces = true; } } function init_points(obj) { var pointgroup = new THREE.Group(); pointgroup.name = "points"; var points = obj.userData.points; var radii = obj.userData.pointradii; var materials = obj.userData.pointmaterial; var geometry,material; if (!Array.isArray(radii)) { geometry = new THREE.SphereBufferGeometry(radii); } if (!Array.isArray(materials)) { material = materials; } for (var i=0; i<points.length; i++) { var point = points[i]; if (Array.isArray(radii)) { if (radii[i] == 0) { continue; } geometry = new THREE.SphereBufferGeometry(radii[i]); } if (Array.isArray(materials)) { material = materials[i]; } var sphere = new THREE.Mesh(geometry, material); point.addSphere(sphere); pointgroup.add(sphere); } obj.add(pointgroup); } function init_pointlabels(obj) { var points = obj.userData.points; var labels = obj.userData.pointlabels; var pointlabels = new THREE.Group(); pointlabels.name = "pointlabels"; if (Array.isArray(labels)) { for (var i=0; i<points.length; i++) { var point = points[i]; var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<points.length; i++) { var point = points[i]; var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } obj.add(pointlabels); } function init_lines(obj) { var edgeindices = obj.userData.edgeindices; var points = obj.userData.points; var materials = obj.userData.edgematerial; var geometry = new THREE.BufferGeometry(); var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 ); var geometry = new THREE.BufferGeometry(); geometry.setAttribute('position', bufattr); if (Array.isArray(materials)) { for (var i=0; i<materials.length; i++) { geometry.addGroup(2*i,2,i); } } var lines = new THREE.LineSegments(geometry, materials); lines.name = "lines"; obj.add(lines); updateEdgesPosition(obj); } function init_edgelabels(obj) { var points = obj.userData.points; var edgeindices = obj.userData.edgeindices; var labels = obj.userData.edgelabels; var edgelabels = new THREE.Group(); edgelabels.name = "edgelabels"; if (Array.isArray(labels)) { for (var i=0; i<edgeindices.length/2; i++) { var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<edgeindices.length/2; i++) { var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } obj.add(edgelabels); } function init_arrowheads(obj) { var arrowheads = new THREE.Group(); arrowheads.name = "arrowheads"; var arrowstyle = obj.userData.arrowstyle; var edgeindices = obj.userData.edgeindices; var edgematerials = obj.userData.edgematerial; var points = obj.userData.points; var material; if (!Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials.color} ); } for (var i=0; i<edgeindices.length; i=i+2) { var start = points[edgeindices[i]]; var end = points[edgeindices[i+1]]; var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius(); if (dist <= 0) { continue; } var dir = new THREE.Vector3().subVectors(end.vector,start.vector); dir.normalize(); var axis = new THREE.Vector3().set(dir.z,0,-dir.x); axis.normalize(); var radians = Math.acos( dir.y ); var radius = dist/25; var height = dist/5; var geometry = new THREE.ConeBufferGeometry(radius,height); var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2)); if (Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} ); } var cone = new THREE.Mesh( geometry, material ); cone.quaternion.setFromAxisAngle(axis,radians);; cone.position.copy(position);; arrowheads.add(cone); } obj.add(arrowheads); } function init_faces(obj) { var points = obj.userData.points; var facets = obj.userData.facets; obj.userData.triangleindices = []; for (var i=0; i<facets.length; i++) { facet = facets[i]; for (var t=0; t<facet.length-2; t++) { obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]); } } var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute(bufarr,3); var materials = obj.userData.facetmaterial; var geometry = new THREE.BufferGeometry(); var frontmaterials = []; var backmaterials = []; geometry.setAttribute('position',bufattr); if (Array.isArray(materials)) { var tricount = 0; var facet; for (var i=0; i<facets.length; i++) { facet = facets[i]; geometry.addGroup(tricount,(facet.length-2)*3,i); tricount += (facet.length-2)*3; } for (var j=0; j<materials.length; j++) { var fmat = materials[j].clone() fmat.side = THREE.FrontSide; frontmaterials.push(fmat); var bmat = materials[j].clone() bmat.side = THREE.BackSide; backmaterials.push(bmat); obj.userData.facetmaterial = frontmaterials.concat(backmaterials); } } else if (materials instanceof THREE.Material) { frontmaterials = materials.clone() frontmaterials.side = THREE.FrontSide; backmaterials = materials.clone() backmaterials.side = THREE.BackSide; obj.userData.facetmaterial = [frontmaterials, backmaterials]; } // duplicating the object with front and back should avoid transparency issues var backmesh = new THREE.Mesh(geometry, backmaterials); // meshname is used to show/hide objects backmesh.name = "backfaces"; obj.add(backmesh); var frontmesh = new THREE.Mesh(geometry, frontmaterials); frontmesh.name = "frontfaces"; obj.add(frontmesh); updateFacesPosition(obj); } // //INITIALIZING function updateFacesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.triangleindices; var faces = obj.getObjectByName("frontfaces"); var ba = faces.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } faces.geometry.attributes.position.needsUpdate = true; } function updateEdgesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.edgeindices; var lines = obj.getObjectByName("lines"); var ba = lines.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } lines.geometry.attributes.position.needsUpdate = true; } function onWindowResize() { renderer.setSize( three.clientWidth, three.clientHeight ); svgRenderer.setSize( three.clientWidth, three.clientHeight ); updateCamera(); } function updateCamera() { var width = three.clientWidth; var height = three.clientHeight; var aspect = width / height; if (camera.type == "OrthographicCamera") { camera.left = frustumSize * aspect / - 2; camera.right = frustumSize * aspect / 2; camera.top = frustumSize / 2; camera.bottom = - frustumSize / 2; } else if (camera.type == "PerspectiveCamera") { camera.aspect = aspect; } camera.updateProjectionMatrix(); } function changeCamera(event) { var selindex = event.currentTarget.selectedIndex; camera = cameras[selindex]; control = controls[selindex]; control.enabled = true; for (var i=0; i<controls.length; i++) { if (i!=selindex) { controls[i].enabled = false; } } updateCamera(); } var camtypenode = document.getElementById('cameraType_2'); camtypenode.onchange = changeCamera; camtypenode.dispatchEvent(new Event('change')); onWindowResize(); window.addEventListener('resize', onWindowResize); var xRotationEnabled = false; var yRotationEnabled = false; var zRotationEnabled = false; var rotationSpeedFactor = 1; var settingsShown = false; var labelsShown = true; var intervals = []; var timeouts = []; var explodingSpeed = 0.05; var explodeScale = 0.000001; var XMLS = new XMLSerializer(); var svgElement; var renderId; var render = function () { renderId = requestAnimationFrame(render); // comment in for automatic explosion // explode(updateFactor()); var phi = 0.02 * rotationSpeedFactor; if (xRotationEnabled) { scene.rotation.x += phi; } if (yRotationEnabled) { scene.rotation.y += phi; } if (zRotationEnabled) { scene.rotation.z += phi; } control.update(); renderer.render(scene, camera); }; if ( THREE.WEBGL.isWebGLAvailable() ) { render(); } else { var warning = WEBGL.getWebGLErrorMessage(); three.appendChild( warning ); } function changeTransparency() { var opacity = 1-Number(event.currentTarget.value); for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].opacity = opacity; } } else { child.userData.facetmaterial.opacity = opacity; } } } } function toggleDepthWrite(event) { depthwrite = event.currentTarget.checked; for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].depthWrite = depthwrite; } } else { child.userData.facetmaterial.depthWrite = depthWrite; } } } } function changeRotationX(event){ xRotationEnabled = event.currentTarget.checked; } function changeRotationY(event){ yRotationEnabled = event.currentTarget.checked; } function changeRotationZ(event){ zRotationEnabled = event.currentTarget.checked; } function changeRotationSpeedFactor(event){ rotationSpeedFactor = Number(event.currentTarget.value); } function resetScene(){ scene.rotation.set(0,0,0); camera.position.set(0,0,5); camera.up.set(0,1,0); } function showSettings(event){ document.getElementById('settings_2').style.visibility = 'visible'; document.getElementById('showSettingsButton_2').style.visibility = 'hidden'; document.getElementById('hideSettingsButton_2').style.visibility = 'visible'; settingsShown = true; } function hideSettings(event){ document.getElementById('settings_2').style.visibility = 'hidden'; document.getElementById('showSettingsButton_2').style.visibility = 'visible'; document.getElementById('hideSettingsButton_2').style.visibility = 'hidden'; settingsShown = false; } var pos = 150* Math.PI; function updateFactor() { pos++; return Math.sin(.01*pos)+1; } // ------------------------ FOLDING ------------------------------------------------ // --------------------------------------------------------------------------------- // rotate point p around axis defined by points p1 and p2 by given angle function rotate(p, p1, p2, angle ){ angle = -angle; var x = p.x, y = p.y, z = p.z, a = p1.x, b = p1.y, c = p1.z, u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z; var result = []; var L = u*u + v*v + w*w; var sqrt = Math.sqrt; var cos = Math.cos; var sin = Math.sin; result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L; result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L; result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L; return result; } var fold = function(event){ var obj = foldables[Number(event.currentTarget.name)]; var foldvalue = Number(event.currentTarget.value); var scale = foldvalue - obj.userData.oldscale; for (var j=0; j<obj.userData.axes.length; j++) { rotateVertices(obj, j, scale); } update(obj); obj.userData.oldscale += scale; lookAtBarycenter(obj); } function lookAtBarycenter(obj){ control.target = barycenter(obj); } function barycenter(obj) { var center = new THREE.Vector3(0,0,0); var points = obj.userData.points; for (var i=0; i<points.length; i++){ center.add(points[i].vector); } center.divideScalar(points.length); return center; } function rotateVertices(obj, edge, scale) { var axes = obj.userData.axes; var subtrees = obj.userData.subtrees; var points = obj.userData.points; var angles = obj.userData.angles; if (edge < axes.length){ for (var j=0; j<subtrees[edge].length; j++){ var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge])); points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]); } } } function update(obj) { updateFacesPosition(obj); updateEdgesPosition(obj); } if (foldables.length) { var settings = document.getElementById('settings_2'); var foldDiv = document.createElement('div'); foldDiv.id = 'fold_2'; var title = document.createElement('strong'); title.innerHTML = 'Fold'; foldDiv.appendChild(title); foldDiv.className = 'group'; for (var i=0; i<foldables.length; i++) { var range = document.createElement('input'); range.type = 'range'; range.min = 0; range.max = 1; range.value = 0; range.step = 0.001; range.name = String(i); range.oninput = fold; foldDiv.appendChild(range); } lookAtBarycenter(foldables[0]); settings.insertBefore(foldDiv,settings.childNodes[0]); } // ---------------------- EXPLOSION ------------------------------------------------ // --------------------------------------------------------------------------------- if (explodableModel) { for (var i=0; i<scene.children.length; i++) { obj = scene.children[i]; if ( obj.userData.explodable ) { computeCentroid(obj); } } document.getElementById('explodeRange_2').oninput = triggerExplode; document.getElementById('explodeCheckbox_2').onchange = triggerAutomaticExplode; document.getElementById('explodingSpeedRange_2').oninput = setExplodingSpeed; explode(0.000001); } function computeCentroid(obj) { centroid = new THREE.Vector3(); obj.userData.points.forEach(function(pmpoint) { centroid.add(pmpoint.vector); }); centroid.divideScalar(obj.userData.points.length); obj.userData.centroid = centroid; } function explode(factor) { for (var i=0; i<scene.children.length; i++) { var obj = scene.children[i]; if (obj.userData.hasOwnProperty("centroid")) { var c = obj.userData.centroid; obj.position.set(c.x*factor, c.y*factor, c.z*factor); } } } function triggerExplode(event){ explodeScale = Number(event.currentTarget.value); explode(explodeScale); } function setExplodingSpeed(event){ explodingSpeed = Number(event.currentTarget.value); } function triggerAutomaticExplode(event){ if (event.currentTarget.checked){ startExploding(); } else { clearIntervals(); } } function startExploding(){ intervals.push(setInterval(explodingInterval, 25)); } function explodingInterval(){ explodeScale += explodingSpeed; if (explodeScale <= 6){ explode(explodeScale); } else{ explode(6); explodeScale = 6; clearIntervals(); timeouts.push(setTimeout(startUnexploding, 3000)); } document.getElementById('explodeRange_2').value = explodeScale; } function startUnexploding(){ intervals.push(setInterval(unexplodingInterval, 25)); } function unexplodingInterval(){ explodeScale -= explodingSpeed; if (explodeScale >= 0){ explode(explodeScale); } else { explode(0); explodeScale = 0; clearIntervals(); timeouts.push(setTimeout(startExploding, 3000)); } document.getElementById('explodeRange_2').value = explodeScale; } function clearIntervals(){ intervals.forEach(function(interval){ clearInterval(interval); }); intervals = []; timeouts.forEach(function(timeout){ clearTimeout(timeout); }); timeouts = []; } // ---------------------- DISPLAY -------------------------------------------------- // --------------------------------------------------------------------------------- const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" }; const objectTypeVisible = {}; Object.assign(objectTypeVisible,modelContains); const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort(); const shownObjectTypesList = document.getElementById('shownObjectTypesList_2'); function setVisibility(bool,objname) { for (var i=0; i<scene.children.length; i++){ var obj = scene.children[i].getObjectByName(objname); if (obj) { obj.visible = bool; } } } function toggleObjectTypeVisibility(event){ var name = event.currentTarget.name; var checked = event.currentTarget.checked; objectTypeVisible[name] = checked; if (name == "faces") { setVisibility(checked,"frontfaces"); setVisibility(checked,"backfaces"); } else { setVisibility(checked,name); } } for (var i=0; i<sortedObjectTypeKeys.length; i++){ var key = sortedObjectTypeKeys[i]; if (modelContains[key]) { var objTypeNode = document.createElement('span'); objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = key; checkbox.onchange = toggleObjectTypeVisibility; shownObjectTypesList.appendChild(checkbox); shownObjectTypesList.appendChild(objTypeNode); } } // ------------------------------------------------------ function toggleObjectVisibility(event){ var nr = Number(event.currentTarget.name); scene.children[nr].visible = event.currentTarget.checked; } // append checkboxes for displaying or hiding objects var shownObjectsList = document.getElementById('shownObjectsList_2'); for (var i=0; i<scene.children.length; i++){ obj = scene.children[i]; var objNode = document.createElement('span'); objNode.innerHTML = obj.name + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = String(i); checkbox.onchange = toggleObjectVisibility; shownObjectsList.appendChild(checkbox); shownObjectsList.appendChild(objNode); } // ---------------------- SVG ------------------------------------------------------ // --------------------------------------------------------------------------------- function takeSvgScreenshot() { if (objectTypeVisible["pointlabels"]) { setVisibility(false,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(false,"edgelabels"); } svgRenderer.render(scene,camera); svgElement = XMLS.serializeToString(svgRenderer.domElement); if (objectTypeVisible["pointlabels"]) { setVisibility(true,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(true,"edgelabels"); } if (document.getElementById('tab_2').checked){ //show in new tab var myWindow = window.open("",""); myWindow.document.body.innerHTML = svgElement; } else{ // download svg file download("screenshot.svg", svgElement); } } function download(filename, text) { var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } document.getElementById('transparencyRange_2').oninput = changeTransparency; document.getElementById('depthWriteCheckbox_2').onchange = toggleDepthWrite; document.getElementById('changeRotationX_2').onchange = changeRotationX; document.getElementById('changeRotationY_2').onchange = changeRotationY; document.getElementById('changeRotationZ_2').onchange = changeRotationZ; document.getElementById('resetButton_2').onclick = resetScene; document.getElementById('rotationSpeedRange_2').oninput = changeRotationSpeedFactor; document.getElementById('takeScreenshot_2').onclick = takeSvgScreenshot; document.getElementById('showSettingsButton_2').onclick = showSettings; document.getElementById('hideSettingsButton_2').onclick = hideSettings; // ------------------ SHORTCUTS -------------------------------------------- // ------------------------------------------------------------------------- /** * http://www.openjs.com/scripts/events/keyboard_shortcuts/ * Version : 2.01.B * By Binny V A * License : BSD */ shortcut = { 'all_shortcuts':{},//All the shortcuts are stored in this array 'add': function(shortcut_combination,callback,opt) { //Provide a set of default options var default_options = { 'type':'keydown', 'propagate':false, 'disable_in_input':false, 'target':document, 'keycode':false } if(!opt) opt = default_options; else { for(var dfo in default_options) { if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo]; } } var ele = opt.target; if(typeof opt.target == 'string') ele = document.getElementById(opt.target); var ths = this; shortcut_combination = shortcut_combination.toLowerCase(); //The function to be called at keypress var func = function(e) { e = e || window.event; if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields var element; if(e.target) element=e.target; else if(e.srcElement) element=e.srcElement; if(element.nodeType==3) element=element.parentNode; if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return; } //Find Which key is pressed if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; var character = String.fromCharCode(code).toLowerCase(); if(code == 188) character=","; //If the user presses , when the type is onkeydown if(code == 190) character="."; //If the user presses , when the type is onkeydown var keys = shortcut_combination.split("+"); //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked var kp = 0; //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken var shift_nums = { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&", "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<", ".":">", "/":"?", "\\":"|" } //Special Keys - and their codes var special_keys = { 'esc':27, 'escape':27, 'tab':9, 'space':32, 'return':13, 'enter':13, 'backspace':8, 'scrolllock':145, 'scroll_lock':145, 'scroll':145, 'capslock':20, 'caps_lock':20, 'caps':20, 'numlock':144, 'num_lock':144, 'num':144, 'pause':19, 'break':19, 'insert':45, 'home':36, 'delete':46, 'end':35, 'pageup':33, 'page_up':33, 'pu':33, 'pagedown':34, 'page_down':34, 'pd':34, 'left':37, 'up':38, 'right':39, 'down':40, 'f1':112, 'f2':113, 'f3':114, 'f4':115, 'f5':116, 'f6':117, 'f7':118, 'f8':119, 'f9':120, 'f10':121, 'f11':122, 'f12':123 } var modifiers = { shift: { wanted:false, pressed:false}, ctrl : { wanted:false, pressed:false}, alt : { wanted:false, pressed:false}, meta : { wanted:false, pressed:false} //Meta is Mac specific }; if(e.ctrlKey) modifiers.ctrl.pressed = true; if(e.shiftKey) modifiers.shift.pressed = true; if(e.altKey) modifiers.alt.pressed = true; if(e.metaKey) modifiers.meta.pressed = true; for(var i=0; k=keys[i],i<keys.length; i++) { //Modifiers if(k == 'ctrl' || k == 'control') { kp++; modifiers.ctrl.wanted = true; } else if(k == 'shift') { kp++; modifiers.shift.wanted = true; } else if(k == 'alt') { kp++; modifiers.alt.wanted = true; } else if(k == 'meta') { kp++; modifiers.meta.wanted = true; } else if(k.length > 1) { //If it is a special key if(special_keys[k] == code) kp++; } else if(opt['keycode']) { if(opt['keycode'] == code) kp++; } else { //The special keys did not match if(character == k) kp++; else { if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase character = shift_nums[character]; if(character == k) kp++; } } } } if(kp == keys.length && modifiers.ctrl.pressed == modifiers.ctrl.wanted && modifiers.shift.pressed == modifiers.shift.wanted && modifiers.alt.pressed == modifiers.alt.wanted && modifiers.meta.pressed == modifiers.meta.wanted) { callback(e); if(!opt['propagate']) { //Stop the event //e.cancelBubble is supported by IE - this will kill the bubbling process. e.cancelBubble = true; e.returnValue = false; //e.stopPropagation works in Firefox. if (e.stopPropagation) { e.stopPropagation(); e.preventDefault(); } return false; } } } this.all_shortcuts[shortcut_combination] = { 'callback':func, 'target':ele, 'event': opt['type'] }; //Attach the function with the event if(ele.addEventListener) ele.addEventListener(opt['type'], func, false); else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func); else ele['on'+opt['type']] = func; }, //Remove the shortcut - just specify the shortcut and I will remove the binding 'remove':function(shortcut_combination) { shortcut_combination = shortcut_combination.toLowerCase(); var binding = this.all_shortcuts[shortcut_combination]; delete(this.all_shortcuts[shortcut_combination]) if(!binding) return; var type = binding['event']; var ele = binding['target']; var callback = binding['callback']; if(ele.detachEvent) ele.detachEvent('on'+type, callback); else if(ele.removeEventListener) ele.removeEventListener(type, callback, false); else ele['on'+type] = false; } } shortcut.add("Alt+Left",function() { var event = new Event('click'); if (settingsShown){ document.getElementById('hideSettingsButton_2').dispatchEvent(event); } else { document.getElementById('showSettingsButton_2').dispatchEvent(event); } }); // COMMON_CODE_BLOCK_END });}); </script> </body> </html> </HTML> <code perl> > $d1 = $s->gkz_dome(1,5); > $d1->VISUAL(FacetColor=>'80 180 255'); </code> <HTML> <!-- polymake for knusper Thu Mar 3 00:31:40 2022 pcom:d1 --> <html> <head> <meta charset=utf-8> <title>pcom:d1</title> <style> /* // COMMON_CODE_BLOCK_BEGIN */ html {overflow: scroll;} strong{font-size: 18px;} canvas { z-index: 8; } input[type='radio'] {margin-left:0;} input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;} .group{padding-bottom: 15px;} .settings * {z-index: 11; } .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;} .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;} .showSettingsButton{visibility: visible; z-index: 12; position: absolute } .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5} button{margin-left: 0; margin-top: 10px} img{cursor: pointer;} .suboption{padding-top: 15px;} #model39398428205 { width: 100%; height: 100%; } .threejs_container { width: 100%; height: 75vh;} .settings{max-height: 74vh} input[type=range] { -webkit-appearance: none; padding:0; width:90%; margin-left: auto; margin-right: auto; margin-top: 15px; margin-bottom: 15px; display: block; } input[type=range]:focus { outline: none; } input[type=range]::-webkit-slider-runnable-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-webkit-slider-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; -webkit-appearance: none; margin-top: -5px; } input[type=range]:focus::-webkit-slider-runnable-track { background: #E3E3E3; } input[type=range]::-moz-range-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-moz-range-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]::-ms-track { height: 4px; cursor: pointer; animate: 0.2s; background: transparent; border-color: transparent; color: transparent; } input[type=range]::-ms-fill-lower { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-fill-upper { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]:focus::-ms-fill-lower { background: #E3E3E3; } input[type=range]:focus::-ms-fill-upper { background: #E3E3E3; } /* // COMMON_CODE_BLOCK_END */ </style> </head> <body> <div class='threejs_container'> <div id='settings_3' class='settings'> <div class=group id='explode_3'> <strong>Explode</strong> <input id='explodeRange_3' type='range' min='0.00001' max=6 step=0.01 value=0.00001> <div class=indented><input id='explodeCheckbox_3' type='checkbox'>Automatic explosion</div> <div class=suboption>Exploding speed</div> <input id='explodingSpeedRange_3' type='range' min=0 max=0.5 step=0.001 value=0.05> </div> <div class=group id='transparency_3' class='transparency'> <strong>Transparency</strong> <input id='transparencyRange_3' type='range' min=0 max=1 step=0.01 value=0> <div class=indented><input id='depthWriteCheckbox_3' type='checkbox'>depthWrite</div> </div> <div class=group id='rotation_3'> <strong>Rotation</strong> <div class=indented> <div><input type='checkbox' id='changeRotationX_3'> x-axis</div> <div><input type='checkbox' id='changeRotationY_3'> y-axis</div> <div><input type='checkbox' id='changeRotationZ_3'> z-axis</div> <button id='resetButton_3'>Reset</button> </div> <div class=suboption>Rotation speed</div> <input id='rotationSpeedRange_3' type='range' min=0 max=5 step=0.01 value=2> </div> <div class=group id='display_3'> <strong>Display</strong> <div class=indented> <div id='shownObjectTypesList_3' class='shownObjectsList'></div> </div> <div class=suboption>Objects</div> <div class=indented> <div id='shownObjectsList_3' class='shownObjectsList'></div> </div> </div> <div class=group id='camera_3'> <strong>Camera</strong> <div class=indented> <form> <select id="cameraType_3"> <option value='perspective' selected> Perspective<br></option> <option value='orthographic' > Orthographic<br></option> </select> </form> </div> </div> <div class=group id='svg_3'> <strong>SVG</strong> <div class=indented> <form> <input type="radio" name='screenshotMode' value='download' id='download_3' checked> Download<br> <input type="radio" name='screenshotMode' value='tab' id='tab_3' > New tab<br> </form> <button id='takeScreenshot_3'>Screenshot</button> </div> </div> </div> <!-- end of settings --> <img id='hideSettingsButton_3' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px"> <img id='showSettingsButton_3' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px"> <div id="model39398428205"></div> </div> <script> requirejs.config({ paths: { three: '/kernelspecs/r118/polymake/three', TrackballControls: '/kernelspecs/r118/polymake/TrackballControls', OrbitControls: '/kernelspecs/r118/polymake/OrbitControls', Projector: '/kernelspecs/r118/polymake/Projector', SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer', WEBGL: '/kernelspecs/r118/polymake/WebGL', }, shim: { 'three': { exports: 'THREE'}, 'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' }, 'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' }, 'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' }, 'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' }, 'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' }, } }); require(['three'],function(THREE){ window.THREE = THREE; require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'], function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) { THREE.TrackballControls = TrackballControls; THREE.OrbitControls = OrbitControls; THREE.Projector = Projector; THREE.SVGRenderer = SVGRenderer; THREE.WEBGL = WEBGL; // COMMON_CODE_BLOCK_BEGIN const intervalLength = 25; // for automatic animations const explodableModel = true; const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false }; const foldables = []; var three = document.getElementById("model39398428205"); var scene = new THREE.Scene(); var renderer = new THREE.WebGLRenderer( { antialias: true } ); var svgRenderer = new THREE.SVGRenderer( { antialias: true } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setClearColor(0xFFFFFF, 1); svgRenderer.setClearColor(0xFFFFFF, 1); three.appendChild(renderer.domElement); var frustumSize = 4; var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()]; cameras.forEach(function(cam) { cam.position.set(0, 0, 5); cam.lookAt(0, 0, 0); cam.up.set(0, 1, 0); }); var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)]; var camera, control; controls[0].zoomSpeed = 0.2; controls[0].rotateSpeed = 4; // class to allow move points together with labels and spheres var PMPoint = function (x,y,z) { this.vector = new THREE.Vector3(x,y,z); this.sprite = null; this.sphere = null; } PMPoint.prototype.addLabel = function(labelsprite) { this.sprite = labelsprite; this.sprite.position.copy(this.vector); } PMPoint.prototype.addSphere = function(spheremesh) { this.sphere = spheremesh; this.sphere.position.copy(this.vector); } PMPoint.prototype.set = function(x,y,z) { this.vector.set(x,y,z); if (this.sprite) { this.sprite.position.copy(this.vector); } if (this.sphere) { this.sphere.position.copy(this.vector); } } PMPoint.prototype.radius = function() { if (this.sphere) { return this.sphere.geometry.parameters.radius; } else { return 0; } }; // select the target node var target = document.querySelector('#model39398428205'); // create an observer instance var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.removedNodes && mutation.removedNodes.length > 0) { cancelAnimationFrame(renderId); observer.disconnect(); console.log("cancelled frame "+renderId); } }); }); // configuration of the observer: var config = { childList: true, characterData: true } // pass in the target node, as well as the observer options while (target) { if (target.className=="output") { observer.observe(target, config); break; } target = target.parentNode; } // COMMON_CODE_BLOCK_END var obj0 = new THREE.Object3D(); obj0.name = "unnamed__1"; obj0.userData.explodable = 1; obj0.userData.points = []; obj0.userData.points.push(new PMPoint(0, -1, 0.125)); obj0.userData.points.push(new PMPoint(0, 1, 0.125)); obj0.userData.points.push(new PMPoint(-1, 0, 0.5)); obj0.userData.pointradii = 0.02; <!-- Vertex style --> obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj0.userData.pointlabels = ["0", "1", "2"]; obj0.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj0.userData.facets = [[0, 2, 1]]; <!-- Facet style --> obj0.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj0); scene.add(obj0); var obj1 = new THREE.Object3D(); obj1.name = "unnamed__2"; obj1.userData.explodable = 1; obj1.userData.points = []; obj1.userData.points.push(new PMPoint(0, -1, 0.125)); obj1.userData.points.push(new PMPoint(0, 1, 0.125)); obj1.userData.points.push(new PMPoint(1, 0, 0.5)); obj1.userData.pointradii = 0.02; <!-- Vertex style --> obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj1.userData.pointlabels = ["0", "1", "3"]; obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj1.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj1.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj1); scene.add(obj1); var obj2 = new THREE.Object3D(); obj2.name = "unnamed__3"; obj2.userData.explodable = 1; obj2.userData.points = []; obj2.userData.points.push(new PMPoint(0, 1, 0.125)); obj2.userData.points.push(new PMPoint(-1, 0, 0.5)); obj2.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj2.userData.pointradii = 0.02; <!-- Vertex style --> obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj2.userData.pointlabels = ["1", "2", "4"]; obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj2.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj2); scene.add(obj2); var obj3 = new THREE.Object3D(); obj3.name = "unnamed__4"; obj3.userData.explodable = 1; obj3.userData.points = []; obj3.userData.points.push(new PMPoint(0, -1, 0.125)); obj3.userData.points.push(new PMPoint(-1, 0, 0.5)); obj3.userData.points.push(new PMPoint(-0.8, -0.6, 0.005)); obj3.userData.pointradii = 0.02; <!-- Vertex style --> obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj3.userData.pointlabels = ["0", "2", "5"]; obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj3.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj3.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj3); scene.add(obj3); var obj4 = new THREE.Object3D(); obj4.name = "unnamed__5"; obj4.userData.explodable = 1; obj4.userData.points = []; obj4.userData.points.push(new PMPoint(0, -1, 0.125)); obj4.userData.points.push(new PMPoint(1, 0, 0.5)); obj4.userData.points.push(new PMPoint(0.8, -0.6, 0.005)); obj4.userData.pointradii = 0.02; <!-- Vertex style --> obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj4.userData.pointlabels = ["0", "3", "6"]; obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj4.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj4.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj4); scene.add(obj4); var obj5 = new THREE.Object3D(); obj5.name = "unnamed__6"; obj5.userData.explodable = 1; obj5.userData.points = []; obj5.userData.points.push(new PMPoint(0, 1, 0.125)); obj5.userData.points.push(new PMPoint(1, 0, 0.5)); obj5.userData.points.push(new PMPoint(0.8, 0.6, 0.005)); obj5.userData.pointradii = 0.02; <!-- Vertex style --> obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj5.userData.pointlabels = ["1", "3", "7"]; obj5.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj5.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj5); scene.add(obj5); var obj6 = new THREE.Object3D(); obj6.name = "unnamed__7"; obj6.userData.explodable = 1; obj6.userData.points = []; obj6.userData.points.push(new PMPoint(0, 1, 0.125)); obj6.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj6.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj6.userData.pointradii = 0.02; <!-- Vertex style --> obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj6.userData.pointlabels = ["1", "4", "8"]; obj6.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj6.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj6); scene.add(obj6); var obj7 = new THREE.Object3D(); obj7.name = "unnamed__8"; obj7.userData.explodable = 1; obj7.userData.points = []; obj7.userData.points.push(new PMPoint(-1, 0, 0.5)); obj7.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj7.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645)); obj7.userData.pointradii = 0.02; <!-- Vertex style --> obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj7.userData.pointlabels = ["2", "4", "9"]; obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj7.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj7.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj7); scene.add(obj7); var obj8 = new THREE.Object3D(); obj8.name = "unnamed__9"; obj8.userData.explodable = 1; obj8.userData.points = []; obj8.userData.points.push(new PMPoint(-1, 0, 0.5)); obj8.userData.points.push(new PMPoint(-0.8, -0.6, 0.005)); obj8.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645)); obj8.userData.pointradii = 0.02; <!-- Vertex style --> obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj8.userData.pointlabels = ["2", "5", "10"]; obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj8.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj8.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj8); scene.add(obj8); var obj9 = new THREE.Object3D(); obj9.name = "unnamed__10"; obj9.userData.explodable = 1; obj9.userData.points = []; obj9.userData.points.push(new PMPoint(0, -1, 0.125)); obj9.userData.points.push(new PMPoint(-0.8, -0.6, 0.005)); obj9.userData.points.push(new PMPoint(-0.6, -0.8, 0.02)); obj9.userData.pointradii = 0.02; <!-- Vertex style --> obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj9.userData.pointlabels = ["0", "5", "11"]; obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj9.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj9.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj9); scene.add(obj9); var obj10 = new THREE.Object3D(); obj10.name = "unnamed__11"; obj10.userData.explodable = 1; obj10.userData.points = []; obj10.userData.points.push(new PMPoint(0, -1, 0.125)); obj10.userData.points.push(new PMPoint(0.8, -0.6, 0.005)); obj10.userData.points.push(new PMPoint(0.6, -0.8, 0.02)); obj10.userData.pointradii = 0.02; <!-- Vertex style --> obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj10.userData.pointlabels = ["0", "6", "12"]; obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj10.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj10.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj10); scene.add(obj10); var obj11 = new THREE.Object3D(); obj11.name = "unnamed__12"; obj11.userData.explodable = 1; obj11.userData.points = []; obj11.userData.points.push(new PMPoint(1, 0, 0.5)); obj11.userData.points.push(new PMPoint(0.8, -0.6, 0.005)); obj11.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645)); obj11.userData.pointradii = 0.02; <!-- Vertex style --> obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj11.userData.pointlabels = ["3", "6", "13"]; obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj11.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj11); scene.add(obj11); var obj12 = new THREE.Object3D(); obj12.name = "unnamed__13"; obj12.userData.explodable = 1; obj12.userData.points = []; obj12.userData.points.push(new PMPoint(1, 0, 0.5)); obj12.userData.points.push(new PMPoint(0.8, 0.6, 0.005)); obj12.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645)); obj12.userData.pointradii = 0.02; <!-- Vertex style --> obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj12.userData.pointlabels = ["3", "7", "14"]; obj12.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj12.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj12); scene.add(obj12); var obj13 = new THREE.Object3D(); obj13.name = "unnamed__14"; obj13.userData.explodable = 1; obj13.userData.points = []; obj13.userData.points.push(new PMPoint(0, 1, 0.125)); obj13.userData.points.push(new PMPoint(0.8, 0.6, 0.005)); obj13.userData.points.push(new PMPoint(0.6, 0.8, 0.02)); obj13.userData.pointradii = 0.02; <!-- Vertex style --> obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj13.userData.pointlabels = ["1", "7", "15"]; obj13.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj13.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj13); scene.add(obj13); var obj14 = new THREE.Object3D(); obj14.name = "unnamed__15"; obj14.userData.explodable = 1; obj14.userData.points = []; obj14.userData.points.push(new PMPoint(0, 1, 0.125)); obj14.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj14.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526)); obj14.userData.pointradii = 0.02; <!-- Vertex style --> obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj14.userData.pointlabels = ["1", "8", "16"]; obj14.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj14.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj14); scene.add(obj14); var obj15 = new THREE.Object3D(); obj15.name = "unnamed__16"; obj15.userData.explodable = 1; obj15.userData.points = []; obj15.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj15.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj15.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633)); obj15.userData.pointradii = 0.02; <!-- Vertex style --> obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj15.userData.pointlabels = ["4", "8", "17"]; obj15.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj15.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj15.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj15); scene.add(obj15); var obj16 = new THREE.Object3D(); obj16.name = "unnamed__17"; obj16.userData.explodable = 1; obj16.userData.points = []; obj16.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj16.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645)); obj16.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301)); obj16.userData.pointradii = 0.02; <!-- Vertex style --> obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj16.userData.pointlabels = ["4", "9", "18"]; obj16.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj16.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj16.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj16); scene.add(obj16); var obj17 = new THREE.Object3D(); obj17.name = "unnamed__18"; obj17.userData.explodable = 1; obj17.userData.points = []; obj17.userData.points.push(new PMPoint(-1, 0, 0.5)); obj17.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645)); obj17.userData.points.push(new PMPoint(-0.96, 0.28, 0.0002)); obj17.userData.pointradii = 0.02; <!-- Vertex style --> obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj17.userData.pointlabels = ["2", "9", "19"]; obj17.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj17.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj17.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj17); scene.add(obj17); var obj18 = new THREE.Object3D(); obj18.name = "unnamed__19"; obj18.userData.explodable = 1; obj18.userData.points = []; obj18.userData.points.push(new PMPoint(-1, 0, 0.5)); obj18.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645)); obj18.userData.points.push(new PMPoint(-0.96, -0.28, 0.0002)); obj18.userData.pointradii = 0.02; <!-- Vertex style --> obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj18.userData.pointlabels = ["2", "10", "20"]; obj18.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj18.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj18.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj18); scene.add(obj18); var obj19 = new THREE.Object3D(); obj19.name = "unnamed__20"; obj19.userData.explodable = 1; obj19.userData.points = []; obj19.userData.points.push(new PMPoint(-0.8, -0.6, 0.005)); obj19.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645)); obj19.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301)); obj19.userData.pointradii = 0.02; <!-- Vertex style --> obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj19.userData.pointlabels = ["5", "10", "21"]; obj19.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj19.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj19.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj19); scene.add(obj19); var obj20 = new THREE.Object3D(); obj20.name = "unnamed__21"; obj20.userData.explodable = 1; obj20.userData.points = []; obj20.userData.points.push(new PMPoint(-0.8, -0.6, 0.005)); obj20.userData.points.push(new PMPoint(-0.6, -0.8, 0.02)); obj20.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633)); obj20.userData.pointradii = 0.02; <!-- Vertex style --> obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj20.userData.pointlabels = ["5", "11", "22"]; obj20.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj20.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj20.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj20); scene.add(obj20); var obj21 = new THREE.Object3D(); obj21.name = "unnamed__22"; obj21.userData.explodable = 1; obj21.userData.points = []; obj21.userData.points.push(new PMPoint(0, -1, 0.125)); obj21.userData.points.push(new PMPoint(-0.6, -0.8, 0.02)); obj21.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526)); obj21.userData.pointradii = 0.02; <!-- Vertex style --> obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj21.userData.pointlabels = ["0", "11", "23"]; obj21.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj21.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj21.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj21); scene.add(obj21); var obj22 = new THREE.Object3D(); obj22.name = "unnamed__23"; obj22.userData.explodable = 1; obj22.userData.points = []; obj22.userData.points.push(new PMPoint(0, -1, 0.125)); obj22.userData.points.push(new PMPoint(0.6, -0.8, 0.02)); obj22.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526)); obj22.userData.pointradii = 0.02; <!-- Vertex style --> obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj22.userData.pointlabels = ["0", "12", "24"]; obj22.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj22.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj22.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj22); scene.add(obj22); var obj23 = new THREE.Object3D(); obj23.name = "unnamed__24"; obj23.userData.explodable = 1; obj23.userData.points = []; obj23.userData.points.push(new PMPoint(0.8, -0.6, 0.005)); obj23.userData.points.push(new PMPoint(0.6, -0.8, 0.02)); obj23.userData.points.push(new PMPoint(0.689655, -0.724138, 0.000148633)); obj23.userData.pointradii = 0.02; <!-- Vertex style --> obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj23.userData.pointlabels = ["6", "12", "25"]; obj23.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj23.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj23); scene.add(obj23); var obj24 = new THREE.Object3D(); obj24.name = "unnamed__25"; obj24.userData.explodable = 1; obj24.userData.points = []; obj24.userData.points.push(new PMPoint(0.8, -0.6, 0.005)); obj24.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645)); obj24.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301)); obj24.userData.pointradii = 0.02; <!-- Vertex style --> obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj24.userData.pointlabels = ["6", "13", "26"]; obj24.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj24.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj24.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj24); scene.add(obj24); var obj25 = new THREE.Object3D(); obj25.name = "unnamed__26"; obj25.userData.explodable = 1; obj25.userData.points = []; obj25.userData.points.push(new PMPoint(1, 0, 0.5)); obj25.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645)); obj25.userData.points.push(new PMPoint(0.96, -0.28, 0.0002)); obj25.userData.pointradii = 0.02; <!-- Vertex style --> obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj25.userData.pointlabels = ["3", "13", "27"]; obj25.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj25.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj25.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj25); scene.add(obj25); var obj26 = new THREE.Object3D(); obj26.name = "unnamed__27"; obj26.userData.explodable = 1; obj26.userData.points = []; obj26.userData.points.push(new PMPoint(1, 0, 0.5)); obj26.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645)); obj26.userData.points.push(new PMPoint(0.96, 0.28, 0.0002)); obj26.userData.pointradii = 0.02; <!-- Vertex style --> obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj26.userData.pointlabels = ["3", "14", "28"]; obj26.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj26.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj26.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj26); scene.add(obj26); var obj27 = new THREE.Object3D(); obj27.name = "unnamed__28"; obj27.userData.explodable = 1; obj27.userData.points = []; obj27.userData.points.push(new PMPoint(0.8, 0.6, 0.005)); obj27.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645)); obj27.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301)); obj27.userData.pointradii = 0.02; <!-- Vertex style --> obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj27.userData.pointlabels = ["7", "14", "29"]; obj27.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj27.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj27.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj27); scene.add(obj27); var obj28 = new THREE.Object3D(); obj28.name = "unnamed__29"; obj28.userData.explodable = 1; obj28.userData.points = []; obj28.userData.points.push(new PMPoint(0.8, 0.6, 0.005)); obj28.userData.points.push(new PMPoint(0.6, 0.8, 0.02)); obj28.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633)); obj28.userData.pointradii = 0.02; <!-- Vertex style --> obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj28.userData.pointlabels = ["7", "15", "30"]; obj28.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj28.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj28.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj28); scene.add(obj28); var obj29 = new THREE.Object3D(); obj29.name = "unnamed__30"; obj29.userData.explodable = 1; obj29.userData.points = []; obj29.userData.points.push(new PMPoint(0, 1, 0.125)); obj29.userData.points.push(new PMPoint(0.6, 0.8, 0.02)); obj29.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526)); obj29.userData.pointradii = 0.02; <!-- Vertex style --> obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj29.userData.pointlabels = ["1", "15", "31"]; obj29.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj29.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj29.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj29); scene.add(obj29); var obj30 = new THREE.Object3D(); obj30.name = "unnamed__31"; obj30.userData.explodable = 1; obj30.userData.points = []; obj30.userData.points.push(new PMPoint(0, 1, 0.125)); obj30.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526)); obj30.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858)); obj30.userData.pointradii = 0.02; <!-- Vertex style --> obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj30.userData.pointlabels = ["1", "16", "32"]; obj30.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj30.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj30.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj30); scene.add(obj30); var obj31 = new THREE.Object3D(); obj31.name = "unnamed__32"; obj31.userData.explodable = 1; obj31.userData.points = []; obj31.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj31.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526)); obj31.userData.points.push(new PMPoint(-0.528302, 0.849057, 4.44998e-05)); obj31.userData.pointradii = 0.02; <!-- Vertex style --> obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj31.userData.pointlabels = ["8", "16", "33"]; obj31.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj31.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj31.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj31); scene.add(obj31); var obj32 = new THREE.Object3D(); obj32.name = "unnamed__33"; obj32.userData.explodable = 1; obj32.userData.points = []; obj32.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj32.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633)); obj32.userData.points.push(new PMPoint(-0.657534, 0.753425, 2.34566e-05)); obj32.userData.pointradii = 0.02; <!-- Vertex style --> obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj32.userData.pointlabels = ["8", "17", "34"]; obj32.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj32.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj32.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj32); scene.add(obj32); var obj33 = new THREE.Object3D(); obj33.name = "unnamed__34"; obj33.userData.explodable = 1; obj33.userData.points = []; obj33.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj33.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633)); obj33.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453)); obj33.userData.pointradii = 0.02; <!-- Vertex style --> obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj33.userData.pointlabels = ["4", "17", "35"]; obj33.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj33.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj33.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj33); scene.add(obj33); var obj34 = new THREE.Object3D(); obj34.name = "unnamed__35"; obj34.userData.explodable = 1; obj34.userData.points = []; obj34.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj34.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301)); obj34.userData.points.push(new PMPoint(-0.861538, 0.507692, 2.95858e-05)); obj34.userData.pointradii = 0.02; <!-- Vertex style --> obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj34.userData.pointlabels = ["4", "18", "36"]; obj34.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj34.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj34.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj34); scene.add(obj34); var obj35 = new THREE.Object3D(); obj35.name = "unnamed__36"; obj35.userData.explodable = 1; obj35.userData.points = []; obj35.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645)); obj35.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301)); obj35.userData.points.push(new PMPoint(-0.898876, 0.438202, 1.57808e-05)); obj35.userData.pointradii = 0.02; <!-- Vertex style --> obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj35.userData.pointlabels = ["9", "18", "37"]; obj35.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj35.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj35.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj35); scene.add(obj35); var obj36 = new THREE.Object3D(); obj36.name = "unnamed__37"; obj36.userData.explodable = 1; obj36.userData.points = []; obj36.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645)); obj36.userData.points.push(new PMPoint(-0.96, 0.28, 0.0002)); obj36.userData.points.push(new PMPoint(-0.945946, 0.324324, 0.00036523)); obj36.userData.pointradii = 0.02; <!-- Vertex style --> obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj36.userData.pointlabels = ["9", "19", "38"]; obj36.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj36.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj36.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj36); scene.add(obj36); var obj37 = new THREE.Object3D(); obj37.name = "unnamed__38"; obj37.userData.explodable = 1; obj37.userData.points = []; obj37.userData.points.push(new PMPoint(-1, 0, 0.5)); obj37.userData.points.push(new PMPoint(-0.96, 0.28, 0.0002)); obj37.userData.points.push(new PMPoint(-0.97561, 0.219512, 7.43605e-05)); obj37.userData.pointradii = 0.02; <!-- Vertex style --> obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj37.userData.pointlabels = ["2", "19", "39"]; obj37.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj37.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj37.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj37); scene.add(obj37); var obj38 = new THREE.Object3D(); obj38.name = "unnamed__39"; obj38.userData.explodable = 1; obj38.userData.points = []; obj38.userData.points.push(new PMPoint(-1, 0, 0.5)); obj38.userData.points.push(new PMPoint(-0.96, -0.28, 0.0002)); obj38.userData.points.push(new PMPoint(-0.97561, -0.219512, 7.43605e-05)); obj38.userData.pointradii = 0.02; <!-- Vertex style --> obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj38.userData.pointlabels = ["2", "20", "40"]; obj38.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj38.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj38.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj38); scene.add(obj38); var obj39 = new THREE.Object3D(); obj39.name = "unnamed__40"; obj39.userData.explodable = 1; obj39.userData.points = []; obj39.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645)); obj39.userData.points.push(new PMPoint(-0.96, -0.28, 0.0002)); obj39.userData.points.push(new PMPoint(-0.945946, -0.324324, 0.00036523)); obj39.userData.pointradii = 0.02; <!-- Vertex style --> obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj39.userData.pointlabels = ["10", "20", "41"]; obj39.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj39.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj39.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj39); scene.add(obj39); var obj40 = new THREE.Object3D(); obj40.name = "unnamed__41"; obj40.userData.explodable = 1; obj40.userData.points = []; obj40.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645)); obj40.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301)); obj40.userData.points.push(new PMPoint(-0.898876, -0.438202, 1.57808e-05)); obj40.userData.pointradii = 0.02; <!-- Vertex style --> obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj40.userData.pointlabels = ["10", "21", "42"]; obj40.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj40.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj40.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj40); scene.add(obj40); var obj41 = new THREE.Object3D(); obj41.name = "unnamed__42"; obj41.userData.explodable = 1; obj41.userData.points = []; obj41.userData.points.push(new PMPoint(-0.8, -0.6, 0.005)); obj41.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301)); obj41.userData.points.push(new PMPoint(-0.861538, -0.507692, 2.95858e-05)); obj41.userData.pointradii = 0.02; <!-- Vertex style --> obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj41.userData.pointlabels = ["5", "21", "43"]; obj41.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj41.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj41.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj41); scene.add(obj41); var obj42 = new THREE.Object3D(); obj42.name = "unnamed__43"; obj42.userData.explodable = 1; obj42.userData.points = []; obj42.userData.points.push(new PMPoint(-0.8, -0.6, 0.005)); obj42.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633)); obj42.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453)); obj42.userData.pointradii = 0.02; <!-- Vertex style --> obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj42.userData.pointlabels = ["5", "22", "44"]; obj42.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj42.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj42.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj42); scene.add(obj42); var obj43 = new THREE.Object3D(); obj43.name = "unnamed__44"; obj43.userData.explodable = 1; obj43.userData.points = []; obj43.userData.points.push(new PMPoint(-0.6, -0.8, 0.02)); obj43.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633)); obj43.userData.points.push(new PMPoint(-0.657534, -0.753425, 2.34566e-05)); obj43.userData.pointradii = 0.02; <!-- Vertex style --> obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj43.userData.pointlabels = ["11", "22", "45"]; obj43.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj43.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj43.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj43); scene.add(obj43); var obj44 = new THREE.Object3D(); obj44.name = "unnamed__45"; obj44.userData.explodable = 1; obj44.userData.points = []; obj44.userData.points.push(new PMPoint(-0.6, -0.8, 0.02)); obj44.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526)); obj44.userData.points.push(new PMPoint(-0.528302, -0.849057, 4.44998e-05)); obj44.userData.pointradii = 0.02; <!-- Vertex style --> obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj44.userData.pointlabels = ["11", "23", "46"]; obj44.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj44.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj44.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj44); scene.add(obj44); var obj45 = new THREE.Object3D(); obj45.name = "unnamed__46"; obj45.userData.explodable = 1; obj45.userData.points = []; obj45.userData.points.push(new PMPoint(0, -1, 0.125)); obj45.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526)); obj45.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858)); obj45.userData.pointradii = 0.02; <!-- Vertex style --> obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj45.userData.pointlabels = ["0", "23", "47"]; obj45.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj45.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj45.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj45); scene.add(obj45); var obj46 = new THREE.Object3D(); obj46.name = "unnamed__47"; obj46.userData.explodable = 1; obj46.userData.points = []; obj46.userData.points.push(new PMPoint(0, -1, 0.125)); obj46.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526)); obj46.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858)); obj46.userData.pointradii = 0.02; <!-- Vertex style --> obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj46.userData.pointlabels = ["0", "24", "48"]; obj46.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj46.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj46.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj46); scene.add(obj46); var obj47 = new THREE.Object3D(); obj47.name = "unnamed__48"; obj47.userData.explodable = 1; obj47.userData.points = []; obj47.userData.points.push(new PMPoint(0.6, -0.8, 0.02)); obj47.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526)); obj47.userData.points.push(new PMPoint(0.528302, -0.849057, 4.44998e-05)); obj47.userData.pointradii = 0.02; <!-- Vertex style --> obj47.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj47.userData.pointlabels = ["12", "24", "49"]; obj47.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj47.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj47.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj47.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj47); scene.add(obj47); var obj48 = new THREE.Object3D(); obj48.name = "unnamed__49"; obj48.userData.explodable = 1; obj48.userData.points = []; obj48.userData.points.push(new PMPoint(0.6, -0.8, 0.02)); obj48.userData.points.push(new PMPoint(0.689655, -0.724138, 0.000148633)); obj48.userData.points.push(new PMPoint(0.657534, -0.753425, 2.34566e-05)); obj48.userData.pointradii = 0.02; <!-- Vertex style --> obj48.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj48.userData.pointlabels = ["12", "25", "50"]; obj48.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj48.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj48.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj48.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj48); scene.add(obj48); var obj49 = new THREE.Object3D(); obj49.name = "unnamed__50"; obj49.userData.explodable = 1; obj49.userData.points = []; obj49.userData.points.push(new PMPoint(0.8, -0.6, 0.005)); obj49.userData.points.push(new PMPoint(0.689655, -0.724138, 0.000148633)); obj49.userData.points.push(new PMPoint(0.724138, -0.689655, 0.00059453)); obj49.userData.pointradii = 0.02; <!-- Vertex style --> obj49.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj49.userData.pointlabels = ["6", "25", "51"]; obj49.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj49.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj49.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj49.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj49); scene.add(obj49); var obj50 = new THREE.Object3D(); obj50.name = "unnamed__51"; obj50.userData.explodable = 1; obj50.userData.points = []; obj50.userData.points.push(new PMPoint(0.8, -0.6, 0.005)); obj50.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301)); obj50.userData.points.push(new PMPoint(0.861538, -0.507692, 2.95858e-05)); obj50.userData.pointradii = 0.02; <!-- Vertex style --> obj50.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj50.userData.pointlabels = ["6", "26", "52"]; obj50.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj50.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj50.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj50.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj50); scene.add(obj50); var obj51 = new THREE.Object3D(); obj51.name = "unnamed__52"; obj51.userData.explodable = 1; obj51.userData.points = []; obj51.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645)); obj51.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301)); obj51.userData.points.push(new PMPoint(0.898876, -0.438202, 1.57808e-05)); obj51.userData.pointradii = 0.02; <!-- Vertex style --> obj51.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj51.userData.pointlabels = ["13", "26", "53"]; obj51.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj51.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj51.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj51.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj51); scene.add(obj51); var obj52 = new THREE.Object3D(); obj52.name = "unnamed__53"; obj52.userData.explodable = 1; obj52.userData.points = []; obj52.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645)); obj52.userData.points.push(new PMPoint(0.96, -0.28, 0.0002)); obj52.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00036523)); obj52.userData.pointradii = 0.02; <!-- Vertex style --> obj52.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj52.userData.pointlabels = ["13", "27", "54"]; obj52.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj52.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj52.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj52.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj52); scene.add(obj52); var obj53 = new THREE.Object3D(); obj53.name = "unnamed__54"; obj53.userData.explodable = 1; obj53.userData.points = []; obj53.userData.points.push(new PMPoint(1, 0, 0.5)); obj53.userData.points.push(new PMPoint(0.96, -0.28, 0.0002)); obj53.userData.points.push(new PMPoint(0.97561, -0.219512, 7.43605e-05)); obj53.userData.pointradii = 0.02; <!-- Vertex style --> obj53.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj53.userData.pointlabels = ["3", "27", "55"]; obj53.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj53.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj53.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj53.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj53); scene.add(obj53); var obj54 = new THREE.Object3D(); obj54.name = "unnamed__55"; obj54.userData.explodable = 1; obj54.userData.points = []; obj54.userData.points.push(new PMPoint(1, 0, 0.5)); obj54.userData.points.push(new PMPoint(0.96, 0.28, 0.0002)); obj54.userData.points.push(new PMPoint(0.97561, 0.219512, 7.43605e-05)); obj54.userData.pointradii = 0.02; <!-- Vertex style --> obj54.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj54.userData.pointlabels = ["3", "28", "56"]; obj54.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj54.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj54.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj54.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj54); scene.add(obj54); var obj55 = new THREE.Object3D(); obj55.name = "unnamed__56"; obj55.userData.explodable = 1; obj55.userData.points = []; obj55.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645)); obj55.userData.points.push(new PMPoint(0.96, 0.28, 0.0002)); obj55.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00036523)); obj55.userData.pointradii = 0.02; <!-- Vertex style --> obj55.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj55.userData.pointlabels = ["14", "28", "57"]; obj55.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj55.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj55.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj55.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj55); scene.add(obj55); var obj56 = new THREE.Object3D(); obj56.name = "unnamed__57"; obj56.userData.explodable = 1; obj56.userData.points = []; obj56.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645)); obj56.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301)); obj56.userData.points.push(new PMPoint(0.898876, 0.438202, 1.57808e-05)); obj56.userData.pointradii = 0.02; <!-- Vertex style --> obj56.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj56.userData.pointlabels = ["14", "29", "58"]; obj56.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj56.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj56.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj56.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj56); scene.add(obj56); var obj57 = new THREE.Object3D(); obj57.name = "unnamed__58"; obj57.userData.explodable = 1; obj57.userData.points = []; obj57.userData.points.push(new PMPoint(0.8, 0.6, 0.005)); obj57.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301)); obj57.userData.points.push(new PMPoint(0.861538, 0.507692, 2.95858e-05)); obj57.userData.pointradii = 0.02; <!-- Vertex style --> obj57.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj57.userData.pointlabels = ["7", "29", "59"]; obj57.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj57.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj57.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj57.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj57); scene.add(obj57); var obj58 = new THREE.Object3D(); obj58.name = "unnamed__59"; obj58.userData.explodable = 1; obj58.userData.points = []; obj58.userData.points.push(new PMPoint(0.8, 0.6, 0.005)); obj58.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633)); obj58.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453)); obj58.userData.pointradii = 0.02; <!-- Vertex style --> obj58.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj58.userData.pointlabels = ["7", "30", "60"]; obj58.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj58.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj58.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj58.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj58); scene.add(obj58); var obj59 = new THREE.Object3D(); obj59.name = "unnamed__60"; obj59.userData.explodable = 1; obj59.userData.points = []; obj59.userData.points.push(new PMPoint(0.6, 0.8, 0.02)); obj59.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633)); obj59.userData.points.push(new PMPoint(0.657534, 0.753425, 2.34566e-05)); obj59.userData.pointradii = 0.02; <!-- Vertex style --> obj59.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj59.userData.pointlabels = ["15", "30", "61"]; obj59.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj59.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj59.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj59.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj59); scene.add(obj59); var obj60 = new THREE.Object3D(); obj60.name = "unnamed__61"; obj60.userData.explodable = 1; obj60.userData.points = []; obj60.userData.points.push(new PMPoint(0.6, 0.8, 0.02)); obj60.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526)); obj60.userData.points.push(new PMPoint(0.528302, 0.849057, 4.44998e-05)); obj60.userData.pointradii = 0.02; <!-- Vertex style --> obj60.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj60.userData.pointlabels = ["15", "31", "62"]; obj60.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj60.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj60.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj60.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj60); scene.add(obj60); var obj61 = new THREE.Object3D(); obj61.name = "unnamed__62"; obj61.userData.explodable = 1; obj61.userData.points = []; obj61.userData.points.push(new PMPoint(0, 1, 0.125)); obj61.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526)); obj61.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858)); obj61.userData.pointradii = 0.02; <!-- Vertex style --> obj61.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj61.userData.pointlabels = ["1", "31", "63"]; obj61.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj61.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj61.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj61.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj61); scene.add(obj61); var obj62 = new THREE.Object3D(); obj62.name = "unnamed__63"; obj62.userData.explodable = 1; obj62.userData.points = []; obj62.userData.points.push(new PMPoint(0, 1, 0.125)); obj62.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858)); obj62.userData.points.push(new PMPoint(-0.324324, 0.945946, 9.13075e-05)); obj62.userData.pointradii = 0.02; <!-- Vertex style --> obj62.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj62.userData.pointlabels = ["1", "32", "64"]; obj62.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj62.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj62.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj62.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj62); scene.add(obj62); var obj63 = new THREE.Object3D(); obj63.name = "unnamed__64"; obj63.userData.explodable = 1; obj63.userData.points = []; obj63.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526)); obj63.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858)); obj63.userData.points.push(new PMPoint(-0.423529, 0.905882, 1.7301e-05)); obj63.userData.pointradii = 0.02; <!-- Vertex style --> obj63.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj63.userData.pointlabels = ["16", "32", "65"]; obj63.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj63.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj63.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj63.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj63); scene.add(obj63); var obj64 = new THREE.Object3D(); obj64.name = "unnamed__65"; obj64.userData.explodable = 1; obj64.userData.points = []; obj64.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526)); obj64.userData.points.push(new PMPoint(-0.528302, 0.849057, 4.44998e-05)); obj64.userData.points.push(new PMPoint(-0.507692, 0.861538, 0.000118343)); obj64.userData.pointradii = 0.02; <!-- Vertex style --> obj64.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj64.userData.pointlabels = ["16", "33", "66"]; obj64.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj64.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj64.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj64.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj64); scene.add(obj64); var obj65 = new THREE.Object3D(); obj65.name = "unnamed__66"; obj65.userData.explodable = 1; obj65.userData.points = []; obj65.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj65.userData.points.push(new PMPoint(-0.528302, 0.849057, 4.44998e-05)); obj65.userData.points.push(new PMPoint(-0.550459, 0.834862, 1.0521e-05)); obj65.userData.pointradii = 0.02; <!-- Vertex style --> obj65.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj65.userData.pointlabels = ["8", "33", "67"]; obj65.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj65.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj65.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj65.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj65); scene.add(obj65); var obj66 = new THREE.Object3D(); obj66.name = "unnamed__67"; obj66.userData.explodable = 1; obj66.userData.points = []; obj66.userData.points.push(new PMPoint(-0.6, 0.8, 0.02)); obj66.userData.points.push(new PMPoint(-0.657534, 0.753425, 2.34566e-05)); obj66.userData.points.push(new PMPoint(-0.642336, 0.766423, 0)); obj66.userData.pointradii = 0.02; <!-- Vertex style --> obj66.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj66.userData.pointlabels = ["8", "34", "68"]; obj66.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj66.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj66.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj66.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj66); scene.add(obj66); var obj67 = new THREE.Object3D(); obj67.name = "unnamed__68"; obj67.userData.explodable = 1; obj67.userData.points = []; obj67.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633)); obj67.userData.points.push(new PMPoint(-0.657534, 0.753425, 2.34566e-05)); obj67.userData.points.push(new PMPoint(-0.670103, 0.742268, 5.31406e-05)); obj67.userData.pointradii = 0.02; <!-- Vertex style --> obj67.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj67.userData.pointlabels = ["17", "34", "69"]; obj67.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj67.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj67.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj67.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj67); scene.add(obj67); var obj68 = new THREE.Object3D(); obj68.name = "unnamed__69"; obj68.userData.explodable = 1; obj68.userData.points = []; obj68.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633)); obj68.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453)); obj68.userData.points.push(new PMPoint(-0.710059, 0.704142, 0)); obj68.userData.pointradii = 0.02; <!-- Vertex style --> obj68.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj68.userData.pointlabels = ["17", "35", "70"]; obj68.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj68.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj68.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj68.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj68); scene.add(obj68); var obj69 = new THREE.Object3D(); obj69.name = "unnamed__70"; obj69.userData.explodable = 1; obj69.userData.points = []; obj69.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj69.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453)); obj69.userData.points.push(new PMPoint(-0.742268, 0.670103, 1.32852e-05)); obj69.userData.pointradii = 0.02; <!-- Vertex style --> obj69.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj69.userData.pointlabels = ["4", "35", "71"]; obj69.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj69.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj69.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj69.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj69); scene.add(obj69); var obj70 = new THREE.Object3D(); obj70.name = "unnamed__71"; obj70.userData.explodable = 1; obj70.userData.points = []; obj70.userData.points.push(new PMPoint(-0.8, 0.6, 0.005)); obj70.userData.points.push(new PMPoint(-0.861538, 0.507692, 2.95858e-05)); obj70.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.000177999)); obj70.userData.pointradii = 0.02; <!-- Vertex style --> obj70.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj70.userData.pointlabels = ["4", "36", "72"]; obj70.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj70.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj70.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj70.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj70); scene.add(obj70); var obj71 = new THREE.Object3D(); obj71.name = "unnamed__72"; obj71.userData.explodable = 1; obj71.userData.points = []; obj71.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301)); obj71.userData.points.push(new PMPoint(-0.861538, 0.507692, 2.95858e-05)); obj71.userData.points.push(new PMPoint(-0.870466, 0.492228, 0)); obj71.userData.pointradii = 0.02; <!-- Vertex style --> obj71.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj71.userData.pointlabels = ["18", "36", "73"]; obj71.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj71.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj71.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj71.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj71); scene.add(obj71); var obj72 = new THREE.Object3D(); obj72.name = "unnamed__73"; obj72.userData.explodable = 1; obj72.userData.points = []; obj72.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301)); obj72.userData.points.push(new PMPoint(-0.898876, 0.438202, 1.57808e-05)); obj72.userData.points.push(new PMPoint(-0.892704, 0.450644, 0)); obj72.userData.pointradii = 0.02; <!-- Vertex style --> obj72.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj72.userData.pointlabels = ["18", "37", "74"]; obj72.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj72.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj72.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj72.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj72); scene.add(obj72); var obj73 = new THREE.Object3D(); obj73.name = "unnamed__74"; obj73.userData.explodable = 1; obj73.userData.points = []; obj73.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645)); obj73.userData.points.push(new PMPoint(-0.898876, 0.438202, 1.57808e-05)); obj73.userData.points.push(new PMPoint(-0.905882, 0.423529, 6.92042e-05)); obj73.userData.pointradii = 0.02; <!-- Vertex style --> obj73.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj73.userData.pointlabels = ["9", "37", "75"]; obj73.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj73.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj73.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj73.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj73); scene.add(obj73); var obj74 = new THREE.Object3D(); obj74.name = "unnamed__75"; obj74.userData.explodable = 1; obj74.userData.points = []; obj74.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645)); obj74.userData.points.push(new PMPoint(-0.945946, 0.324324, 0.00036523)); obj74.userData.points.push(new PMPoint(-0.939597, 0.342282, 0)); obj74.userData.pointradii = 0.02; <!-- Vertex style --> obj74.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj74.userData.pointlabels = ["9", "38", "76"]; obj74.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj74.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj74.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj74.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj74); scene.add(obj74); var obj75 = new THREE.Object3D(); obj75.name = "unnamed__76"; obj75.userData.explodable = 1; obj75.userData.points = []; obj75.userData.points.push(new PMPoint(-0.96, 0.28, 0.0002)); obj75.userData.points.push(new PMPoint(-0.945946, 0.324324, 0.00036523)); obj75.userData.points.push(new PMPoint(-0.951351, 0.308108, 0)); obj75.userData.pointradii = 0.02; <!-- Vertex style --> obj75.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj75.userData.pointlabels = ["19", "38", "77"]; obj75.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj75.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj75.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj75.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj75); scene.add(obj75); var obj76 = new THREE.Object3D(); obj76.name = "unnamed__77"; obj76.userData.explodable = 1; obj76.userData.points = []; obj76.userData.points.push(new PMPoint(-0.96, 0.28, 0.0002)); obj76.userData.points.push(new PMPoint(-0.97561, 0.219512, 7.43605e-05)); obj76.userData.points.push(new PMPoint(-0.969231, 0.246154, 0.000118343)); obj76.userData.pointradii = 0.02; <!-- Vertex style --> obj76.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj76.userData.pointlabels = ["19", "39", "78"]; obj76.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj76.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj76.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj76.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj76); scene.add(obj76); var obj77 = new THREE.Object3D(); obj77.name = "unnamed__78"; obj77.userData.explodable = 1; obj77.userData.points = []; obj77.userData.points.push(new PMPoint(-1, 0, 0.5)); obj77.userData.points.push(new PMPoint(-0.97561, 0.219512, 7.43605e-05)); obj77.userData.points.push(new PMPoint(-0.983607, 0.180328, 3.35931e-05)); obj77.userData.pointradii = 0.02; <!-- Vertex style --> obj77.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj77.userData.pointlabels = ["2", "39", "79"]; obj77.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj77.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj77.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj77.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj77); scene.add(obj77); var obj78 = new THREE.Object3D(); obj78.name = "unnamed__79"; obj78.userData.explodable = 1; obj78.userData.points = []; obj78.userData.points.push(new PMPoint(-1, 0, 0.5)); obj78.userData.points.push(new PMPoint(-0.97561, -0.219512, 7.43605e-05)); obj78.userData.points.push(new PMPoint(-0.983607, -0.180328, 3.35931e-05)); obj78.userData.pointradii = 0.02; <!-- Vertex style --> obj78.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj78.userData.pointlabels = ["2", "40", "80"]; obj78.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj78.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj78.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj78.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj78); scene.add(obj78); var obj79 = new THREE.Object3D(); obj79.name = "unnamed__80"; obj79.userData.explodable = 1; obj79.userData.points = []; obj79.userData.points.push(new PMPoint(-0.96, -0.28, 0.0002)); obj79.userData.points.push(new PMPoint(-0.97561, -0.219512, 7.43605e-05)); obj79.userData.points.push(new PMPoint(-0.969231, -0.246154, 0.000118343)); obj79.userData.pointradii = 0.02; <!-- Vertex style --> obj79.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj79.userData.pointlabels = ["20", "40", "81"]; obj79.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj79.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj79.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj79.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj79); scene.add(obj79); var obj80 = new THREE.Object3D(); obj80.name = "unnamed__81"; obj80.userData.explodable = 1; obj80.userData.points = []; obj80.userData.points.push(new PMPoint(-0.96, -0.28, 0.0002)); obj80.userData.points.push(new PMPoint(-0.945946, -0.324324, 0.00036523)); obj80.userData.points.push(new PMPoint(-0.951351, -0.308108, 0)); obj80.userData.pointradii = 0.02; <!-- Vertex style --> obj80.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj80.userData.pointlabels = ["20", "41", "82"]; obj80.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj80.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj80.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj80.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj80); scene.add(obj80); var obj81 = new THREE.Object3D(); obj81.name = "unnamed__82"; obj81.userData.explodable = 1; obj81.userData.points = []; obj81.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645)); obj81.userData.points.push(new PMPoint(-0.945946, -0.324324, 0.00036523)); obj81.userData.points.push(new PMPoint(-0.939597, -0.342282, 0)); obj81.userData.pointradii = 0.02; <!-- Vertex style --> obj81.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj81.userData.pointlabels = ["10", "41", "83"]; obj81.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj81.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj81.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj81.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj81); scene.add(obj81); var obj82 = new THREE.Object3D(); obj82.name = "unnamed__83"; obj82.userData.explodable = 1; obj82.userData.points = []; obj82.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645)); obj82.userData.points.push(new PMPoint(-0.898876, -0.438202, 1.57808e-05)); obj82.userData.points.push(new PMPoint(-0.905882, -0.423529, 6.92042e-05)); obj82.userData.pointradii = 0.02; <!-- Vertex style --> obj82.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj82.userData.pointlabels = ["10", "42", "84"]; obj82.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj82.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj82.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj82.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj82); scene.add(obj82); var obj83 = new THREE.Object3D(); obj83.name = "unnamed__84"; obj83.userData.explodable = 1; obj83.userData.points = []; obj83.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301)); obj83.userData.points.push(new PMPoint(-0.898876, -0.438202, 1.57808e-05)); obj83.userData.points.push(new PMPoint(-0.892704, -0.450644, 0)); obj83.userData.pointradii = 0.02; <!-- Vertex style --> obj83.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj83.userData.pointlabels = ["21", "42", "85"]; obj83.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj83.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj83.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj83.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj83); scene.add(obj83); var obj84 = new THREE.Object3D(); obj84.name = "unnamed__85"; obj84.userData.explodable = 1; obj84.userData.points = []; obj84.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301)); obj84.userData.points.push(new PMPoint(-0.861538, -0.507692, 2.95858e-05)); obj84.userData.points.push(new PMPoint(-0.870466, -0.492228, 0)); obj84.userData.pointradii = 0.02; <!-- Vertex style --> obj84.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj84.userData.pointlabels = ["21", "43", "86"]; obj84.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj84.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj84.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj84.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj84); scene.add(obj84); var obj85 = new THREE.Object3D(); obj85.name = "unnamed__86"; obj85.userData.explodable = 1; obj85.userData.points = []; obj85.userData.points.push(new PMPoint(-0.8, -0.6, 0.005)); obj85.userData.points.push(new PMPoint(-0.861538, -0.507692, 2.95858e-05)); obj85.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.000177999)); obj85.userData.pointradii = 0.02; <!-- Vertex style --> obj85.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj85.userData.pointlabels = ["5", "43", "87"]; obj85.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj85.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj85.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj85.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj85); scene.add(obj85); var obj86 = new THREE.Object3D(); obj86.name = "unnamed__87"; obj86.userData.explodable = 1; obj86.userData.points = []; obj86.userData.points.push(new PMPoint(-0.8, -0.6, 0.005)); obj86.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453)); obj86.userData.points.push(new PMPoint(-0.742268, -0.670103, 1.32852e-05)); obj86.userData.pointradii = 0.02; <!-- Vertex style --> obj86.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj86.userData.pointlabels = ["5", "44", "88"]; obj86.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj86.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj86.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj86.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj86); scene.add(obj86); var obj87 = new THREE.Object3D(); obj87.name = "unnamed__88"; obj87.userData.explodable = 1; obj87.userData.points = []; obj87.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633)); obj87.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453)); obj87.userData.points.push(new PMPoint(-0.710059, -0.704142, 0)); obj87.userData.pointradii = 0.02; <!-- Vertex style --> obj87.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj87.userData.pointlabels = ["22", "44", "89"]; obj87.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj87.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj87.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj87.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj87); scene.add(obj87); var obj88 = new THREE.Object3D(); obj88.name = "unnamed__89"; obj88.userData.explodable = 1; obj88.userData.points = []; obj88.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633)); obj88.userData.points.push(new PMPoint(-0.657534, -0.753425, 2.34566e-05)); obj88.userData.points.push(new PMPoint(-0.670103, -0.742268, 5.31406e-05)); obj88.userData.pointradii = 0.02; <!-- Vertex style --> obj88.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj88.userData.pointlabels = ["22", "45", "90"]; obj88.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj88.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj88.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj88.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj88); scene.add(obj88); var obj89 = new THREE.Object3D(); obj89.name = "unnamed__90"; obj89.userData.explodable = 1; obj89.userData.points = []; obj89.userData.points.push(new PMPoint(-0.6, -0.8, 0.02)); obj89.userData.points.push(new PMPoint(-0.657534, -0.753425, 2.34566e-05)); obj89.userData.points.push(new PMPoint(-0.642336, -0.766423, 0)); obj89.userData.pointradii = 0.02; <!-- Vertex style --> obj89.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj89.userData.pointlabels = ["11", "45", "91"]; obj89.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj89.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj89.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj89.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj89); scene.add(obj89); var obj90 = new THREE.Object3D(); obj90.name = "unnamed__91"; obj90.userData.explodable = 1; obj90.userData.points = []; obj90.userData.points.push(new PMPoint(-0.6, -0.8, 0.02)); obj90.userData.points.push(new PMPoint(-0.528302, -0.849057, 4.44998e-05)); obj90.userData.points.push(new PMPoint(-0.550459, -0.834862, 1.0521e-05)); obj90.userData.pointradii = 0.02; <!-- Vertex style --> obj90.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj90.userData.pointlabels = ["11", "46", "92"]; obj90.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj90.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj90.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj90.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj90); scene.add(obj90); var obj91 = new THREE.Object3D(); obj91.name = "unnamed__92"; obj91.userData.explodable = 1; obj91.userData.points = []; obj91.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526)); obj91.userData.points.push(new PMPoint(-0.528302, -0.849057, 4.44998e-05)); obj91.userData.points.push(new PMPoint(-0.507692, -0.861538, 0.000118343)); obj91.userData.pointradii = 0.02; <!-- Vertex style --> obj91.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj91.userData.pointlabels = ["23", "46", "93"]; obj91.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj91.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj91.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj91.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj91); scene.add(obj91); var obj92 = new THREE.Object3D(); obj92.name = "unnamed__93"; obj92.userData.explodable = 1; obj92.userData.points = []; obj92.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526)); obj92.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858)); obj92.userData.points.push(new PMPoint(-0.423529, -0.905882, 1.7301e-05)); obj92.userData.pointradii = 0.02; <!-- Vertex style --> obj92.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj92.userData.pointlabels = ["23", "47", "94"]; obj92.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj92.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj92.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj92.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj92); scene.add(obj92); var obj93 = new THREE.Object3D(); obj93.name = "unnamed__94"; obj93.userData.explodable = 1; obj93.userData.points = []; obj93.userData.points.push(new PMPoint(0, -1, 0.125)); obj93.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858)); obj93.userData.points.push(new PMPoint(-0.324324, -0.945946, 9.13075e-05)); obj93.userData.pointradii = 0.02; <!-- Vertex style --> obj93.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj93.userData.pointlabels = ["0", "47", "95"]; obj93.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj93.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj93.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj93.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj93); scene.add(obj93); // COMMON_CODE_BLOCK_BEGIN function textSpriteMaterial(message, parameters) { if ( parameters === undefined ) parameters = {}; var fontface = "Helvetica"; var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15; fontsize = fontsize*10; var lines = message.split('\\n'); var size = 512; for(var i = 0; i<lines.length; i++){ var tmp = lines[i].length; while(tmp*fontsize > size){ fontsize--; } } var canvas = document.createElement('canvas'); canvas.width = size; canvas.height = size; var context = canvas.getContext('2d'); context.fillStyle = "rgba(255, 255, 255, 0)"; context.fill(); context.font = fontsize + "px " + fontface; // text color context.fillStyle = "rgba(0, 0, 0, 1.0)"; for(var i = 0; i<lines.length; i++){ context.fillText(lines[i], size/2, size/2+i*fontsize); } // canvas contents will be used for a texture var texture = new THREE.Texture(canvas); texture.needsUpdate = true; var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 }); return spriteMaterial; } // ---------------------- INITIALIZING OBJECTS-------------------------------------- // --------------------------------------------------------------------------------- function init_object(obj) { if (obj.userData.hasOwnProperty("pointmaterial")) { init_points(obj); modelContains.points = true; } if (obj.userData.hasOwnProperty("pointlabels")) { init_pointlabels(obj); modelContains.pointlabels = true; } if (obj.userData.hasOwnProperty("edgematerial")) { init_lines(obj); modelContains.lines = true; } if (obj.userData.hasOwnProperty("edgelabels")) { init_edgelabels(obj); modelContains.edgelabels = true; } if (obj.userData.hasOwnProperty("arrowstyle")) { init_arrowheads(obj); modelContains.arrowheads = true; } if (obj.userData.hasOwnProperty("facetmaterial")) { init_faces(obj); modelContains.faces = true; } } function init_points(obj) { var pointgroup = new THREE.Group(); pointgroup.name = "points"; var points = obj.userData.points; var radii = obj.userData.pointradii; var materials = obj.userData.pointmaterial; var geometry,material; if (!Array.isArray(radii)) { geometry = new THREE.SphereBufferGeometry(radii); } if (!Array.isArray(materials)) { material = materials; } for (var i=0; i<points.length; i++) { var point = points[i]; if (Array.isArray(radii)) { if (radii[i] == 0) { continue; } geometry = new THREE.SphereBufferGeometry(radii[i]); } if (Array.isArray(materials)) { material = materials[i]; } var sphere = new THREE.Mesh(geometry, material); point.addSphere(sphere); pointgroup.add(sphere); } obj.add(pointgroup); } function init_pointlabels(obj) { var points = obj.userData.points; var labels = obj.userData.pointlabels; var pointlabels = new THREE.Group(); pointlabels.name = "pointlabels"; if (Array.isArray(labels)) { for (var i=0; i<points.length; i++) { var point = points[i]; var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<points.length; i++) { var point = points[i]; var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } obj.add(pointlabels); } function init_lines(obj) { var edgeindices = obj.userData.edgeindices; var points = obj.userData.points; var materials = obj.userData.edgematerial; var geometry = new THREE.BufferGeometry(); var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 ); var geometry = new THREE.BufferGeometry(); geometry.setAttribute('position', bufattr); if (Array.isArray(materials)) { for (var i=0; i<materials.length; i++) { geometry.addGroup(2*i,2,i); } } var lines = new THREE.LineSegments(geometry, materials); lines.name = "lines"; obj.add(lines); updateEdgesPosition(obj); } function init_edgelabels(obj) { var points = obj.userData.points; var edgeindices = obj.userData.edgeindices; var labels = obj.userData.edgelabels; var edgelabels = new THREE.Group(); edgelabels.name = "edgelabels"; if (Array.isArray(labels)) { for (var i=0; i<edgeindices.length/2; i++) { var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<edgeindices.length/2; i++) { var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } obj.add(edgelabels); } function init_arrowheads(obj) { var arrowheads = new THREE.Group(); arrowheads.name = "arrowheads"; var arrowstyle = obj.userData.arrowstyle; var edgeindices = obj.userData.edgeindices; var edgematerials = obj.userData.edgematerial; var points = obj.userData.points; var material; if (!Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials.color} ); } for (var i=0; i<edgeindices.length; i=i+2) { var start = points[edgeindices[i]]; var end = points[edgeindices[i+1]]; var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius(); if (dist <= 0) { continue; } var dir = new THREE.Vector3().subVectors(end.vector,start.vector); dir.normalize(); var axis = new THREE.Vector3().set(dir.z,0,-dir.x); axis.normalize(); var radians = Math.acos( dir.y ); var radius = dist/25; var height = dist/5; var geometry = new THREE.ConeBufferGeometry(radius,height); var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2)); if (Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} ); } var cone = new THREE.Mesh( geometry, material ); cone.quaternion.setFromAxisAngle(axis,radians);; cone.position.copy(position);; arrowheads.add(cone); } obj.add(arrowheads); } function init_faces(obj) { var points = obj.userData.points; var facets = obj.userData.facets; obj.userData.triangleindices = []; for (var i=0; i<facets.length; i++) { facet = facets[i]; for (var t=0; t<facet.length-2; t++) { obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]); } } var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute(bufarr,3); var materials = obj.userData.facetmaterial; var geometry = new THREE.BufferGeometry(); var frontmaterials = []; var backmaterials = []; geometry.setAttribute('position',bufattr); if (Array.isArray(materials)) { var tricount = 0; var facet; for (var i=0; i<facets.length; i++) { facet = facets[i]; geometry.addGroup(tricount,(facet.length-2)*3,i); tricount += (facet.length-2)*3; } for (var j=0; j<materials.length; j++) { var fmat = materials[j].clone() fmat.side = THREE.FrontSide; frontmaterials.push(fmat); var bmat = materials[j].clone() bmat.side = THREE.BackSide; backmaterials.push(bmat); obj.userData.facetmaterial = frontmaterials.concat(backmaterials); } } else if (materials instanceof THREE.Material) { frontmaterials = materials.clone() frontmaterials.side = THREE.FrontSide; backmaterials = materials.clone() backmaterials.side = THREE.BackSide; obj.userData.facetmaterial = [frontmaterials, backmaterials]; } // duplicating the object with front and back should avoid transparency issues var backmesh = new THREE.Mesh(geometry, backmaterials); // meshname is used to show/hide objects backmesh.name = "backfaces"; obj.add(backmesh); var frontmesh = new THREE.Mesh(geometry, frontmaterials); frontmesh.name = "frontfaces"; obj.add(frontmesh); updateFacesPosition(obj); } // //INITIALIZING function updateFacesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.triangleindices; var faces = obj.getObjectByName("frontfaces"); var ba = faces.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } faces.geometry.attributes.position.needsUpdate = true; } function updateEdgesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.edgeindices; var lines = obj.getObjectByName("lines"); var ba = lines.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } lines.geometry.attributes.position.needsUpdate = true; } function onWindowResize() { renderer.setSize( three.clientWidth, three.clientHeight ); svgRenderer.setSize( three.clientWidth, three.clientHeight ); updateCamera(); } function updateCamera() { var width = three.clientWidth; var height = three.clientHeight; var aspect = width / height; if (camera.type == "OrthographicCamera") { camera.left = frustumSize * aspect / - 2; camera.right = frustumSize * aspect / 2; camera.top = frustumSize / 2; camera.bottom = - frustumSize / 2; } else if (camera.type == "PerspectiveCamera") { camera.aspect = aspect; } camera.updateProjectionMatrix(); } function changeCamera(event) { var selindex = event.currentTarget.selectedIndex; camera = cameras[selindex]; control = controls[selindex]; control.enabled = true; for (var i=0; i<controls.length; i++) { if (i!=selindex) { controls[i].enabled = false; } } updateCamera(); } var camtypenode = document.getElementById('cameraType_3'); camtypenode.onchange = changeCamera; camtypenode.dispatchEvent(new Event('change')); onWindowResize(); window.addEventListener('resize', onWindowResize); var xRotationEnabled = false; var yRotationEnabled = false; var zRotationEnabled = false; var rotationSpeedFactor = 1; var settingsShown = false; var labelsShown = true; var intervals = []; var timeouts = []; var explodingSpeed = 0.05; var explodeScale = 0.000001; var XMLS = new XMLSerializer(); var svgElement; var renderId; var render = function () { renderId = requestAnimationFrame(render); // comment in for automatic explosion // explode(updateFactor()); var phi = 0.02 * rotationSpeedFactor; if (xRotationEnabled) { scene.rotation.x += phi; } if (yRotationEnabled) { scene.rotation.y += phi; } if (zRotationEnabled) { scene.rotation.z += phi; } control.update(); renderer.render(scene, camera); }; if ( THREE.WEBGL.isWebGLAvailable() ) { render(); } else { var warning = WEBGL.getWebGLErrorMessage(); three.appendChild( warning ); } function changeTransparency() { var opacity = 1-Number(event.currentTarget.value); for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].opacity = opacity; } } else { child.userData.facetmaterial.opacity = opacity; } } } } function toggleDepthWrite(event) { depthwrite = event.currentTarget.checked; for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].depthWrite = depthwrite; } } else { child.userData.facetmaterial.depthWrite = depthWrite; } } } } function changeRotationX(event){ xRotationEnabled = event.currentTarget.checked; } function changeRotationY(event){ yRotationEnabled = event.currentTarget.checked; } function changeRotationZ(event){ zRotationEnabled = event.currentTarget.checked; } function changeRotationSpeedFactor(event){ rotationSpeedFactor = Number(event.currentTarget.value); } function resetScene(){ scene.rotation.set(0,0,0); camera.position.set(0,0,5); camera.up.set(0,1,0); } function showSettings(event){ document.getElementById('settings_3').style.visibility = 'visible'; document.getElementById('showSettingsButton_3').style.visibility = 'hidden'; document.getElementById('hideSettingsButton_3').style.visibility = 'visible'; settingsShown = true; } function hideSettings(event){ document.getElementById('settings_3').style.visibility = 'hidden'; document.getElementById('showSettingsButton_3').style.visibility = 'visible'; document.getElementById('hideSettingsButton_3').style.visibility = 'hidden'; settingsShown = false; } var pos = 150* Math.PI; function updateFactor() { pos++; return Math.sin(.01*pos)+1; } // ------------------------ FOLDING ------------------------------------------------ // --------------------------------------------------------------------------------- // rotate point p around axis defined by points p1 and p2 by given angle function rotate(p, p1, p2, angle ){ angle = -angle; var x = p.x, y = p.y, z = p.z, a = p1.x, b = p1.y, c = p1.z, u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z; var result = []; var L = u*u + v*v + w*w; var sqrt = Math.sqrt; var cos = Math.cos; var sin = Math.sin; result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L; result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L; result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L; return result; } var fold = function(event){ var obj = foldables[Number(event.currentTarget.name)]; var foldvalue = Number(event.currentTarget.value); var scale = foldvalue - obj.userData.oldscale; for (var j=0; j<obj.userData.axes.length; j++) { rotateVertices(obj, j, scale); } update(obj); obj.userData.oldscale += scale; lookAtBarycenter(obj); } function lookAtBarycenter(obj){ control.target = barycenter(obj); } function barycenter(obj) { var center = new THREE.Vector3(0,0,0); var points = obj.userData.points; for (var i=0; i<points.length; i++){ center.add(points[i].vector); } center.divideScalar(points.length); return center; } function rotateVertices(obj, edge, scale) { var axes = obj.userData.axes; var subtrees = obj.userData.subtrees; var points = obj.userData.points; var angles = obj.userData.angles; if (edge < axes.length){ for (var j=0; j<subtrees[edge].length; j++){ var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge])); points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]); } } } function update(obj) { updateFacesPosition(obj); updateEdgesPosition(obj); } if (foldables.length) { var settings = document.getElementById('settings_3'); var foldDiv = document.createElement('div'); foldDiv.id = 'fold_3'; var title = document.createElement('strong'); title.innerHTML = 'Fold'; foldDiv.appendChild(title); foldDiv.className = 'group'; for (var i=0; i<foldables.length; i++) { var range = document.createElement('input'); range.type = 'range'; range.min = 0; range.max = 1; range.value = 0; range.step = 0.001; range.name = String(i); range.oninput = fold; foldDiv.appendChild(range); } lookAtBarycenter(foldables[0]); settings.insertBefore(foldDiv,settings.childNodes[0]); } // ---------------------- EXPLOSION ------------------------------------------------ // --------------------------------------------------------------------------------- if (explodableModel) { for (var i=0; i<scene.children.length; i++) { obj = scene.children[i]; if ( obj.userData.explodable ) { computeCentroid(obj); } } document.getElementById('explodeRange_3').oninput = triggerExplode; document.getElementById('explodeCheckbox_3').onchange = triggerAutomaticExplode; document.getElementById('explodingSpeedRange_3').oninput = setExplodingSpeed; explode(0.000001); } function computeCentroid(obj) { centroid = new THREE.Vector3(); obj.userData.points.forEach(function(pmpoint) { centroid.add(pmpoint.vector); }); centroid.divideScalar(obj.userData.points.length); obj.userData.centroid = centroid; } function explode(factor) { for (var i=0; i<scene.children.length; i++) { var obj = scene.children[i]; if (obj.userData.hasOwnProperty("centroid")) { var c = obj.userData.centroid; obj.position.set(c.x*factor, c.y*factor, c.z*factor); } } } function triggerExplode(event){ explodeScale = Number(event.currentTarget.value); explode(explodeScale); } function setExplodingSpeed(event){ explodingSpeed = Number(event.currentTarget.value); } function triggerAutomaticExplode(event){ if (event.currentTarget.checked){ startExploding(); } else { clearIntervals(); } } function startExploding(){ intervals.push(setInterval(explodingInterval, 25)); } function explodingInterval(){ explodeScale += explodingSpeed; if (explodeScale <= 6){ explode(explodeScale); } else{ explode(6); explodeScale = 6; clearIntervals(); timeouts.push(setTimeout(startUnexploding, 3000)); } document.getElementById('explodeRange_3').value = explodeScale; } function startUnexploding(){ intervals.push(setInterval(unexplodingInterval, 25)); } function unexplodingInterval(){ explodeScale -= explodingSpeed; if (explodeScale >= 0){ explode(explodeScale); } else { explode(0); explodeScale = 0; clearIntervals(); timeouts.push(setTimeout(startExploding, 3000)); } document.getElementById('explodeRange_3').value = explodeScale; } function clearIntervals(){ intervals.forEach(function(interval){ clearInterval(interval); }); intervals = []; timeouts.forEach(function(timeout){ clearTimeout(timeout); }); timeouts = []; } // ---------------------- DISPLAY -------------------------------------------------- // --------------------------------------------------------------------------------- const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" }; const objectTypeVisible = {}; Object.assign(objectTypeVisible,modelContains); const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort(); const shownObjectTypesList = document.getElementById('shownObjectTypesList_3'); function setVisibility(bool,objname) { for (var i=0; i<scene.children.length; i++){ var obj = scene.children[i].getObjectByName(objname); if (obj) { obj.visible = bool; } } } function toggleObjectTypeVisibility(event){ var name = event.currentTarget.name; var checked = event.currentTarget.checked; objectTypeVisible[name] = checked; if (name == "faces") { setVisibility(checked,"frontfaces"); setVisibility(checked,"backfaces"); } else { setVisibility(checked,name); } } for (var i=0; i<sortedObjectTypeKeys.length; i++){ var key = sortedObjectTypeKeys[i]; if (modelContains[key]) { var objTypeNode = document.createElement('span'); objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = key; checkbox.onchange = toggleObjectTypeVisibility; shownObjectTypesList.appendChild(checkbox); shownObjectTypesList.appendChild(objTypeNode); } } // ------------------------------------------------------ function toggleObjectVisibility(event){ var nr = Number(event.currentTarget.name); scene.children[nr].visible = event.currentTarget.checked; } // append checkboxes for displaying or hiding objects var shownObjectsList = document.getElementById('shownObjectsList_3'); for (var i=0; i<scene.children.length; i++){ obj = scene.children[i]; var objNode = document.createElement('span'); objNode.innerHTML = obj.name + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = String(i); checkbox.onchange = toggleObjectVisibility; shownObjectsList.appendChild(checkbox); shownObjectsList.appendChild(objNode); } // ---------------------- SVG ------------------------------------------------------ // --------------------------------------------------------------------------------- function takeSvgScreenshot() { if (objectTypeVisible["pointlabels"]) { setVisibility(false,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(false,"edgelabels"); } svgRenderer.render(scene,camera); svgElement = XMLS.serializeToString(svgRenderer.domElement); if (objectTypeVisible["pointlabels"]) { setVisibility(true,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(true,"edgelabels"); } if (document.getElementById('tab_3').checked){ //show in new tab var myWindow = window.open("",""); myWindow.document.body.innerHTML = svgElement; } else{ // download svg file download("screenshot.svg", svgElement); } } function download(filename, text) { var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } document.getElementById('transparencyRange_3').oninput = changeTransparency; document.getElementById('depthWriteCheckbox_3').onchange = toggleDepthWrite; document.getElementById('changeRotationX_3').onchange = changeRotationX; document.getElementById('changeRotationY_3').onchange = changeRotationY; document.getElementById('changeRotationZ_3').onchange = changeRotationZ; document.getElementById('resetButton_3').onclick = resetScene; document.getElementById('rotationSpeedRange_3').oninput = changeRotationSpeedFactor; document.getElementById('takeScreenshot_3').onclick = takeSvgScreenshot; document.getElementById('showSettingsButton_3').onclick = showSettings; document.getElementById('hideSettingsButton_3').onclick = hideSettings; // ------------------ SHORTCUTS -------------------------------------------- // ------------------------------------------------------------------------- /** * http://www.openjs.com/scripts/events/keyboard_shortcuts/ * Version : 2.01.B * By Binny V A * License : BSD */ shortcut = { 'all_shortcuts':{},//All the shortcuts are stored in this array 'add': function(shortcut_combination,callback,opt) { //Provide a set of default options var default_options = { 'type':'keydown', 'propagate':false, 'disable_in_input':false, 'target':document, 'keycode':false } if(!opt) opt = default_options; else { for(var dfo in default_options) { if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo]; } } var ele = opt.target; if(typeof opt.target == 'string') ele = document.getElementById(opt.target); var ths = this; shortcut_combination = shortcut_combination.toLowerCase(); //The function to be called at keypress var func = function(e) { e = e || window.event; if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields var element; if(e.target) element=e.target; else if(e.srcElement) element=e.srcElement; if(element.nodeType==3) element=element.parentNode; if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return; } //Find Which key is pressed if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; var character = String.fromCharCode(code).toLowerCase(); if(code == 188) character=","; //If the user presses , when the type is onkeydown if(code == 190) character="."; //If the user presses , when the type is onkeydown var keys = shortcut_combination.split("+"); //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked var kp = 0; //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken var shift_nums = { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&", "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<", ".":">", "/":"?", "\\":"|" } //Special Keys - and their codes var special_keys = { 'esc':27, 'escape':27, 'tab':9, 'space':32, 'return':13, 'enter':13, 'backspace':8, 'scrolllock':145, 'scroll_lock':145, 'scroll':145, 'capslock':20, 'caps_lock':20, 'caps':20, 'numlock':144, 'num_lock':144, 'num':144, 'pause':19, 'break':19, 'insert':45, 'home':36, 'delete':46, 'end':35, 'pageup':33, 'page_up':33, 'pu':33, 'pagedown':34, 'page_down':34, 'pd':34, 'left':37, 'up':38, 'right':39, 'down':40, 'f1':112, 'f2':113, 'f3':114, 'f4':115, 'f5':116, 'f6':117, 'f7':118, 'f8':119, 'f9':120, 'f10':121, 'f11':122, 'f12':123 } var modifiers = { shift: { wanted:false, pressed:false}, ctrl : { wanted:false, pressed:false}, alt : { wanted:false, pressed:false}, meta : { wanted:false, pressed:false} //Meta is Mac specific }; if(e.ctrlKey) modifiers.ctrl.pressed = true; if(e.shiftKey) modifiers.shift.pressed = true; if(e.altKey) modifiers.alt.pressed = true; if(e.metaKey) modifiers.meta.pressed = true; for(var i=0; k=keys[i],i<keys.length; i++) { //Modifiers if(k == 'ctrl' || k == 'control') { kp++; modifiers.ctrl.wanted = true; } else if(k == 'shift') { kp++; modifiers.shift.wanted = true; } else if(k == 'alt') { kp++; modifiers.alt.wanted = true; } else if(k == 'meta') { kp++; modifiers.meta.wanted = true; } else if(k.length > 1) { //If it is a special key if(special_keys[k] == code) kp++; } else if(opt['keycode']) { if(opt['keycode'] == code) kp++; } else { //The special keys did not match if(character == k) kp++; else { if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase character = shift_nums[character]; if(character == k) kp++; } } } } if(kp == keys.length && modifiers.ctrl.pressed == modifiers.ctrl.wanted && modifiers.shift.pressed == modifiers.shift.wanted && modifiers.alt.pressed == modifiers.alt.wanted && modifiers.meta.pressed == modifiers.meta.wanted) { callback(e); if(!opt['propagate']) { //Stop the event //e.cancelBubble is supported by IE - this will kill the bubbling process. e.cancelBubble = true; e.returnValue = false; //e.stopPropagation works in Firefox. if (e.stopPropagation) { e.stopPropagation(); e.preventDefault(); } return false; } } } this.all_shortcuts[shortcut_combination] = { 'callback':func, 'target':ele, 'event': opt['type'] }; //Attach the function with the event if(ele.addEventListener) ele.addEventListener(opt['type'], func, false); else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func); else ele['on'+opt['type']] = func; }, //Remove the shortcut - just specify the shortcut and I will remove the binding 'remove':function(shortcut_combination) { shortcut_combination = shortcut_combination.toLowerCase(); var binding = this.all_shortcuts[shortcut_combination]; delete(this.all_shortcuts[shortcut_combination]) if(!binding) return; var type = binding['event']; var ele = binding['target']; var callback = binding['callback']; if(ele.detachEvent) ele.detachEvent('on'+type, callback); else if(ele.removeEventListener) ele.removeEventListener(type, callback, false); else ele['on'+type] = false; } } shortcut.add("Alt+Left",function() { var event = new Event('click'); if (settingsShown){ document.getElementById('hideSettingsButton_3').dispatchEvent(event); } else { document.getElementById('showSettingsButton_3').dispatchEvent(event); } }); // COMMON_CODE_BLOCK_END });}); </script> </body> </html> </HTML> ==== Example 2: a hyperbolic torus with three cusps ==== <code perl> > $T3 = new Matrix<Int>([[1,0,2,17],[2,1,4,14],[0,2,0,6],[1,2,8,16],[0,1,5,10],[2,1,12,1],[0,2,9,3],[0,1,13,7],[0,2,15,11]]); > $s = new HyperbolicSurface(DCEL=>$T3, PENNER_COORDINATES=>[2,1,1,1,1,1,1,1,1], SPECIAL_POINT=>[1,0]); </code> <html><img src="/lib/exe/fetch.php?media=tutorials/release/4.11/hyperbolic_surface_tutorial/paper_skizzen_3_281_29.png" tooltip="paper_skizzen_3_281_29.png" class="center-block"></html> <code perl> > $f = $s->SECONDARY_FAN; > $f->VISUAL; </code> <HTML> <!-- polymake for knusper Thu Mar 3 00:31:41 2022 fan: --> <html> <head> <meta charset=utf-8> <title>fan:</title> <style> /* // COMMON_CODE_BLOCK_BEGIN */ html {overflow: scroll;} strong{font-size: 18px;} canvas { z-index: 8; } input[type='radio'] {margin-left:0;} input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;} .group{padding-bottom: 15px;} .settings * {z-index: 11; } .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;} .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;} .showSettingsButton{visibility: visible; z-index: 12; position: absolute } .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5} button{margin-left: 0; margin-top: 10px} img{cursor: pointer;} .suboption{padding-top: 15px;} #model74777500492 { width: 100%; height: 100%; } .threejs_container { width: 100%; height: 75vh;} .settings{max-height: 74vh} input[type=range] { -webkit-appearance: none; padding:0; width:90%; margin-left: auto; margin-right: auto; margin-top: 15px; margin-bottom: 15px; display: block; } input[type=range]:focus { outline: none; } input[type=range]::-webkit-slider-runnable-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-webkit-slider-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; -webkit-appearance: none; margin-top: -5px; } input[type=range]:focus::-webkit-slider-runnable-track { background: #E3E3E3; } input[type=range]::-moz-range-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-moz-range-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]::-ms-track { height: 4px; cursor: pointer; animate: 0.2s; background: transparent; border-color: transparent; color: transparent; } input[type=range]::-ms-fill-lower { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-fill-upper { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]:focus::-ms-fill-lower { background: #E3E3E3; } input[type=range]:focus::-ms-fill-upper { background: #E3E3E3; } /* // COMMON_CODE_BLOCK_END */ </style> </head> <body> <div class='threejs_container'> <div id='settings_4' class='settings'> <div class=group id='explode_4'> <strong>Explode</strong> <input id='explodeRange_4' type='range' min='0.00001' max=6 step=0.01 value=0.00001> <div class=indented><input id='explodeCheckbox_4' type='checkbox'>Automatic explosion</div> <div class=suboption>Exploding speed</div> <input id='explodingSpeedRange_4' type='range' min=0 max=0.5 step=0.001 value=0.05> </div> <div class=group id='transparency_4' class='transparency'> <strong>Transparency</strong> <input id='transparencyRange_4' type='range' min=0 max=1 step=0.01 value=0> <div class=indented><input id='depthWriteCheckbox_4' type='checkbox'>depthWrite</div> </div> <div class=group id='rotation_4'> <strong>Rotation</strong> <div class=indented> <div><input type='checkbox' id='changeRotationX_4'> x-axis</div> <div><input type='checkbox' id='changeRotationY_4'> y-axis</div> <div><input type='checkbox' id='changeRotationZ_4'> z-axis</div> <button id='resetButton_4'>Reset</button> </div> <div class=suboption>Rotation speed</div> <input id='rotationSpeedRange_4' type='range' min=0 max=5 step=0.01 value=2> </div> <div class=group id='display_4'> <strong>Display</strong> <div class=indented> <div id='shownObjectTypesList_4' class='shownObjectsList'></div> </div> <div class=suboption>Objects</div> <div class=indented> <div id='shownObjectsList_4' class='shownObjectsList'></div> </div> </div> <div class=group id='camera_4'> <strong>Camera</strong> <div class=indented> <form> <select id="cameraType_4"> <option value='perspective' selected> Perspective<br></option> <option value='orthographic' > Orthographic<br></option> </select> </form> </div> </div> <div class=group id='svg_4'> <strong>SVG</strong> <div class=indented> <form> <input type="radio" name='screenshotMode' value='download' id='download_4' checked> Download<br> <input type="radio" name='screenshotMode' value='tab' id='tab_4' > New tab<br> </form> <button id='takeScreenshot_4'>Screenshot</button> </div> </div> </div> <!-- end of settings --> <img id='hideSettingsButton_4' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px"> <img id='showSettingsButton_4' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px"> <div id="model74777500492"></div> </div> <script> requirejs.config({ paths: { three: '/kernelspecs/r118/polymake/three', TrackballControls: '/kernelspecs/r118/polymake/TrackballControls', OrbitControls: '/kernelspecs/r118/polymake/OrbitControls', Projector: '/kernelspecs/r118/polymake/Projector', SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer', WEBGL: '/kernelspecs/r118/polymake/WebGL', }, shim: { 'three': { exports: 'THREE'}, 'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' }, 'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' }, 'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' }, 'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' }, 'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' }, } }); require(['three'],function(THREE){ window.THREE = THREE; require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'], function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) { THREE.TrackballControls = TrackballControls; THREE.OrbitControls = OrbitControls; THREE.Projector = Projector; THREE.SVGRenderer = SVGRenderer; THREE.WEBGL = WEBGL; // COMMON_CODE_BLOCK_BEGIN const intervalLength = 25; // for automatic animations const explodableModel = true; const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false }; const foldables = []; var three = document.getElementById("model74777500492"); var scene = new THREE.Scene(); var renderer = new THREE.WebGLRenderer( { antialias: true } ); var svgRenderer = new THREE.SVGRenderer( { antialias: true } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setClearColor(0xFFFFFF, 1); svgRenderer.setClearColor(0xFFFFFF, 1); three.appendChild(renderer.domElement); var frustumSize = 4; var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()]; cameras.forEach(function(cam) { cam.position.set(0, 0, 5); cam.lookAt(0, 0, 0); cam.up.set(0, 1, 0); }); var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)]; var camera, control; controls[0].zoomSpeed = 0.2; controls[0].rotateSpeed = 4; // class to allow move points together with labels and spheres var PMPoint = function (x,y,z) { this.vector = new THREE.Vector3(x,y,z); this.sprite = null; this.sphere = null; } PMPoint.prototype.addLabel = function(labelsprite) { this.sprite = labelsprite; this.sprite.position.copy(this.vector); } PMPoint.prototype.addSphere = function(spheremesh) { this.sphere = spheremesh; this.sphere.position.copy(this.vector); } PMPoint.prototype.set = function(x,y,z) { this.vector.set(x,y,z); if (this.sprite) { this.sprite.position.copy(this.vector); } if (this.sphere) { this.sphere.position.copy(this.vector); } } PMPoint.prototype.radius = function() { if (this.sphere) { return this.sphere.geometry.parameters.radius; } else { return 0; } }; // select the target node var target = document.querySelector('#model74777500492'); // create an observer instance var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.removedNodes && mutation.removedNodes.length > 0) { cancelAnimationFrame(renderId); observer.disconnect(); console.log("cancelled frame "+renderId); } }); }); // configuration of the observer: var config = { childList: true, characterData: true } // pass in the target node, as well as the observer options while (target) { if (target.className=="output") { observer.observe(target, config); break; } target = target.parentNode; } // COMMON_CODE_BLOCK_END var obj0 = new THREE.Object3D(); obj0.name = "Rays"; obj0.userData.explodable = 0; obj0.userData.points = []; obj0.userData.points.push(new PMPoint(0, 0, 0)); obj0.userData.points.push(new PMPoint(0, 0.529999, 0.847998)); obj0.userData.points.push(new PMPoint(0.451039, 0.751731, 0.481108)); obj0.userData.points.push(new PMPoint(0.529999, 0, 0.847998)); obj0.userData.points.push(new PMPoint(0.751731, 0.451039, 0.481108)); obj0.userData.points.push(new PMPoint(0.707107, 0.707107, 0)); obj0.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466)); obj0.userData.points.push(new PMPoint(0, 0, 1)); obj0.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466)); obj0.userData.points.push(new PMPoint(0.882353, 0, 0.470588)); obj0.userData.points.push(new PMPoint(0, 0.882353, 0.470588)); obj0.userData.points.push(new PMPoint(0.948683, 0.316228, 0)); obj0.userData.points.push(new PMPoint(0.316228, 0.948683, 0)); obj0.userData.points.push(new PMPoint(1, 0, 0)); obj0.userData.points.push(new PMPoint(0, 1, 0)); obj0.userData.pointradii = 0.02; <!-- Vertex style --> obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj0.userData.pointlabels = [" ", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"]; obj0.userData.edgeindices = [1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14, 0]; <!-- Edge style --> obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); init_object(obj0); scene.add(obj0); var obj1 = new THREE.Object3D(); obj1.name = "unnamed__1"; obj1.userData.explodable = 1; obj1.userData.points = []; obj1.userData.points.push(new PMPoint(0, 0.529999, 0.847998)); obj1.userData.points.push(new PMPoint(0.451039, 0.751731, 0.481108)); obj1.userData.points.push(new PMPoint(0.529999, 0, 0.847998)); obj1.userData.points.push(new PMPoint(0.751731, 0.451039, 0.481108)); obj1.userData.points.push(new PMPoint(0, 0, 0)); obj1.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4]; <!-- Edge style --> obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj1.userData.facets = [[4, 2, 0], [3, 2, 4], [1, 3, 4], [4, 0, 1], [0, 2, 3, 1]]; <!-- Facet style --> obj1.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj1); scene.add(obj1); var obj2 = new THREE.Object3D(); obj2.name = "unnamed__2"; obj2.userData.explodable = 1; obj2.userData.points = []; obj2.userData.points.push(new PMPoint(0.451039, 0.751731, 0.481108)); obj2.userData.points.push(new PMPoint(0.751731, 0.451039, 0.481108)); obj2.userData.points.push(new PMPoint(0.707107, 0.707107, 0)); obj2.userData.points.push(new PMPoint(0, 0, 0)); obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj2.userData.facets = [[1, 3, 2], [0, 3, 1], [2, 3, 0], [1, 2, 0]]; <!-- Facet style --> obj2.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj2); scene.add(obj2); var obj3 = new THREE.Object3D(); obj3.name = "unnamed__3"; obj3.userData.explodable = 1; obj3.userData.points = []; obj3.userData.points.push(new PMPoint(0.529999, 0, 0.847998)); obj3.userData.points.push(new PMPoint(0.751731, 0.451039, 0.481108)); obj3.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466)); obj3.userData.points.push(new PMPoint(0, 0, 0)); obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj3.userData.facets = [[1, 3, 0], [2, 3, 1], [0, 3, 2], [1, 0, 2]]; <!-- Facet style --> obj3.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj3); scene.add(obj3); var obj4 = new THREE.Object3D(); obj4.name = "unnamed__4"; obj4.userData.explodable = 1; obj4.userData.points = []; obj4.userData.points.push(new PMPoint(0, 0.529999, 0.847998)); obj4.userData.points.push(new PMPoint(0.529999, 0, 0.847998)); obj4.userData.points.push(new PMPoint(0, 0, 1)); obj4.userData.points.push(new PMPoint(0, 0, 0)); obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj4.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]]; <!-- Facet style --> obj4.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj4); scene.add(obj4); var obj5 = new THREE.Object3D(); obj5.name = "unnamed__5"; obj5.userData.explodable = 1; obj5.userData.points = []; obj5.userData.points.push(new PMPoint(0, 0.529999, 0.847998)); obj5.userData.points.push(new PMPoint(0.451039, 0.751731, 0.481108)); obj5.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466)); obj5.userData.points.push(new PMPoint(0, 0, 0)); obj5.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj5.userData.facets = [[1, 3, 2], [0, 3, 1], [2, 3, 0], [1, 2, 0]]; <!-- Facet style --> obj5.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj5); scene.add(obj5); var obj6 = new THREE.Object3D(); obj6.name = "unnamed__6"; obj6.userData.explodable = 1; obj6.userData.points = []; obj6.userData.points.push(new PMPoint(0.751731, 0.451039, 0.481108)); obj6.userData.points.push(new PMPoint(0.707107, 0.707107, 0)); obj6.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466)); obj6.userData.points.push(new PMPoint(0, 0, 0)); obj6.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj6.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]]; <!-- Facet style --> obj6.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj6); scene.add(obj6); var obj7 = new THREE.Object3D(); obj7.name = "unnamed__7"; obj7.userData.explodable = 1; obj7.userData.points = []; obj7.userData.points.push(new PMPoint(0.451039, 0.751731, 0.481108)); obj7.userData.points.push(new PMPoint(0.707107, 0.707107, 0)); obj7.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466)); obj7.userData.points.push(new PMPoint(0, 0, 0)); obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj7.userData.facets = [[3, 0, 2], [1, 0, 3], [3, 2, 1], [2, 0, 1]]; <!-- Facet style --> obj7.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj7); scene.add(obj7); var obj8 = new THREE.Object3D(); obj8.name = "unnamed__8"; obj8.userData.explodable = 1; obj8.userData.points = []; obj8.userData.points.push(new PMPoint(0.529999, 0, 0.847998)); obj8.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466)); obj8.userData.points.push(new PMPoint(0.882353, 0, 0.470588)); obj8.userData.points.push(new PMPoint(0, 0, 0)); obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj8.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]]; <!-- Facet style --> obj8.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj8); scene.add(obj8); var obj9 = new THREE.Object3D(); obj9.name = "unnamed__9"; obj9.userData.explodable = 1; obj9.userData.points = []; obj9.userData.points.push(new PMPoint(0, 0.529999, 0.847998)); obj9.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466)); obj9.userData.points.push(new PMPoint(0, 0.882353, 0.470588)); obj9.userData.points.push(new PMPoint(0, 0, 0)); obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj9.userData.facets = [[3, 0, 2], [1, 0, 3], [3, 2, 1], [2, 0, 1]]; <!-- Facet style --> obj9.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj9); scene.add(obj9); var obj10 = new THREE.Object3D(); obj10.name = "unnamed__10"; obj10.userData.explodable = 1; obj10.userData.points = []; obj10.userData.points.push(new PMPoint(0.707107, 0.707107, 0)); obj10.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466)); obj10.userData.points.push(new PMPoint(0.948683, 0.316228, 0)); obj10.userData.points.push(new PMPoint(0, 0, 0)); obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj10.userData.facets = [[3, 1, 0], [2, 1, 3], [3, 0, 2], [0, 1, 2]]; <!-- Facet style --> obj10.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj10); scene.add(obj10); var obj11 = new THREE.Object3D(); obj11.name = "unnamed__11"; obj11.userData.explodable = 1; obj11.userData.points = []; obj11.userData.points.push(new PMPoint(0.707107, 0.707107, 0)); obj11.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466)); obj11.userData.points.push(new PMPoint(0.316228, 0.948683, 0)); obj11.userData.points.push(new PMPoint(0, 0, 0)); obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj11.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]]; <!-- Facet style --> obj11.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj11); scene.add(obj11); var obj12 = new THREE.Object3D(); obj12.name = "unnamed__12"; obj12.userData.explodable = 1; obj12.userData.points = []; obj12.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466)); obj12.userData.points.push(new PMPoint(0.882353, 0, 0.470588)); obj12.userData.points.push(new PMPoint(0.948683, 0.316228, 0)); obj12.userData.points.push(new PMPoint(1, 0, 0)); obj12.userData.points.push(new PMPoint(0, 0, 0)); obj12.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4]; <!-- Edge style --> obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj12.userData.facets = [[1, 4, 3], [1, 0, 4], [2, 4, 0], [3, 4, 2], [1, 3, 2, 0]]; <!-- Facet style --> obj12.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj12); scene.add(obj12); var obj13 = new THREE.Object3D(); obj13.name = "unnamed__13"; obj13.userData.explodable = 1; obj13.userData.points = []; obj13.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466)); obj13.userData.points.push(new PMPoint(0, 0.882353, 0.470588)); obj13.userData.points.push(new PMPoint(0.316228, 0.948683, 0)); obj13.userData.points.push(new PMPoint(0, 1, 0)); obj13.userData.points.push(new PMPoint(0, 0, 0)); obj13.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4]; <!-- Edge style --> obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj13.userData.facets = [[4, 1, 3], [0, 1, 4], [4, 3, 2], [2, 0, 4], [3, 1, 0, 2]]; <!-- Facet style --> obj13.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj13); scene.add(obj13); // COMMON_CODE_BLOCK_BEGIN function textSpriteMaterial(message, parameters) { if ( parameters === undefined ) parameters = {}; var fontface = "Helvetica"; var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15; fontsize = fontsize*10; var lines = message.split('\\n'); var size = 512; for(var i = 0; i<lines.length; i++){ var tmp = lines[i].length; while(tmp*fontsize > size){ fontsize--; } } var canvas = document.createElement('canvas'); canvas.width = size; canvas.height = size; var context = canvas.getContext('2d'); context.fillStyle = "rgba(255, 255, 255, 0)"; context.fill(); context.font = fontsize + "px " + fontface; // text color context.fillStyle = "rgba(0, 0, 0, 1.0)"; for(var i = 0; i<lines.length; i++){ context.fillText(lines[i], size/2, size/2+i*fontsize); } // canvas contents will be used for a texture var texture = new THREE.Texture(canvas); texture.needsUpdate = true; var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 }); return spriteMaterial; } // ---------------------- INITIALIZING OBJECTS-------------------------------------- // --------------------------------------------------------------------------------- function init_object(obj) { if (obj.userData.hasOwnProperty("pointmaterial")) { init_points(obj); modelContains.points = true; } if (obj.userData.hasOwnProperty("pointlabels")) { init_pointlabels(obj); modelContains.pointlabels = true; } if (obj.userData.hasOwnProperty("edgematerial")) { init_lines(obj); modelContains.lines = true; } if (obj.userData.hasOwnProperty("edgelabels")) { init_edgelabels(obj); modelContains.edgelabels = true; } if (obj.userData.hasOwnProperty("arrowstyle")) { init_arrowheads(obj); modelContains.arrowheads = true; } if (obj.userData.hasOwnProperty("facetmaterial")) { init_faces(obj); modelContains.faces = true; } } function init_points(obj) { var pointgroup = new THREE.Group(); pointgroup.name = "points"; var points = obj.userData.points; var radii = obj.userData.pointradii; var materials = obj.userData.pointmaterial; var geometry,material; if (!Array.isArray(radii)) { geometry = new THREE.SphereBufferGeometry(radii); } if (!Array.isArray(materials)) { material = materials; } for (var i=0; i<points.length; i++) { var point = points[i]; if (Array.isArray(radii)) { if (radii[i] == 0) { continue; } geometry = new THREE.SphereBufferGeometry(radii[i]); } if (Array.isArray(materials)) { material = materials[i]; } var sphere = new THREE.Mesh(geometry, material); point.addSphere(sphere); pointgroup.add(sphere); } obj.add(pointgroup); } function init_pointlabels(obj) { var points = obj.userData.points; var labels = obj.userData.pointlabels; var pointlabels = new THREE.Group(); pointlabels.name = "pointlabels"; if (Array.isArray(labels)) { for (var i=0; i<points.length; i++) { var point = points[i]; var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<points.length; i++) { var point = points[i]; var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } obj.add(pointlabels); } function init_lines(obj) { var edgeindices = obj.userData.edgeindices; var points = obj.userData.points; var materials = obj.userData.edgematerial; var geometry = new THREE.BufferGeometry(); var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 ); var geometry = new THREE.BufferGeometry(); geometry.setAttribute('position', bufattr); if (Array.isArray(materials)) { for (var i=0; i<materials.length; i++) { geometry.addGroup(2*i,2,i); } } var lines = new THREE.LineSegments(geometry, materials); lines.name = "lines"; obj.add(lines); updateEdgesPosition(obj); } function init_edgelabels(obj) { var points = obj.userData.points; var edgeindices = obj.userData.edgeindices; var labels = obj.userData.edgelabels; var edgelabels = new THREE.Group(); edgelabels.name = "edgelabels"; if (Array.isArray(labels)) { for (var i=0; i<edgeindices.length/2; i++) { var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<edgeindices.length/2; i++) { var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } obj.add(edgelabels); } function init_arrowheads(obj) { var arrowheads = new THREE.Group(); arrowheads.name = "arrowheads"; var arrowstyle = obj.userData.arrowstyle; var edgeindices = obj.userData.edgeindices; var edgematerials = obj.userData.edgematerial; var points = obj.userData.points; var material; if (!Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials.color} ); } for (var i=0; i<edgeindices.length; i=i+2) { var start = points[edgeindices[i]]; var end = points[edgeindices[i+1]]; var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius(); if (dist <= 0) { continue; } var dir = new THREE.Vector3().subVectors(end.vector,start.vector); dir.normalize(); var axis = new THREE.Vector3().set(dir.z,0,-dir.x); axis.normalize(); var radians = Math.acos( dir.y ); var radius = dist/25; var height = dist/5; var geometry = new THREE.ConeBufferGeometry(radius,height); var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2)); if (Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} ); } var cone = new THREE.Mesh( geometry, material ); cone.quaternion.setFromAxisAngle(axis,radians);; cone.position.copy(position);; arrowheads.add(cone); } obj.add(arrowheads); } function init_faces(obj) { var points = obj.userData.points; var facets = obj.userData.facets; obj.userData.triangleindices = []; for (var i=0; i<facets.length; i++) { facet = facets[i]; for (var t=0; t<facet.length-2; t++) { obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]); } } var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute(bufarr,3); var materials = obj.userData.facetmaterial; var geometry = new THREE.BufferGeometry(); var frontmaterials = []; var backmaterials = []; geometry.setAttribute('position',bufattr); if (Array.isArray(materials)) { var tricount = 0; var facet; for (var i=0; i<facets.length; i++) { facet = facets[i]; geometry.addGroup(tricount,(facet.length-2)*3,i); tricount += (facet.length-2)*3; } for (var j=0; j<materials.length; j++) { var fmat = materials[j].clone() fmat.side = THREE.FrontSide; frontmaterials.push(fmat); var bmat = materials[j].clone() bmat.side = THREE.BackSide; backmaterials.push(bmat); obj.userData.facetmaterial = frontmaterials.concat(backmaterials); } } else if (materials instanceof THREE.Material) { frontmaterials = materials.clone() frontmaterials.side = THREE.FrontSide; backmaterials = materials.clone() backmaterials.side = THREE.BackSide; obj.userData.facetmaterial = [frontmaterials, backmaterials]; } // duplicating the object with front and back should avoid transparency issues var backmesh = new THREE.Mesh(geometry, backmaterials); // meshname is used to show/hide objects backmesh.name = "backfaces"; obj.add(backmesh); var frontmesh = new THREE.Mesh(geometry, frontmaterials); frontmesh.name = "frontfaces"; obj.add(frontmesh); updateFacesPosition(obj); } // //INITIALIZING function updateFacesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.triangleindices; var faces = obj.getObjectByName("frontfaces"); var ba = faces.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } faces.geometry.attributes.position.needsUpdate = true; } function updateEdgesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.edgeindices; var lines = obj.getObjectByName("lines"); var ba = lines.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } lines.geometry.attributes.position.needsUpdate = true; } function onWindowResize() { renderer.setSize( three.clientWidth, three.clientHeight ); svgRenderer.setSize( three.clientWidth, three.clientHeight ); updateCamera(); } function updateCamera() { var width = three.clientWidth; var height = three.clientHeight; var aspect = width / height; if (camera.type == "OrthographicCamera") { camera.left = frustumSize * aspect / - 2; camera.right = frustumSize * aspect / 2; camera.top = frustumSize / 2; camera.bottom = - frustumSize / 2; } else if (camera.type == "PerspectiveCamera") { camera.aspect = aspect; } camera.updateProjectionMatrix(); } function changeCamera(event) { var selindex = event.currentTarget.selectedIndex; camera = cameras[selindex]; control = controls[selindex]; control.enabled = true; for (var i=0; i<controls.length; i++) { if (i!=selindex) { controls[i].enabled = false; } } updateCamera(); } var camtypenode = document.getElementById('cameraType_4'); camtypenode.onchange = changeCamera; camtypenode.dispatchEvent(new Event('change')); onWindowResize(); window.addEventListener('resize', onWindowResize); var xRotationEnabled = false; var yRotationEnabled = false; var zRotationEnabled = false; var rotationSpeedFactor = 1; var settingsShown = false; var labelsShown = true; var intervals = []; var timeouts = []; var explodingSpeed = 0.05; var explodeScale = 0.000001; var XMLS = new XMLSerializer(); var svgElement; var renderId; var render = function () { renderId = requestAnimationFrame(render); // comment in for automatic explosion // explode(updateFactor()); var phi = 0.02 * rotationSpeedFactor; if (xRotationEnabled) { scene.rotation.x += phi; } if (yRotationEnabled) { scene.rotation.y += phi; } if (zRotationEnabled) { scene.rotation.z += phi; } control.update(); renderer.render(scene, camera); }; if ( THREE.WEBGL.isWebGLAvailable() ) { render(); } else { var warning = WEBGL.getWebGLErrorMessage(); three.appendChild( warning ); } function changeTransparency() { var opacity = 1-Number(event.currentTarget.value); for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].opacity = opacity; } } else { child.userData.facetmaterial.opacity = opacity; } } } } function toggleDepthWrite(event) { depthwrite = event.currentTarget.checked; for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].depthWrite = depthwrite; } } else { child.userData.facetmaterial.depthWrite = depthWrite; } } } } function changeRotationX(event){ xRotationEnabled = event.currentTarget.checked; } function changeRotationY(event){ yRotationEnabled = event.currentTarget.checked; } function changeRotationZ(event){ zRotationEnabled = event.currentTarget.checked; } function changeRotationSpeedFactor(event){ rotationSpeedFactor = Number(event.currentTarget.value); } function resetScene(){ scene.rotation.set(0,0,0); camera.position.set(0,0,5); camera.up.set(0,1,0); } function showSettings(event){ document.getElementById('settings_4').style.visibility = 'visible'; document.getElementById('showSettingsButton_4').style.visibility = 'hidden'; document.getElementById('hideSettingsButton_4').style.visibility = 'visible'; settingsShown = true; } function hideSettings(event){ document.getElementById('settings_4').style.visibility = 'hidden'; document.getElementById('showSettingsButton_4').style.visibility = 'visible'; document.getElementById('hideSettingsButton_4').style.visibility = 'hidden'; settingsShown = false; } var pos = 150* Math.PI; function updateFactor() { pos++; return Math.sin(.01*pos)+1; } // ------------------------ FOLDING ------------------------------------------------ // --------------------------------------------------------------------------------- // rotate point p around axis defined by points p1 and p2 by given angle function rotate(p, p1, p2, angle ){ angle = -angle; var x = p.x, y = p.y, z = p.z, a = p1.x, b = p1.y, c = p1.z, u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z; var result = []; var L = u*u + v*v + w*w; var sqrt = Math.sqrt; var cos = Math.cos; var sin = Math.sin; result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L; result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L; result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L; return result; } var fold = function(event){ var obj = foldables[Number(event.currentTarget.name)]; var foldvalue = Number(event.currentTarget.value); var scale = foldvalue - obj.userData.oldscale; for (var j=0; j<obj.userData.axes.length; j++) { rotateVertices(obj, j, scale); } update(obj); obj.userData.oldscale += scale; lookAtBarycenter(obj); } function lookAtBarycenter(obj){ control.target = barycenter(obj); } function barycenter(obj) { var center = new THREE.Vector3(0,0,0); var points = obj.userData.points; for (var i=0; i<points.length; i++){ center.add(points[i].vector); } center.divideScalar(points.length); return center; } function rotateVertices(obj, edge, scale) { var axes = obj.userData.axes; var subtrees = obj.userData.subtrees; var points = obj.userData.points; var angles = obj.userData.angles; if (edge < axes.length){ for (var j=0; j<subtrees[edge].length; j++){ var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge])); points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]); } } } function update(obj) { updateFacesPosition(obj); updateEdgesPosition(obj); } if (foldables.length) { var settings = document.getElementById('settings_4'); var foldDiv = document.createElement('div'); foldDiv.id = 'fold_4'; var title = document.createElement('strong'); title.innerHTML = 'Fold'; foldDiv.appendChild(title); foldDiv.className = 'group'; for (var i=0; i<foldables.length; i++) { var range = document.createElement('input'); range.type = 'range'; range.min = 0; range.max = 1; range.value = 0; range.step = 0.001; range.name = String(i); range.oninput = fold; foldDiv.appendChild(range); } lookAtBarycenter(foldables[0]); settings.insertBefore(foldDiv,settings.childNodes[0]); } // ---------------------- EXPLOSION ------------------------------------------------ // --------------------------------------------------------------------------------- if (explodableModel) { for (var i=0; i<scene.children.length; i++) { obj = scene.children[i]; if ( obj.userData.explodable ) { computeCentroid(obj); } } document.getElementById('explodeRange_4').oninput = triggerExplode; document.getElementById('explodeCheckbox_4').onchange = triggerAutomaticExplode; document.getElementById('explodingSpeedRange_4').oninput = setExplodingSpeed; explode(0.000001); } function computeCentroid(obj) { centroid = new THREE.Vector3(); obj.userData.points.forEach(function(pmpoint) { centroid.add(pmpoint.vector); }); centroid.divideScalar(obj.userData.points.length); obj.userData.centroid = centroid; } function explode(factor) { for (var i=0; i<scene.children.length; i++) { var obj = scene.children[i]; if (obj.userData.hasOwnProperty("centroid")) { var c = obj.userData.centroid; obj.position.set(c.x*factor, c.y*factor, c.z*factor); } } } function triggerExplode(event){ explodeScale = Number(event.currentTarget.value); explode(explodeScale); } function setExplodingSpeed(event){ explodingSpeed = Number(event.currentTarget.value); } function triggerAutomaticExplode(event){ if (event.currentTarget.checked){ startExploding(); } else { clearIntervals(); } } function startExploding(){ intervals.push(setInterval(explodingInterval, 25)); } function explodingInterval(){ explodeScale += explodingSpeed; if (explodeScale <= 6){ explode(explodeScale); } else{ explode(6); explodeScale = 6; clearIntervals(); timeouts.push(setTimeout(startUnexploding, 3000)); } document.getElementById('explodeRange_4').value = explodeScale; } function startUnexploding(){ intervals.push(setInterval(unexplodingInterval, 25)); } function unexplodingInterval(){ explodeScale -= explodingSpeed; if (explodeScale >= 0){ explode(explodeScale); } else { explode(0); explodeScale = 0; clearIntervals(); timeouts.push(setTimeout(startExploding, 3000)); } document.getElementById('explodeRange_4').value = explodeScale; } function clearIntervals(){ intervals.forEach(function(interval){ clearInterval(interval); }); intervals = []; timeouts.forEach(function(timeout){ clearTimeout(timeout); }); timeouts = []; } // ---------------------- DISPLAY -------------------------------------------------- // --------------------------------------------------------------------------------- const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" }; const objectTypeVisible = {}; Object.assign(objectTypeVisible,modelContains); const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort(); const shownObjectTypesList = document.getElementById('shownObjectTypesList_4'); function setVisibility(bool,objname) { for (var i=0; i<scene.children.length; i++){ var obj = scene.children[i].getObjectByName(objname); if (obj) { obj.visible = bool; } } } function toggleObjectTypeVisibility(event){ var name = event.currentTarget.name; var checked = event.currentTarget.checked; objectTypeVisible[name] = checked; if (name == "faces") { setVisibility(checked,"frontfaces"); setVisibility(checked,"backfaces"); } else { setVisibility(checked,name); } } for (var i=0; i<sortedObjectTypeKeys.length; i++){ var key = sortedObjectTypeKeys[i]; if (modelContains[key]) { var objTypeNode = document.createElement('span'); objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = key; checkbox.onchange = toggleObjectTypeVisibility; shownObjectTypesList.appendChild(checkbox); shownObjectTypesList.appendChild(objTypeNode); } } // ------------------------------------------------------ function toggleObjectVisibility(event){ var nr = Number(event.currentTarget.name); scene.children[nr].visible = event.currentTarget.checked; } // append checkboxes for displaying or hiding objects var shownObjectsList = document.getElementById('shownObjectsList_4'); for (var i=0; i<scene.children.length; i++){ obj = scene.children[i]; var objNode = document.createElement('span'); objNode.innerHTML = obj.name + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = String(i); checkbox.onchange = toggleObjectVisibility; shownObjectsList.appendChild(checkbox); shownObjectsList.appendChild(objNode); } // ---------------------- SVG ------------------------------------------------------ // --------------------------------------------------------------------------------- function takeSvgScreenshot() { if (objectTypeVisible["pointlabels"]) { setVisibility(false,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(false,"edgelabels"); } svgRenderer.render(scene,camera); svgElement = XMLS.serializeToString(svgRenderer.domElement); if (objectTypeVisible["pointlabels"]) { setVisibility(true,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(true,"edgelabels"); } if (document.getElementById('tab_4').checked){ //show in new tab var myWindow = window.open("",""); myWindow.document.body.innerHTML = svgElement; } else{ // download svg file download("screenshot.svg", svgElement); } } function download(filename, text) { var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } document.getElementById('transparencyRange_4').oninput = changeTransparency; document.getElementById('depthWriteCheckbox_4').onchange = toggleDepthWrite; document.getElementById('changeRotationX_4').onchange = changeRotationX; document.getElementById('changeRotationY_4').onchange = changeRotationY; document.getElementById('changeRotationZ_4').onchange = changeRotationZ; document.getElementById('resetButton_4').onclick = resetScene; document.getElementById('rotationSpeedRange_4').oninput = changeRotationSpeedFactor; document.getElementById('takeScreenshot_4').onclick = takeSvgScreenshot; document.getElementById('showSettingsButton_4').onclick = showSettings; document.getElementById('hideSettingsButton_4').onclick = hideSettings; // ------------------ SHORTCUTS -------------------------------------------- // ------------------------------------------------------------------------- /** * http://www.openjs.com/scripts/events/keyboard_shortcuts/ * Version : 2.01.B * By Binny V A * License : BSD */ shortcut = { 'all_shortcuts':{},//All the shortcuts are stored in this array 'add': function(shortcut_combination,callback,opt) { //Provide a set of default options var default_options = { 'type':'keydown', 'propagate':false, 'disable_in_input':false, 'target':document, 'keycode':false } if(!opt) opt = default_options; else { for(var dfo in default_options) { if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo]; } } var ele = opt.target; if(typeof opt.target == 'string') ele = document.getElementById(opt.target); var ths = this; shortcut_combination = shortcut_combination.toLowerCase(); //The function to be called at keypress var func = function(e) { e = e || window.event; if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields var element; if(e.target) element=e.target; else if(e.srcElement) element=e.srcElement; if(element.nodeType==3) element=element.parentNode; if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return; } //Find Which key is pressed if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; var character = String.fromCharCode(code).toLowerCase(); if(code == 188) character=","; //If the user presses , when the type is onkeydown if(code == 190) character="."; //If the user presses , when the type is onkeydown var keys = shortcut_combination.split("+"); //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked var kp = 0; //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken var shift_nums = { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&", "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<", ".":">", "/":"?", "\\":"|" } //Special Keys - and their codes var special_keys = { 'esc':27, 'escape':27, 'tab':9, 'space':32, 'return':13, 'enter':13, 'backspace':8, 'scrolllock':145, 'scroll_lock':145, 'scroll':145, 'capslock':20, 'caps_lock':20, 'caps':20, 'numlock':144, 'num_lock':144, 'num':144, 'pause':19, 'break':19, 'insert':45, 'home':36, 'delete':46, 'end':35, 'pageup':33, 'page_up':33, 'pu':33, 'pagedown':34, 'page_down':34, 'pd':34, 'left':37, 'up':38, 'right':39, 'down':40, 'f1':112, 'f2':113, 'f3':114, 'f4':115, 'f5':116, 'f6':117, 'f7':118, 'f8':119, 'f9':120, 'f10':121, 'f11':122, 'f12':123 } var modifiers = { shift: { wanted:false, pressed:false}, ctrl : { wanted:false, pressed:false}, alt : { wanted:false, pressed:false}, meta : { wanted:false, pressed:false} //Meta is Mac specific }; if(e.ctrlKey) modifiers.ctrl.pressed = true; if(e.shiftKey) modifiers.shift.pressed = true; if(e.altKey) modifiers.alt.pressed = true; if(e.metaKey) modifiers.meta.pressed = true; for(var i=0; k=keys[i],i<keys.length; i++) { //Modifiers if(k == 'ctrl' || k == 'control') { kp++; modifiers.ctrl.wanted = true; } else if(k == 'shift') { kp++; modifiers.shift.wanted = true; } else if(k == 'alt') { kp++; modifiers.alt.wanted = true; } else if(k == 'meta') { kp++; modifiers.meta.wanted = true; } else if(k.length > 1) { //If it is a special key if(special_keys[k] == code) kp++; } else if(opt['keycode']) { if(opt['keycode'] == code) kp++; } else { //The special keys did not match if(character == k) kp++; else { if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase character = shift_nums[character]; if(character == k) kp++; } } } } if(kp == keys.length && modifiers.ctrl.pressed == modifiers.ctrl.wanted && modifiers.shift.pressed == modifiers.shift.wanted && modifiers.alt.pressed == modifiers.alt.wanted && modifiers.meta.pressed == modifiers.meta.wanted) { callback(e); if(!opt['propagate']) { //Stop the event //e.cancelBubble is supported by IE - this will kill the bubbling process. e.cancelBubble = true; e.returnValue = false; //e.stopPropagation works in Firefox. if (e.stopPropagation) { e.stopPropagation(); e.preventDefault(); } return false; } } } this.all_shortcuts[shortcut_combination] = { 'callback':func, 'target':ele, 'event': opt['type'] }; //Attach the function with the event if(ele.addEventListener) ele.addEventListener(opt['type'], func, false); else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func); else ele['on'+opt['type']] = func; }, //Remove the shortcut - just specify the shortcut and I will remove the binding 'remove':function(shortcut_combination) { shortcut_combination = shortcut_combination.toLowerCase(); var binding = this.all_shortcuts[shortcut_combination]; delete(this.all_shortcuts[shortcut_combination]) if(!binding) return; var type = binding['event']; var ele = binding['target']; var callback = binding['callback']; if(ele.detachEvent) ele.detachEvent('on'+type, callback); else if(ele.removeEventListener) ele.removeEventListener(type, callback, false); else ele['on'+type] = false; } } shortcut.add("Alt+Left",function() { var event = new Event('click'); if (settingsShown){ document.getElementById('hideSettingsButton_4').dispatchEvent(event); } else { document.getElementById('showSettingsButton_4').dispatchEvent(event); } }); // COMMON_CODE_BLOCK_END });}); </script> </body> </html> </HTML> <code perl> > $s->properties; name: s type: HyperbolicSurface DCEL N_vertices: 3 Halfedges list: (edgeIndex: twinIndex nextIndex prevIndex headIndex) 0: 1 2 4 1 (0 ---> 1) 1: 0 17 11 0 (1 ---> 0) 2: 3 4 0 2 (1 ---> 2) 3: 2 14 13 1 (2 ---> 1) 4: 5 0 2 0 (2 ---> 0) 5: 4 6 8 2 (0 ---> 2) 6: 7 8 5 1 (2 ---> 1) 7: 6 16 15 2 (1 ---> 2) 8: 9 5 6 0 (1 ---> 0) 9: 8 10 12 1 (0 ---> 1) 10: 11 12 9 2 (1 ---> 2) 11: 10 1 17 1 (2 ---> 1) 12: 13 9 10 0 (2 ---> 0) 13: 12 3 14 2 (0 ---> 2) 14: 15 13 3 0 (1 ---> 0) 15: 14 7 16 1 (0 ---> 1) 16: 17 15 7 0 (2 ---> 0) 17: 16 11 1 2 (0 ---> 2) FLIP_WORDS {0} {} {0 3} {0 4 7} {0 6} {3} {6} {0 3 1 5} {0 6 2 8} {3 1 5} {6 2 8} {0 3 1 5 0 1} {0 6 2 8 0 2} PENNER_COORDINATES 2 1 1 1 1 1 1 1 1 SECONDARY_FAN type: PolyhedralFan<Rational> SPECIAL_POINT 1 0 > $p = secondary_polyhedron($s,7); > $p->VISUAL(FacetColor=>'255 180 80'); </code> <HTML> <!-- polymake for knusper Thu Mar 3 00:31:41 2022 p_bounded --> <html> <head> <meta charset=utf-8> <title>p_bounded</title> <style> /* // COMMON_CODE_BLOCK_BEGIN */ html {overflow: scroll;} strong{font-size: 18px;} canvas { z-index: 8; } input[type='radio'] {margin-left:0;} input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;} .group{padding-bottom: 15px;} .settings * {z-index: 11; } .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;} .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;} .showSettingsButton{visibility: visible; z-index: 12; position: absolute } .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5} button{margin-left: 0; margin-top: 10px} img{cursor: pointer;} .suboption{padding-top: 15px;} #model82565943165 { width: 100%; height: 100%; } .threejs_container { width: 100%; height: 75vh;} .settings{max-height: 74vh} input[type=range] { -webkit-appearance: none; padding:0; width:90%; margin-left: auto; margin-right: auto; margin-top: 15px; margin-bottom: 15px; display: block; } input[type=range]:focus { outline: none; } input[type=range]::-webkit-slider-runnable-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-webkit-slider-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; -webkit-appearance: none; margin-top: -5px; } input[type=range]:focus::-webkit-slider-runnable-track { background: #E3E3E3; } input[type=range]::-moz-range-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-moz-range-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]::-ms-track { height: 4px; cursor: pointer; animate: 0.2s; background: transparent; border-color: transparent; color: transparent; } input[type=range]::-ms-fill-lower { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-fill-upper { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]:focus::-ms-fill-lower { background: #E3E3E3; } input[type=range]:focus::-ms-fill-upper { background: #E3E3E3; } /* // COMMON_CODE_BLOCK_END */ </style> </head> <body> <div class='threejs_container'> <div id='settings_5' class='settings'> <div class=group id='transparency_5' class='transparency'> <strong>Transparency</strong> <input id='transparencyRange_5' type='range' min=0 max=1 step=0.01 value=0> <div class=indented><input id='depthWriteCheckbox_5' type='checkbox'>depthWrite</div> </div> <div class=group id='rotation_5'> <strong>Rotation</strong> <div class=indented> <div><input type='checkbox' id='changeRotationX_5'> x-axis</div> <div><input type='checkbox' id='changeRotationY_5'> y-axis</div> <div><input type='checkbox' id='changeRotationZ_5'> z-axis</div> <button id='resetButton_5'>Reset</button> </div> <div class=suboption>Rotation speed</div> <input id='rotationSpeedRange_5' type='range' min=0 max=5 step=0.01 value=2> </div> <div class=group id='display_5'> <strong>Display</strong> <div class=indented> <div id='shownObjectTypesList_5' class='shownObjectsList'></div> </div> <div class=suboption>Objects</div> <div class=indented> <div id='shownObjectsList_5' class='shownObjectsList'></div> </div> </div> <div class=group id='camera_5'> <strong>Camera</strong> <div class=indented> <form> <select id="cameraType_5"> <option value='perspective' selected> Perspective<br></option> <option value='orthographic' > Orthographic<br></option> </select> </form> </div> </div> <div class=group id='svg_5'> <strong>SVG</strong> <div class=indented> <form> <input type="radio" name='screenshotMode' value='download' id='download_5' checked> Download<br> <input type="radio" name='screenshotMode' value='tab' id='tab_5' > New tab<br> </form> <button id='takeScreenshot_5'>Screenshot</button> </div> </div> </div> <!-- end of settings --> <img id='hideSettingsButton_5' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px"> <img id='showSettingsButton_5' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px"> <div id="model82565943165"></div> </div> <script> requirejs.config({ paths: { three: '/kernelspecs/r118/polymake/three', TrackballControls: '/kernelspecs/r118/polymake/TrackballControls', OrbitControls: '/kernelspecs/r118/polymake/OrbitControls', Projector: '/kernelspecs/r118/polymake/Projector', SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer', WEBGL: '/kernelspecs/r118/polymake/WebGL', }, shim: { 'three': { exports: 'THREE'}, 'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' }, 'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' }, 'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' }, 'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' }, 'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' }, } }); require(['three'],function(THREE){ window.THREE = THREE; require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'], function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) { THREE.TrackballControls = TrackballControls; THREE.OrbitControls = OrbitControls; THREE.Projector = Projector; THREE.SVGRenderer = SVGRenderer; THREE.WEBGL = WEBGL; // COMMON_CODE_BLOCK_BEGIN const intervalLength = 25; // for automatic animations const explodableModel = false; const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false }; const foldables = []; var three = document.getElementById("model82565943165"); var scene = new THREE.Scene(); var renderer = new THREE.WebGLRenderer( { antialias: true } ); var svgRenderer = new THREE.SVGRenderer( { antialias: true } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setClearColor(0xFFFFFF, 1); svgRenderer.setClearColor(0xFFFFFF, 1); three.appendChild(renderer.domElement); var frustumSize = 4; var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()]; cameras.forEach(function(cam) { cam.position.set(0, 0, 5); cam.lookAt(0, 0, 0); cam.up.set(0, 1, 0); }); var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)]; var camera, control; controls[0].zoomSpeed = 0.2; controls[0].rotateSpeed = 4; // class to allow move points together with labels and spheres var PMPoint = function (x,y,z) { this.vector = new THREE.Vector3(x,y,z); this.sprite = null; this.sphere = null; } PMPoint.prototype.addLabel = function(labelsprite) { this.sprite = labelsprite; this.sprite.position.copy(this.vector); } PMPoint.prototype.addSphere = function(spheremesh) { this.sphere = spheremesh; this.sphere.position.copy(this.vector); } PMPoint.prototype.set = function(x,y,z) { this.vector.set(x,y,z); if (this.sprite) { this.sprite.position.copy(this.vector); } if (this.sphere) { this.sphere.position.copy(this.vector); } } PMPoint.prototype.radius = function() { if (this.sphere) { return this.sphere.geometry.parameters.radius; } else { return 0; } }; // select the target node var target = document.querySelector('#model82565943165'); // create an observer instance var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.removedNodes && mutation.removedNodes.length > 0) { cancelAnimationFrame(renderId); observer.disconnect(); console.log("cancelled frame "+renderId); } }); }); // configuration of the observer: var config = { childList: true, characterData: true } // pass in the target node, as well as the observer options while (target) { if (target.className=="output") { observer.observe(target, config); break; } target = target.parentNode; } // COMMON_CODE_BLOCK_END var obj0 = new THREE.Object3D(); obj0.name = "p_bounded"; obj0.userData.explodable = 1; obj0.userData.points = []; obj0.userData.points.push(new PMPoint(0.562776, 0.0304074, 0.414416)); obj0.userData.points.push(new PMPoint(0.562802, -0.433532, 0.414364)); obj0.userData.points.push(new PMPoint(0.677206, -0.433532, 0.191283)); obj0.userData.points.push(new PMPoint(0.677206, 0.0253675, 0.191283)); obj0.userData.points.push(new PMPoint(0.553167, 0.055381, 0.420578)); obj0.userData.points.push(new PMPoint(0.448757, -0.433532, 0.487473)); obj0.userData.points.push(new PMPoint(0.507199, 0.10215, 0.450049)); obj0.userData.points.push(new PMPoint(0.506217, 0.10236, 0.450678)); obj0.userData.points.push(new PMPoint(0.448813, 0.0432627, 0.487473)); obj0.userData.points.push(new PMPoint(0.61824, 0.115444, 0.261454)); obj0.userData.points.push(new PMPoint(0.569479, 0.16546, 0.292339)); obj0.userData.points.push(new PMPoint(-0.468309, -0.433532, 0.487473)); obj0.userData.points.push(new PMPoint(-0.468309, 0.0431831, 0.487473)); obj0.userData.points.push(new PMPoint(0.499967, 0.108988, 0.446551)); obj0.userData.points.push(new PMPoint(0.156563, 0.409597, -0.370202)); obj0.userData.points.push(new PMPoint(-0.468309, 0.409597, -0.370202)); obj0.userData.points.push(new PMPoint(-0.468309, -0.433532, -0.370202)); obj0.userData.points.push(new PMPoint(0.415509, 0.323237, 0.0975608)); obj0.userData.points.push(new PMPoint(0.415143, 0.323359, -0.370202)); obj0.userData.points.push(new PMPoint(0.562545, 0.172568, 0.288137)); obj0.userData.points.push(new PMPoint(0.677206, -0.433532, -0.370202)); obj0.userData.points.push(new PMPoint(0.156563, 0.409597, 0.0976341)); obj0.userData.points.push(new PMPoint(0.156563, 0.280528, 0.339719)); obj0.userData.points.push(new PMPoint(-0.468309, 0.409597, 0.0976341)); obj0.userData.points.push(new PMPoint(-0.468309, 0.280555, 0.339668)); obj0.userData.points.push(new PMPoint(0.15657, 0.409594, 0.0976391)); obj0.userData.points.push(new PMPoint(0.666751, 0.0653579, -0.370202)); obj0.userData.points.push(new PMPoint(0.677206, 0.0263565, -0.370202)); obj0.userData.points.push(new PMPoint(0.666638, 0.0657773, 0.191429)); obj0.userData.points.push(new PMPoint(0.677206, 0.0263565, 0.190776)); obj0.userData.pointradii = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; <!-- Vertex style --> obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj0.userData.pointlabels = [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "]; obj0.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 0, 4, 1, 5, 4, 6, 6, 7, 5, 8, 7, 8, 4, 9, 6, 10, 9, 10, 5, 11, 8, 12, 11, 12, 7, 13, 14, 15, 11, 16, 15, 16, 14, 18, 17, 18, 10, 19, 13, 19, 17, 19, 2, 20, 16, 20, 14, 21, 13, 22, 15, 23, 21, 23, 12, 24, 22, 24, 23, 24, 17, 25, 21, 25, 22, 25, 18, 26, 20, 27, 26, 27, 9, 28, 26, 28, 3, 29, 27, 29, 28, 29]; <!-- Edge style --> obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj0.userData.facets = [[7, 13, 22, 24, 12, 8], [19, 13, 7, 6, 10], [7, 8, 5, 1, 0, 4, 6], [6, 4, 9, 10], [17, 19, 10, 9, 28, 26, 18], [4, 0, 3, 29, 28, 9], [8, 12, 11, 5], [22, 13, 19, 17, 25], [0, 1, 2, 3], [24, 22, 25, 21, 23], [26, 28, 29, 27], [25, 17, 18, 14, 21], [20, 27, 29, 3, 2], [23, 21, 14, 15], [12, 24, 23, 15, 16, 11], [11, 16, 20, 2, 1, 5], [16, 15, 14, 18, 26, 27, 20]]; <!-- Facet style --> obj0.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj0); scene.add(obj0); // COMMON_CODE_BLOCK_BEGIN function textSpriteMaterial(message, parameters) { if ( parameters === undefined ) parameters = {}; var fontface = "Helvetica"; var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15; fontsize = fontsize*10; var lines = message.split('\\n'); var size = 512; for(var i = 0; i<lines.length; i++){ var tmp = lines[i].length; while(tmp*fontsize > size){ fontsize--; } } var canvas = document.createElement('canvas'); canvas.width = size; canvas.height = size; var context = canvas.getContext('2d'); context.fillStyle = "rgba(255, 255, 255, 0)"; context.fill(); context.font = fontsize + "px " + fontface; // text color context.fillStyle = "rgba(0, 0, 0, 1.0)"; for(var i = 0; i<lines.length; i++){ context.fillText(lines[i], size/2, size/2+i*fontsize); } // canvas contents will be used for a texture var texture = new THREE.Texture(canvas); texture.needsUpdate = true; var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 }); return spriteMaterial; } // ---------------------- INITIALIZING OBJECTS-------------------------------------- // --------------------------------------------------------------------------------- function init_object(obj) { if (obj.userData.hasOwnProperty("pointmaterial")) { init_points(obj); modelContains.points = true; } if (obj.userData.hasOwnProperty("pointlabels")) { init_pointlabels(obj); modelContains.pointlabels = true; } if (obj.userData.hasOwnProperty("edgematerial")) { init_lines(obj); modelContains.lines = true; } if (obj.userData.hasOwnProperty("edgelabels")) { init_edgelabels(obj); modelContains.edgelabels = true; } if (obj.userData.hasOwnProperty("arrowstyle")) { init_arrowheads(obj); modelContains.arrowheads = true; } if (obj.userData.hasOwnProperty("facetmaterial")) { init_faces(obj); modelContains.faces = true; } } function init_points(obj) { var pointgroup = new THREE.Group(); pointgroup.name = "points"; var points = obj.userData.points; var radii = obj.userData.pointradii; var materials = obj.userData.pointmaterial; var geometry,material; if (!Array.isArray(radii)) { geometry = new THREE.SphereBufferGeometry(radii); } if (!Array.isArray(materials)) { material = materials; } for (var i=0; i<points.length; i++) { var point = points[i]; if (Array.isArray(radii)) { if (radii[i] == 0) { continue; } geometry = new THREE.SphereBufferGeometry(radii[i]); } if (Array.isArray(materials)) { material = materials[i]; } var sphere = new THREE.Mesh(geometry, material); point.addSphere(sphere); pointgroup.add(sphere); } obj.add(pointgroup); } function init_pointlabels(obj) { var points = obj.userData.points; var labels = obj.userData.pointlabels; var pointlabels = new THREE.Group(); pointlabels.name = "pointlabels"; if (Array.isArray(labels)) { for (var i=0; i<points.length; i++) { var point = points[i]; var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<points.length; i++) { var point = points[i]; var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } obj.add(pointlabels); } function init_lines(obj) { var edgeindices = obj.userData.edgeindices; var points = obj.userData.points; var materials = obj.userData.edgematerial; var geometry = new THREE.BufferGeometry(); var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 ); var geometry = new THREE.BufferGeometry(); geometry.setAttribute('position', bufattr); if (Array.isArray(materials)) { for (var i=0; i<materials.length; i++) { geometry.addGroup(2*i,2,i); } } var lines = new THREE.LineSegments(geometry, materials); lines.name = "lines"; obj.add(lines); updateEdgesPosition(obj); } function init_edgelabels(obj) { var points = obj.userData.points; var edgeindices = obj.userData.edgeindices; var labels = obj.userData.edgelabels; var edgelabels = new THREE.Group(); edgelabels.name = "edgelabels"; if (Array.isArray(labels)) { for (var i=0; i<edgeindices.length/2; i++) { var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<edgeindices.length/2; i++) { var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } obj.add(edgelabels); } function init_arrowheads(obj) { var arrowheads = new THREE.Group(); arrowheads.name = "arrowheads"; var arrowstyle = obj.userData.arrowstyle; var edgeindices = obj.userData.edgeindices; var edgematerials = obj.userData.edgematerial; var points = obj.userData.points; var material; if (!Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials.color} ); } for (var i=0; i<edgeindices.length; i=i+2) { var start = points[edgeindices[i]]; var end = points[edgeindices[i+1]]; var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius(); if (dist <= 0) { continue; } var dir = new THREE.Vector3().subVectors(end.vector,start.vector); dir.normalize(); var axis = new THREE.Vector3().set(dir.z,0,-dir.x); axis.normalize(); var radians = Math.acos( dir.y ); var radius = dist/25; var height = dist/5; var geometry = new THREE.ConeBufferGeometry(radius,height); var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2)); if (Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} ); } var cone = new THREE.Mesh( geometry, material ); cone.quaternion.setFromAxisAngle(axis,radians);; cone.position.copy(position);; arrowheads.add(cone); } obj.add(arrowheads); } function init_faces(obj) { var points = obj.userData.points; var facets = obj.userData.facets; obj.userData.triangleindices = []; for (var i=0; i<facets.length; i++) { facet = facets[i]; for (var t=0; t<facet.length-2; t++) { obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]); } } var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute(bufarr,3); var materials = obj.userData.facetmaterial; var geometry = new THREE.BufferGeometry(); var frontmaterials = []; var backmaterials = []; geometry.setAttribute('position',bufattr); if (Array.isArray(materials)) { var tricount = 0; var facet; for (var i=0; i<facets.length; i++) { facet = facets[i]; geometry.addGroup(tricount,(facet.length-2)*3,i); tricount += (facet.length-2)*3; } for (var j=0; j<materials.length; j++) { var fmat = materials[j].clone() fmat.side = THREE.FrontSide; frontmaterials.push(fmat); var bmat = materials[j].clone() bmat.side = THREE.BackSide; backmaterials.push(bmat); obj.userData.facetmaterial = frontmaterials.concat(backmaterials); } } else if (materials instanceof THREE.Material) { frontmaterials = materials.clone() frontmaterials.side = THREE.FrontSide; backmaterials = materials.clone() backmaterials.side = THREE.BackSide; obj.userData.facetmaterial = [frontmaterials, backmaterials]; } // duplicating the object with front and back should avoid transparency issues var backmesh = new THREE.Mesh(geometry, backmaterials); // meshname is used to show/hide objects backmesh.name = "backfaces"; obj.add(backmesh); var frontmesh = new THREE.Mesh(geometry, frontmaterials); frontmesh.name = "frontfaces"; obj.add(frontmesh); updateFacesPosition(obj); } // //INITIALIZING function updateFacesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.triangleindices; var faces = obj.getObjectByName("frontfaces"); var ba = faces.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } faces.geometry.attributes.position.needsUpdate = true; } function updateEdgesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.edgeindices; var lines = obj.getObjectByName("lines"); var ba = lines.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } lines.geometry.attributes.position.needsUpdate = true; } function onWindowResize() { renderer.setSize( three.clientWidth, three.clientHeight ); svgRenderer.setSize( three.clientWidth, three.clientHeight ); updateCamera(); } function updateCamera() { var width = three.clientWidth; var height = three.clientHeight; var aspect = width / height; if (camera.type == "OrthographicCamera") { camera.left = frustumSize * aspect / - 2; camera.right = frustumSize * aspect / 2; camera.top = frustumSize / 2; camera.bottom = - frustumSize / 2; } else if (camera.type == "PerspectiveCamera") { camera.aspect = aspect; } camera.updateProjectionMatrix(); } function changeCamera(event) { var selindex = event.currentTarget.selectedIndex; camera = cameras[selindex]; control = controls[selindex]; control.enabled = true; for (var i=0; i<controls.length; i++) { if (i!=selindex) { controls[i].enabled = false; } } updateCamera(); } var camtypenode = document.getElementById('cameraType_5'); camtypenode.onchange = changeCamera; camtypenode.dispatchEvent(new Event('change')); onWindowResize(); window.addEventListener('resize', onWindowResize); var xRotationEnabled = false; var yRotationEnabled = false; var zRotationEnabled = false; var rotationSpeedFactor = 1; var settingsShown = false; var labelsShown = true; var intervals = []; var timeouts = []; var explodingSpeed = 0.05; var explodeScale = 0.000001; var XMLS = new XMLSerializer(); var svgElement; var renderId; var render = function () { renderId = requestAnimationFrame(render); // comment in for automatic explosion // explode(updateFactor()); var phi = 0.02 * rotationSpeedFactor; if (xRotationEnabled) { scene.rotation.x += phi; } if (yRotationEnabled) { scene.rotation.y += phi; } if (zRotationEnabled) { scene.rotation.z += phi; } control.update(); renderer.render(scene, camera); }; if ( THREE.WEBGL.isWebGLAvailable() ) { render(); } else { var warning = WEBGL.getWebGLErrorMessage(); three.appendChild( warning ); } function changeTransparency() { var opacity = 1-Number(event.currentTarget.value); for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].opacity = opacity; } } else { child.userData.facetmaterial.opacity = opacity; } } } } function toggleDepthWrite(event) { depthwrite = event.currentTarget.checked; for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].depthWrite = depthwrite; } } else { child.userData.facetmaterial.depthWrite = depthWrite; } } } } function changeRotationX(event){ xRotationEnabled = event.currentTarget.checked; } function changeRotationY(event){ yRotationEnabled = event.currentTarget.checked; } function changeRotationZ(event){ zRotationEnabled = event.currentTarget.checked; } function changeRotationSpeedFactor(event){ rotationSpeedFactor = Number(event.currentTarget.value); } function resetScene(){ scene.rotation.set(0,0,0); camera.position.set(0,0,5); camera.up.set(0,1,0); } function showSettings(event){ document.getElementById('settings_5').style.visibility = 'visible'; document.getElementById('showSettingsButton_5').style.visibility = 'hidden'; document.getElementById('hideSettingsButton_5').style.visibility = 'visible'; settingsShown = true; } function hideSettings(event){ document.getElementById('settings_5').style.visibility = 'hidden'; document.getElementById('showSettingsButton_5').style.visibility = 'visible'; document.getElementById('hideSettingsButton_5').style.visibility = 'hidden'; settingsShown = false; } var pos = 150* Math.PI; function updateFactor() { pos++; return Math.sin(.01*pos)+1; } // ------------------------ FOLDING ------------------------------------------------ // --------------------------------------------------------------------------------- // rotate point p around axis defined by points p1 and p2 by given angle function rotate(p, p1, p2, angle ){ angle = -angle; var x = p.x, y = p.y, z = p.z, a = p1.x, b = p1.y, c = p1.z, u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z; var result = []; var L = u*u + v*v + w*w; var sqrt = Math.sqrt; var cos = Math.cos; var sin = Math.sin; result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L; result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L; result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L; return result; } var fold = function(event){ var obj = foldables[Number(event.currentTarget.name)]; var foldvalue = Number(event.currentTarget.value); var scale = foldvalue - obj.userData.oldscale; for (var j=0; j<obj.userData.axes.length; j++) { rotateVertices(obj, j, scale); } update(obj); obj.userData.oldscale += scale; lookAtBarycenter(obj); } function lookAtBarycenter(obj){ control.target = barycenter(obj); } function barycenter(obj) { var center = new THREE.Vector3(0,0,0); var points = obj.userData.points; for (var i=0; i<points.length; i++){ center.add(points[i].vector); } center.divideScalar(points.length); return center; } function rotateVertices(obj, edge, scale) { var axes = obj.userData.axes; var subtrees = obj.userData.subtrees; var points = obj.userData.points; var angles = obj.userData.angles; if (edge < axes.length){ for (var j=0; j<subtrees[edge].length; j++){ var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge])); points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]); } } } function update(obj) { updateFacesPosition(obj); updateEdgesPosition(obj); } if (foldables.length) { var settings = document.getElementById('settings_5'); var foldDiv = document.createElement('div'); foldDiv.id = 'fold_5'; var title = document.createElement('strong'); title.innerHTML = 'Fold'; foldDiv.appendChild(title); foldDiv.className = 'group'; for (var i=0; i<foldables.length; i++) { var range = document.createElement('input'); range.type = 'range'; range.min = 0; range.max = 1; range.value = 0; range.step = 0.001; range.name = String(i); range.oninput = fold; foldDiv.appendChild(range); } lookAtBarycenter(foldables[0]); settings.insertBefore(foldDiv,settings.childNodes[0]); } // ---------------------- EXPLOSION ------------------------------------------------ // --------------------------------------------------------------------------------- if (explodableModel) { for (var i=0; i<scene.children.length; i++) { obj = scene.children[i]; if ( obj.userData.explodable ) { computeCentroid(obj); } } document.getElementById('explodeRange_5').oninput = triggerExplode; document.getElementById('explodeCheckbox_5').onchange = triggerAutomaticExplode; document.getElementById('explodingSpeedRange_5').oninput = setExplodingSpeed; explode(0.000001); } function computeCentroid(obj) { centroid = new THREE.Vector3(); obj.userData.points.forEach(function(pmpoint) { centroid.add(pmpoint.vector); }); centroid.divideScalar(obj.userData.points.length); obj.userData.centroid = centroid; } function explode(factor) { for (var i=0; i<scene.children.length; i++) { var obj = scene.children[i]; if (obj.userData.hasOwnProperty("centroid")) { var c = obj.userData.centroid; obj.position.set(c.x*factor, c.y*factor, c.z*factor); } } } function triggerExplode(event){ explodeScale = Number(event.currentTarget.value); explode(explodeScale); } function setExplodingSpeed(event){ explodingSpeed = Number(event.currentTarget.value); } function triggerAutomaticExplode(event){ if (event.currentTarget.checked){ startExploding(); } else { clearIntervals(); } } function startExploding(){ intervals.push(setInterval(explodingInterval, 25)); } function explodingInterval(){ explodeScale += explodingSpeed; if (explodeScale <= 6){ explode(explodeScale); } else{ explode(6); explodeScale = 6; clearIntervals(); timeouts.push(setTimeout(startUnexploding, 3000)); } document.getElementById('explodeRange_5').value = explodeScale; } function startUnexploding(){ intervals.push(setInterval(unexplodingInterval, 25)); } function unexplodingInterval(){ explodeScale -= explodingSpeed; if (explodeScale >= 0){ explode(explodeScale); } else { explode(0); explodeScale = 0; clearIntervals(); timeouts.push(setTimeout(startExploding, 3000)); } document.getElementById('explodeRange_5').value = explodeScale; } function clearIntervals(){ intervals.forEach(function(interval){ clearInterval(interval); }); intervals = []; timeouts.forEach(function(timeout){ clearTimeout(timeout); }); timeouts = []; } // ---------------------- DISPLAY -------------------------------------------------- // --------------------------------------------------------------------------------- const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" }; const objectTypeVisible = {}; Object.assign(objectTypeVisible,modelContains); const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort(); const shownObjectTypesList = document.getElementById('shownObjectTypesList_5'); function setVisibility(bool,objname) { for (var i=0; i<scene.children.length; i++){ var obj = scene.children[i].getObjectByName(objname); if (obj) { obj.visible = bool; } } } function toggleObjectTypeVisibility(event){ var name = event.currentTarget.name; var checked = event.currentTarget.checked; objectTypeVisible[name] = checked; if (name == "faces") { setVisibility(checked,"frontfaces"); setVisibility(checked,"backfaces"); } else { setVisibility(checked,name); } } for (var i=0; i<sortedObjectTypeKeys.length; i++){ var key = sortedObjectTypeKeys[i]; if (modelContains[key]) { var objTypeNode = document.createElement('span'); objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = key; checkbox.onchange = toggleObjectTypeVisibility; shownObjectTypesList.appendChild(checkbox); shownObjectTypesList.appendChild(objTypeNode); } } // ------------------------------------------------------ function toggleObjectVisibility(event){ var nr = Number(event.currentTarget.name); scene.children[nr].visible = event.currentTarget.checked; } // append checkboxes for displaying or hiding objects var shownObjectsList = document.getElementById('shownObjectsList_5'); for (var i=0; i<scene.children.length; i++){ obj = scene.children[i]; var objNode = document.createElement('span'); objNode.innerHTML = obj.name + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = String(i); checkbox.onchange = toggleObjectVisibility; shownObjectsList.appendChild(checkbox); shownObjectsList.appendChild(objNode); } // ---------------------- SVG ------------------------------------------------------ // --------------------------------------------------------------------------------- function takeSvgScreenshot() { if (objectTypeVisible["pointlabels"]) { setVisibility(false,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(false,"edgelabels"); } svgRenderer.render(scene,camera); svgElement = XMLS.serializeToString(svgRenderer.domElement); if (objectTypeVisible["pointlabels"]) { setVisibility(true,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(true,"edgelabels"); } if (document.getElementById('tab_5').checked){ //show in new tab var myWindow = window.open("",""); myWindow.document.body.innerHTML = svgElement; } else{ // download svg file download("screenshot.svg", svgElement); } } function download(filename, text) { var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } document.getElementById('transparencyRange_5').oninput = changeTransparency; document.getElementById('depthWriteCheckbox_5').onchange = toggleDepthWrite; document.getElementById('changeRotationX_5').onchange = changeRotationX; document.getElementById('changeRotationY_5').onchange = changeRotationY; document.getElementById('changeRotationZ_5').onchange = changeRotationZ; document.getElementById('resetButton_5').onclick = resetScene; document.getElementById('rotationSpeedRange_5').oninput = changeRotationSpeedFactor; document.getElementById('takeScreenshot_5').onclick = takeSvgScreenshot; document.getElementById('showSettingsButton_5').onclick = showSettings; document.getElementById('hideSettingsButton_5').onclick = hideSettings; // ------------------ SHORTCUTS -------------------------------------------- // ------------------------------------------------------------------------- /** * http://www.openjs.com/scripts/events/keyboard_shortcuts/ * Version : 2.01.B * By Binny V A * License : BSD */ shortcut = { 'all_shortcuts':{},//All the shortcuts are stored in this array 'add': function(shortcut_combination,callback,opt) { //Provide a set of default options var default_options = { 'type':'keydown', 'propagate':false, 'disable_in_input':false, 'target':document, 'keycode':false } if(!opt) opt = default_options; else { for(var dfo in default_options) { if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo]; } } var ele = opt.target; if(typeof opt.target == 'string') ele = document.getElementById(opt.target); var ths = this; shortcut_combination = shortcut_combination.toLowerCase(); //The function to be called at keypress var func = function(e) { e = e || window.event; if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields var element; if(e.target) element=e.target; else if(e.srcElement) element=e.srcElement; if(element.nodeType==3) element=element.parentNode; if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return; } //Find Which key is pressed if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; var character = String.fromCharCode(code).toLowerCase(); if(code == 188) character=","; //If the user presses , when the type is onkeydown if(code == 190) character="."; //If the user presses , when the type is onkeydown var keys = shortcut_combination.split("+"); //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked var kp = 0; //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken var shift_nums = { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&", "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<", ".":">", "/":"?", "\\":"|" } //Special Keys - and their codes var special_keys = { 'esc':27, 'escape':27, 'tab':9, 'space':32, 'return':13, 'enter':13, 'backspace':8, 'scrolllock':145, 'scroll_lock':145, 'scroll':145, 'capslock':20, 'caps_lock':20, 'caps':20, 'numlock':144, 'num_lock':144, 'num':144, 'pause':19, 'break':19, 'insert':45, 'home':36, 'delete':46, 'end':35, 'pageup':33, 'page_up':33, 'pu':33, 'pagedown':34, 'page_down':34, 'pd':34, 'left':37, 'up':38, 'right':39, 'down':40, 'f1':112, 'f2':113, 'f3':114, 'f4':115, 'f5':116, 'f6':117, 'f7':118, 'f8':119, 'f9':120, 'f10':121, 'f11':122, 'f12':123 } var modifiers = { shift: { wanted:false, pressed:false}, ctrl : { wanted:false, pressed:false}, alt : { wanted:false, pressed:false}, meta : { wanted:false, pressed:false} //Meta is Mac specific }; if(e.ctrlKey) modifiers.ctrl.pressed = true; if(e.shiftKey) modifiers.shift.pressed = true; if(e.altKey) modifiers.alt.pressed = true; if(e.metaKey) modifiers.meta.pressed = true; for(var i=0; k=keys[i],i<keys.length; i++) { //Modifiers if(k == 'ctrl' || k == 'control') { kp++; modifiers.ctrl.wanted = true; } else if(k == 'shift') { kp++; modifiers.shift.wanted = true; } else if(k == 'alt') { kp++; modifiers.alt.wanted = true; } else if(k == 'meta') { kp++; modifiers.meta.wanted = true; } else if(k.length > 1) { //If it is a special key if(special_keys[k] == code) kp++; } else if(opt['keycode']) { if(opt['keycode'] == code) kp++; } else { //The special keys did not match if(character == k) kp++; else { if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase character = shift_nums[character]; if(character == k) kp++; } } } } if(kp == keys.length && modifiers.ctrl.pressed == modifiers.ctrl.wanted && modifiers.shift.pressed == modifiers.shift.wanted && modifiers.alt.pressed == modifiers.alt.wanted && modifiers.meta.pressed == modifiers.meta.wanted) { callback(e); if(!opt['propagate']) { //Stop the event //e.cancelBubble is supported by IE - this will kill the bubbling process. e.cancelBubble = true; e.returnValue = false; //e.stopPropagation works in Firefox. if (e.stopPropagation) { e.stopPropagation(); e.preventDefault(); } return false; } } } this.all_shortcuts[shortcut_combination] = { 'callback':func, 'target':ele, 'event': opt['type'] }; //Attach the function with the event if(ele.addEventListener) ele.addEventListener(opt['type'], func, false); else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func); else ele['on'+opt['type']] = func; }, //Remove the shortcut - just specify the shortcut and I will remove the binding 'remove':function(shortcut_combination) { shortcut_combination = shortcut_combination.toLowerCase(); var binding = this.all_shortcuts[shortcut_combination]; delete(this.all_shortcuts[shortcut_combination]) if(!binding) return; var type = binding['event']; var ele = binding['target']; var callback = binding['callback']; if(ele.detachEvent) ele.detachEvent('on'+type, callback); else if(ele.removeEventListener) ele.removeEventListener(type, callback, false); else ele['on'+type] = false; } } shortcut.add("Alt+Left",function() { var event = new Event('click'); if (settingsShown){ document.getElementById('hideSettingsButton_5').dispatchEvent(event); } else { document.getElementById('showSettingsButton_5').dispatchEvent(event); } }); // COMMON_CODE_BLOCK_END });}); </script> </body> </html> </HTML> <code perl> > $d0 = $s->gkz_dome(0,5); > $d0->VISUAL(FacetColor=>'80 180 255'); </code> <HTML> <!-- polymake for knusper Thu Mar 3 00:31:44 2022 pcom:d0 --> <html> <head> <meta charset=utf-8> <title>pcom:d0</title> <style> /* // COMMON_CODE_BLOCK_BEGIN */ html {overflow: scroll;} strong{font-size: 18px;} canvas { z-index: 8; } input[type='radio'] {margin-left:0;} input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;} .group{padding-bottom: 15px;} .settings * {z-index: 11; } .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;} .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;} .showSettingsButton{visibility: visible; z-index: 12; position: absolute } .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5} button{margin-left: 0; margin-top: 10px} img{cursor: pointer;} .suboption{padding-top: 15px;} #model31684444243 { width: 100%; height: 100%; } .threejs_container { width: 100%; height: 75vh;} .settings{max-height: 74vh} input[type=range] { -webkit-appearance: none; padding:0; width:90%; margin-left: auto; margin-right: auto; margin-top: 15px; margin-bottom: 15px; display: block; } input[type=range]:focus { outline: none; } input[type=range]::-webkit-slider-runnable-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-webkit-slider-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; -webkit-appearance: none; margin-top: -5px; } input[type=range]:focus::-webkit-slider-runnable-track { background: #E3E3E3; } input[type=range]::-moz-range-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-moz-range-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]::-ms-track { height: 4px; cursor: pointer; animate: 0.2s; background: transparent; border-color: transparent; color: transparent; } input[type=range]::-ms-fill-lower { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-fill-upper { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]:focus::-ms-fill-lower { background: #E3E3E3; } input[type=range]:focus::-ms-fill-upper { background: #E3E3E3; } /* // COMMON_CODE_BLOCK_END */ </style> </head> <body> <div class='threejs_container'> <div id='settings_6' class='settings'> <div class=group id='explode_6'> <strong>Explode</strong> <input id='explodeRange_6' type='range' min='0.00001' max=6 step=0.01 value=0.00001> <div class=indented><input id='explodeCheckbox_6' type='checkbox'>Automatic explosion</div> <div class=suboption>Exploding speed</div> <input id='explodingSpeedRange_6' type='range' min=0 max=0.5 step=0.001 value=0.05> </div> <div class=group id='transparency_6' class='transparency'> <strong>Transparency</strong> <input id='transparencyRange_6' type='range' min=0 max=1 step=0.01 value=0> <div class=indented><input id='depthWriteCheckbox_6' type='checkbox'>depthWrite</div> </div> <div class=group id='rotation_6'> <strong>Rotation</strong> <div class=indented> <div><input type='checkbox' id='changeRotationX_6'> x-axis</div> <div><input type='checkbox' id='changeRotationY_6'> y-axis</div> <div><input type='checkbox' id='changeRotationZ_6'> z-axis</div> <button id='resetButton_6'>Reset</button> </div> <div class=suboption>Rotation speed</div> <input id='rotationSpeedRange_6' type='range' min=0 max=5 step=0.01 value=2> </div> <div class=group id='display_6'> <strong>Display</strong> <div class=indented> <div id='shownObjectTypesList_6' class='shownObjectsList'></div> </div> <div class=suboption>Objects</div> <div class=indented> <div id='shownObjectsList_6' class='shownObjectsList'></div> </div> </div> <div class=group id='camera_6'> <strong>Camera</strong> <div class=indented> <form> <select id="cameraType_6"> <option value='perspective' selected> Perspective<br></option> <option value='orthographic' > Orthographic<br></option> </select> </form> </div> </div> <div class=group id='svg_6'> <strong>SVG</strong> <div class=indented> <form> <input type="radio" name='screenshotMode' value='download' id='download_6' checked> Download<br> <input type="radio" name='screenshotMode' value='tab' id='tab_6' > New tab<br> </form> <button id='takeScreenshot_6'>Screenshot</button> </div> </div> </div> <!-- end of settings --> <img id='hideSettingsButton_6' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px"> <img id='showSettingsButton_6' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px"> <div id="model31684444243"></div> </div> <script> requirejs.config({ paths: { three: '/kernelspecs/r118/polymake/three', TrackballControls: '/kernelspecs/r118/polymake/TrackballControls', OrbitControls: '/kernelspecs/r118/polymake/OrbitControls', Projector: '/kernelspecs/r118/polymake/Projector', SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer', WEBGL: '/kernelspecs/r118/polymake/WebGL', }, shim: { 'three': { exports: 'THREE'}, 'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' }, 'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' }, 'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' }, 'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' }, 'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' }, } }); require(['three'],function(THREE){ window.THREE = THREE; require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'], function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) { THREE.TrackballControls = TrackballControls; THREE.OrbitControls = OrbitControls; THREE.Projector = Projector; THREE.SVGRenderer = SVGRenderer; THREE.WEBGL = WEBGL; // COMMON_CODE_BLOCK_BEGIN const intervalLength = 25; // for automatic animations const explodableModel = true; const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false }; const foldables = []; var three = document.getElementById("model31684444243"); var scene = new THREE.Scene(); var renderer = new THREE.WebGLRenderer( { antialias: true } ); var svgRenderer = new THREE.SVGRenderer( { antialias: true } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setClearColor(0xFFFFFF, 1); svgRenderer.setClearColor(0xFFFFFF, 1); three.appendChild(renderer.domElement); var frustumSize = 4; var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()]; cameras.forEach(function(cam) { cam.position.set(0, 0, 5); cam.lookAt(0, 0, 0); cam.up.set(0, 1, 0); }); var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)]; var camera, control; controls[0].zoomSpeed = 0.2; controls[0].rotateSpeed = 4; // class to allow move points together with labels and spheres var PMPoint = function (x,y,z) { this.vector = new THREE.Vector3(x,y,z); this.sprite = null; this.sphere = null; } PMPoint.prototype.addLabel = function(labelsprite) { this.sprite = labelsprite; this.sprite.position.copy(this.vector); } PMPoint.prototype.addSphere = function(spheremesh) { this.sphere = spheremesh; this.sphere.position.copy(this.vector); } PMPoint.prototype.set = function(x,y,z) { this.vector.set(x,y,z); if (this.sprite) { this.sprite.position.copy(this.vector); } if (this.sphere) { this.sphere.position.copy(this.vector); } } PMPoint.prototype.radius = function() { if (this.sphere) { return this.sphere.geometry.parameters.radius; } else { return 0; } }; // select the target node var target = document.querySelector('#model31684444243'); // create an observer instance var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.removedNodes && mutation.removedNodes.length > 0) { cancelAnimationFrame(renderId); observer.disconnect(); console.log("cancelled frame "+renderId); } }); }); // configuration of the observer: var config = { childList: true, characterData: true } // pass in the target node, as well as the observer options while (target) { if (target.className=="output") { observer.observe(target, config); break; } target = target.parentNode; } // COMMON_CODE_BLOCK_END var obj0 = new THREE.Object3D(); obj0.name = "unnamed__1"; obj0.userData.explodable = 1; obj0.userData.points = []; obj0.userData.points.push(new PMPoint(0.6, -0.8, 0.128)); obj0.userData.points.push(new PMPoint(0.6, 0.8, 0.128)); obj0.userData.points.push(new PMPoint(-1, 0, 0.2)); obj0.userData.pointradii = 0.02; <!-- Vertex style --> obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj0.userData.pointlabels = ["0", "1", "2"]; obj0.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj0.userData.facets = [[0, 2, 1]]; <!-- Facet style --> obj0.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj0); scene.add(obj0); var obj1 = new THREE.Object3D(); obj1.name = "unnamed__2"; obj1.userData.explodable = 1; obj1.userData.points = []; obj1.userData.points.push(new PMPoint(0.6, -0.8, 0.128)); obj1.userData.points.push(new PMPoint(0.6, 0.8, 0.128)); obj1.userData.points.push(new PMPoint(1, 0, 0.0125)); obj1.userData.pointradii = 0.02; <!-- Vertex style --> obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj1.userData.pointlabels = ["0", "1", "3"]; obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj1.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj1.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj1); scene.add(obj1); var obj2 = new THREE.Object3D(); obj2.name = "unnamed__3"; obj2.userData.explodable = 1; obj2.userData.points = []; obj2.userData.points.push(new PMPoint(0.6, 0.8, 0.128)); obj2.userData.points.push(new PMPoint(-1, 0, 0.2)); obj2.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349)); obj2.userData.pointradii = 0.02; <!-- Vertex style --> obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj2.userData.pointlabels = ["1", "2", "4"]; obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj2.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj2); scene.add(obj2); var obj3 = new THREE.Object3D(); obj3.name = "unnamed__4"; obj3.userData.explodable = 1; obj3.userData.points = []; obj3.userData.points.push(new PMPoint(0.6, -0.8, 0.128)); obj3.userData.points.push(new PMPoint(-1, 0, 0.2)); obj3.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349)); obj3.userData.pointradii = 0.02; <!-- Vertex style --> obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj3.userData.pointlabels = ["0", "2", "5"]; obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj3.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj3.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj3); scene.add(obj3); var obj4 = new THREE.Object3D(); obj4.name = "unnamed__5"; obj4.userData.explodable = 1; obj4.userData.points = []; obj4.userData.points.push(new PMPoint(0.6, -0.8, 0.128)); obj4.userData.points.push(new PMPoint(1, 0, 0.0125)); obj4.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747)); obj4.userData.pointradii = 0.02; <!-- Vertex style --> obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj4.userData.pointlabels = ["0", "3", "6"]; obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj4.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj4.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj4); scene.add(obj4); var obj5 = new THREE.Object3D(); obj5.name = "unnamed__6"; obj5.userData.explodable = 1; obj5.userData.points = []; obj5.userData.points.push(new PMPoint(0.6, 0.8, 0.128)); obj5.userData.points.push(new PMPoint(1, 0, 0.0125)); obj5.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747)); obj5.userData.pointradii = 0.02; <!-- Vertex style --> obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj5.userData.pointlabels = ["1", "3", "7"]; obj5.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj5.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj5); scene.add(obj5); var obj6 = new THREE.Object3D(); obj6.name = "unnamed__7"; obj6.userData.explodable = 1; obj6.userData.points = []; obj6.userData.points.push(new PMPoint(0.6, 0.8, 0.128)); obj6.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349)); obj6.userData.points.push(new PMPoint(0, 1, 0.003125)); obj6.userData.pointradii = 0.02; <!-- Vertex style --> obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj6.userData.pointlabels = ["1", "4", "8"]; obj6.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj6.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj6); scene.add(obj6); var obj7 = new THREE.Object3D(); obj7.name = "unnamed__8"; obj7.userData.explodable = 1; obj7.userData.points = []; obj7.userData.points.push(new PMPoint(-1, 0, 0.2)); obj7.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349)); obj7.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812)); obj7.userData.pointradii = 0.02; <!-- Vertex style --> obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj7.userData.pointlabels = ["2", "4", "9"]; obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj7.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj7.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj7); scene.add(obj7); var obj8 = new THREE.Object3D(); obj8.name = "unnamed__9"; obj8.userData.explodable = 1; obj8.userData.points = []; obj8.userData.points.push(new PMPoint(-1, 0, 0.2)); obj8.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349)); obj8.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812)); obj8.userData.pointradii = 0.02; <!-- Vertex style --> obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj8.userData.pointlabels = ["2", "5", "10"]; obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj8.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj8.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj8); scene.add(obj8); var obj9 = new THREE.Object3D(); obj9.name = "unnamed__10"; obj9.userData.explodable = 1; obj9.userData.points = []; obj9.userData.points.push(new PMPoint(0.6, -0.8, 0.128)); obj9.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349)); obj9.userData.points.push(new PMPoint(0, -1, 0.003125)); obj9.userData.pointradii = 0.02; <!-- Vertex style --> obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj9.userData.pointlabels = ["0", "5", "11"]; obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj9.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj9.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj9); scene.add(obj9); var obj10 = new THREE.Object3D(); obj10.name = "unnamed__11"; obj10.userData.explodable = 1; obj10.userData.points = []; obj10.userData.points.push(new PMPoint(0.6, -0.8, 0.128)); obj10.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747)); obj10.userData.points.push(new PMPoint(0.882353, -0.470588, 0.000692042)); obj10.userData.pointradii = 0.02; <!-- Vertex style --> obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj10.userData.pointlabels = ["0", "6", "12"]; obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj10.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj10.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj10); scene.add(obj10); var obj11 = new THREE.Object3D(); obj11.name = "unnamed__12"; obj11.userData.explodable = 1; obj11.userData.points = []; obj11.userData.points.push(new PMPoint(1, 0, 0.0125)); obj11.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747)); obj11.userData.points.push(new PMPoint(0.980198, -0.19802, 0.000196059)); obj11.userData.pointradii = 0.02; <!-- Vertex style --> obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj11.userData.pointlabels = ["3", "6", "13"]; obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj11.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj11); scene.add(obj11); var obj12 = new THREE.Object3D(); obj12.name = "unnamed__13"; obj12.userData.explodable = 1; obj12.userData.points = []; obj12.userData.points.push(new PMPoint(1, 0, 0.0125)); obj12.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747)); obj12.userData.points.push(new PMPoint(0.980198, 0.19802, 0.000196059)); obj12.userData.pointradii = 0.02; <!-- Vertex style --> obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj12.userData.pointlabels = ["3", "7", "14"]; obj12.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj12.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj12); scene.add(obj12); var obj13 = new THREE.Object3D(); obj13.name = "unnamed__14"; obj13.userData.explodable = 1; obj13.userData.points = []; obj13.userData.points.push(new PMPoint(0.6, 0.8, 0.128)); obj13.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747)); obj13.userData.points.push(new PMPoint(0.882353, 0.470588, 0.000692042)); obj13.userData.pointradii = 0.02; <!-- Vertex style --> obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj13.userData.pointlabels = ["1", "7", "15"]; obj13.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj13.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj13); scene.add(obj13); var obj14 = new THREE.Object3D(); obj14.name = "unnamed__15"; obj14.userData.explodable = 1; obj14.userData.points = []; obj14.userData.points.push(new PMPoint(0.6, 0.8, 0.128)); obj14.userData.points.push(new PMPoint(0, 1, 0.003125)); obj14.userData.points.push(new PMPoint(0.180328, 0.983607, 0.00053749)); obj14.userData.pointradii = 0.02; <!-- Vertex style --> obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj14.userData.pointlabels = ["1", "8", "16"]; obj14.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj14.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj14); scene.add(obj14); var obj15 = new THREE.Object3D(); obj15.name = "unnamed__16"; obj15.userData.explodable = 1; obj15.userData.points = []; obj15.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349)); obj15.userData.points.push(new PMPoint(0, 1, 0.003125)); obj15.userData.points.push(new PMPoint(-0.152941, 0.988235, 0.000276817)); obj15.userData.pointradii = 0.02; <!-- Vertex style --> obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj15.userData.pointlabels = ["4", "8", "17"]; obj15.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj15.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj15.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj15); scene.add(obj15); var obj16 = new THREE.Object3D(); obj16.name = "unnamed__17"; obj16.userData.explodable = 1; obj16.userData.points = []; obj16.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349)); obj16.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812)); obj16.userData.points.push(new PMPoint(-0.6, 0.8, 0.0003125)); obj16.userData.pointradii = 0.02; <!-- Vertex style --> obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj16.userData.pointlabels = ["4", "9", "18"]; obj16.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj16.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj16.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj16); scene.add(obj16); var obj17 = new THREE.Object3D(); obj17.name = "unnamed__18"; obj17.userData.explodable = 1; obj17.userData.points = []; obj17.userData.points.push(new PMPoint(-1, 0, 0.2)); obj17.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812)); obj17.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.0011392)); obj17.userData.pointradii = 0.02; <!-- Vertex style --> obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj17.userData.pointlabels = ["2", "9", "19"]; obj17.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj17.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj17.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj17); scene.add(obj17); var obj18 = new THREE.Object3D(); obj18.name = "unnamed__19"; obj18.userData.explodable = 1; obj18.userData.points = []; obj18.userData.points.push(new PMPoint(-1, 0, 0.2)); obj18.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812)); obj18.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.0011392)); obj18.userData.pointradii = 0.02; <!-- Vertex style --> obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj18.userData.pointlabels = ["2", "10", "20"]; obj18.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj18.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj18.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj18); scene.add(obj18); var obj19 = new THREE.Object3D(); obj19.name = "unnamed__20"; obj19.userData.explodable = 1; obj19.userData.points = []; obj19.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349)); obj19.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812)); obj19.userData.points.push(new PMPoint(-0.6, -0.8, 0.0003125)); obj19.userData.pointradii = 0.02; <!-- Vertex style --> obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj19.userData.pointlabels = ["5", "10", "21"]; obj19.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj19.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj19.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj19); scene.add(obj19); var obj20 = new THREE.Object3D(); obj20.name = "unnamed__21"; obj20.userData.explodable = 1; obj20.userData.points = []; obj20.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349)); obj20.userData.points.push(new PMPoint(0, -1, 0.003125)); obj20.userData.points.push(new PMPoint(-0.152941, -0.988235, 0.000276817)); obj20.userData.pointradii = 0.02; <!-- Vertex style --> obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj20.userData.pointlabels = ["5", "11", "22"]; obj20.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj20.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj20.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj20); scene.add(obj20); var obj21 = new THREE.Object3D(); obj21.name = "unnamed__22"; obj21.userData.explodable = 1; obj21.userData.points = []; obj21.userData.points.push(new PMPoint(0.6, -0.8, 0.128)); obj21.userData.points.push(new PMPoint(0, -1, 0.003125)); obj21.userData.points.push(new PMPoint(0.180328, -0.983607, 0.00053749)); obj21.userData.pointradii = 0.02; <!-- Vertex style --> obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj21.userData.pointlabels = ["0", "11", "23"]; obj21.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj21.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj21.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj21); scene.add(obj21); var obj22 = new THREE.Object3D(); obj22.name = "unnamed__23"; obj22.userData.explodable = 1; obj22.userData.points = []; obj22.userData.points.push(new PMPoint(0.6, -0.8, 0.128)); obj22.userData.points.push(new PMPoint(0.882353, -0.470588, 0.000692042)); obj22.userData.points.push(new PMPoint(0.834862, -0.550459, 0.000168336)); obj22.userData.pointradii = 0.02; <!-- Vertex style --> obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj22.userData.pointlabels = ["0", "12", "24"]; obj22.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj22.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj22.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj22); scene.add(obj22); var obj23 = new THREE.Object3D(); obj23.name = "unnamed__24"; obj23.userData.explodable = 1; obj23.userData.points = []; obj23.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747)); obj23.userData.points.push(new PMPoint(0.882353, -0.470588, 0.000692042)); obj23.userData.points.push(new PMPoint(0.912195, -0.409756, 4.75907e-05)); obj23.userData.pointradii = 0.02; <!-- Vertex style --> obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj23.userData.pointlabels = ["6", "12", "25"]; obj23.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj23.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj23); scene.add(obj23); var obj24 = new THREE.Object3D(); obj24.name = "unnamed__25"; obj24.userData.explodable = 1; obj24.userData.points = []; obj24.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747)); obj24.userData.points.push(new PMPoint(0.980198, -0.19802, 0.000196059)); obj24.userData.points.push(new PMPoint(0.969231, -0.246154, 2.95858e-05)); obj24.userData.pointradii = 0.02; <!-- Vertex style --> obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj24.userData.pointlabels = ["6", "13", "26"]; obj24.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj24.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj24.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj24); scene.add(obj24); var obj25 = new THREE.Object3D(); obj25.name = "unnamed__26"; obj25.userData.explodable = 1; obj25.userData.points = []; obj25.userData.points.push(new PMPoint(1, 0, 0.0125)); obj25.userData.points.push(new PMPoint(0.980198, -0.19802, 0.000196059)); obj25.userData.points.push(new PMPoint(0.989848, -0.142132, 8.24551e-05)); obj25.userData.pointradii = 0.02; <!-- Vertex style --> obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj25.userData.pointlabels = ["3", "13", "27"]; obj25.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj25.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj25.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj25); scene.add(obj25); var obj26 = new THREE.Object3D(); obj26.name = "unnamed__27"; obj26.userData.explodable = 1; obj26.userData.points = []; obj26.userData.points.push(new PMPoint(1, 0, 0.0125)); obj26.userData.points.push(new PMPoint(0.980198, 0.19802, 0.000196059)); obj26.userData.points.push(new PMPoint(0.989848, 0.142132, 8.24551e-05)); obj26.userData.pointradii = 0.02; <!-- Vertex style --> obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj26.userData.pointlabels = ["3", "14", "28"]; obj26.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj26.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj26.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj26); scene.add(obj26); var obj27 = new THREE.Object3D(); obj27.name = "unnamed__28"; obj27.userData.explodable = 1; obj27.userData.points = []; obj27.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747)); obj27.userData.points.push(new PMPoint(0.980198, 0.19802, 0.000196059)); obj27.userData.points.push(new PMPoint(0.969231, 0.246154, 2.95858e-05)); obj27.userData.pointradii = 0.02; <!-- Vertex style --> obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj27.userData.pointlabels = ["7", "14", "29"]; obj27.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj27.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj27.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj27); scene.add(obj27); var obj28 = new THREE.Object3D(); obj28.name = "unnamed__29"; obj28.userData.explodable = 1; obj28.userData.points = []; obj28.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747)); obj28.userData.points.push(new PMPoint(0.882353, 0.470588, 0.000692042)); obj28.userData.points.push(new PMPoint(0.912195, 0.409756, 4.75907e-05)); obj28.userData.pointradii = 0.02; <!-- Vertex style --> obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj28.userData.pointlabels = ["7", "15", "30"]; obj28.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj28.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj28.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj28); scene.add(obj28); var obj29 = new THREE.Object3D(); obj29.name = "unnamed__30"; obj29.userData.explodable = 1; obj29.userData.points = []; obj29.userData.points.push(new PMPoint(0.6, 0.8, 0.128)); obj29.userData.points.push(new PMPoint(0.882353, 0.470588, 0.000692042)); obj29.userData.points.push(new PMPoint(0.834862, 0.550459, 0.000168336)); obj29.userData.pointradii = 0.02; <!-- Vertex style --> obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj29.userData.pointlabels = ["1", "15", "31"]; obj29.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj29.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj29.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj29); scene.add(obj29); var obj30 = new THREE.Object3D(); obj30.name = "unnamed__31"; obj30.userData.explodable = 1; obj30.userData.points = []; obj30.userData.points.push(new PMPoint(0.6, 0.8, 0.128)); obj30.userData.points.push(new PMPoint(0.180328, 0.983607, 0.00053749)); obj30.userData.points.push(new PMPoint(0.28, 0.96, 0.00032)); obj30.userData.pointradii = 0.02; <!-- Vertex style --> obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj30.userData.pointlabels = ["1", "16", "32"]; obj30.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj30.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj30.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj30); scene.add(obj30); var obj31 = new THREE.Object3D(); obj31.name = "unnamed__32"; obj31.userData.explodable = 1; obj31.userData.points = []; obj31.userData.points.push(new PMPoint(0, 1, 0.003125)); obj31.userData.points.push(new PMPoint(0.180328, 0.983607, 0.00053749)); obj31.userData.points.push(new PMPoint(0.104972, 0.994475, 9.76771e-05)); obj31.userData.pointradii = 0.02; <!-- Vertex style --> obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj31.userData.pointlabels = ["8", "16", "33"]; obj31.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj31.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj31.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj31); scene.add(obj31); var obj32 = new THREE.Object3D(); obj32.name = "unnamed__33"; obj32.userData.explodable = 1; obj32.userData.points = []; obj32.userData.points.push(new PMPoint(0, 1, 0.003125)); obj32.userData.points.push(new PMPoint(-0.152941, 0.988235, 0.000276817)); obj32.userData.points.push(new PMPoint(-0.0950226, 0.995475, 6.55187e-05)); obj32.userData.pointradii = 0.02; <!-- Vertex style --> obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj32.userData.pointlabels = ["8", "17", "34"]; obj32.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj32.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj32.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj32); scene.add(obj32); var obj33 = new THREE.Object3D(); obj33.name = "unnamed__34"; obj33.userData.explodable = 1; obj33.userData.points = []; obj33.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349)); obj33.userData.points.push(new PMPoint(-0.152941, 0.988235, 0.000276817)); obj33.userData.points.push(new PMPoint(-0.219512, 0.97561, 7.43605e-05)); obj33.userData.pointradii = 0.02; <!-- Vertex style --> obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj33.userData.pointlabels = ["4", "17", "35"]; obj33.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj33.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj33.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj33); scene.add(obj33); var obj34 = new THREE.Object3D(); obj34.name = "unnamed__35"; obj34.userData.explodable = 1; obj34.userData.points = []; obj34.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349)); obj34.userData.points.push(new PMPoint(-0.6, 0.8, 0.0003125)); obj34.userData.points.push(new PMPoint(-0.541401, 0.840764, 0.000129823)); obj34.userData.pointradii = 0.02; <!-- Vertex style --> obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj34.userData.pointlabels = ["4", "18", "36"]; obj34.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj34.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj34.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj34); scene.add(obj34); var obj35 = new THREE.Object3D(); obj35.name = "unnamed__36"; obj35.userData.explodable = 1; obj35.userData.points = []; obj35.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812)); obj35.userData.points.push(new PMPoint(-0.6, 0.8, 0.0003125)); obj35.userData.points.push(new PMPoint(-0.64878, 0.760976, 7.61452e-05)); obj35.userData.pointradii = 0.02; <!-- Vertex style --> obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj35.userData.pointlabels = ["9", "18", "37"]; obj35.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj35.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj35.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj35); scene.add(obj35); var obj36 = new THREE.Object3D(); obj36.name = "unnamed__37"; obj36.userData.explodable = 1; obj36.userData.points = []; obj36.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812)); obj36.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.0011392)); obj36.userData.points.push(new PMPoint(-0.8, 0.6, 7.8125e-05)); obj36.userData.pointradii = 0.02; <!-- Vertex style --> obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj36.userData.pointlabels = ["9", "19", "38"]; obj36.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj36.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj36.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj36); scene.add(obj36); var obj37 = new THREE.Object3D(); obj37.name = "unnamed__38"; obj37.userData.explodable = 1; obj37.userData.points = []; obj37.userData.points.push(new PMPoint(-1, 0, 0.2)); obj37.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.0011392)); obj37.userData.points.push(new PMPoint(-0.905882, 0.423529, 0.000276817)); obj37.userData.pointradii = 0.02; <!-- Vertex style --> obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj37.userData.pointlabels = ["2", "19", "39"]; obj37.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj37.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj37.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj37); scene.add(obj37); var obj38 = new THREE.Object3D(); obj38.name = "unnamed__39"; obj38.userData.explodable = 1; obj38.userData.points = []; obj38.userData.points.push(new PMPoint(-1, 0, 0.2)); obj38.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.0011392)); obj38.userData.points.push(new PMPoint(-0.905882, -0.423529, 0.000276817)); obj38.userData.pointradii = 0.02; <!-- Vertex style --> obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj38.userData.pointlabels = ["2", "20", "40"]; obj38.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj38.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj38.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj38); scene.add(obj38); var obj39 = new THREE.Object3D(); obj39.name = "unnamed__40"; obj39.userData.explodable = 1; obj39.userData.points = []; obj39.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812)); obj39.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.0011392)); obj39.userData.points.push(new PMPoint(-0.8, -0.6, 7.8125e-05)); obj39.userData.pointradii = 0.02; <!-- Vertex style --> obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj39.userData.pointlabels = ["10", "20", "41"]; obj39.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj39.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj39.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj39); scene.add(obj39); var obj40 = new THREE.Object3D(); obj40.name = "unnamed__41"; obj40.userData.explodable = 1; obj40.userData.points = []; obj40.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812)); obj40.userData.points.push(new PMPoint(-0.6, -0.8, 0.0003125)); obj40.userData.points.push(new PMPoint(-0.64878, -0.760976, 7.61452e-05)); obj40.userData.pointradii = 0.02; <!-- Vertex style --> obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj40.userData.pointlabels = ["10", "21", "42"]; obj40.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj40.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj40.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj40); scene.add(obj40); var obj41 = new THREE.Object3D(); obj41.name = "unnamed__42"; obj41.userData.explodable = 1; obj41.userData.points = []; obj41.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349)); obj41.userData.points.push(new PMPoint(-0.6, -0.8, 0.0003125)); obj41.userData.points.push(new PMPoint(-0.541401, -0.840764, 0.000129823)); obj41.userData.pointradii = 0.02; <!-- Vertex style --> obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj41.userData.pointlabels = ["5", "21", "43"]; obj41.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj41.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj41.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj41); scene.add(obj41); var obj42 = new THREE.Object3D(); obj42.name = "unnamed__43"; obj42.userData.explodable = 1; obj42.userData.points = []; obj42.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349)); obj42.userData.points.push(new PMPoint(-0.152941, -0.988235, 0.000276817)); obj42.userData.points.push(new PMPoint(-0.219512, -0.97561, 7.43605e-05)); obj42.userData.pointradii = 0.02; <!-- Vertex style --> obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj42.userData.pointlabels = ["5", "22", "44"]; obj42.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj42.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj42.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj42); scene.add(obj42); var obj43 = new THREE.Object3D(); obj43.name = "unnamed__44"; obj43.userData.explodable = 1; obj43.userData.points = []; obj43.userData.points.push(new PMPoint(0, -1, 0.003125)); obj43.userData.points.push(new PMPoint(-0.152941, -0.988235, 0.000276817)); obj43.userData.points.push(new PMPoint(-0.0950226, -0.995475, 6.55187e-05)); obj43.userData.pointradii = 0.02; <!-- Vertex style --> obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj43.userData.pointlabels = ["11", "22", "45"]; obj43.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj43.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj43.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj43); scene.add(obj43); var obj44 = new THREE.Object3D(); obj44.name = "unnamed__45"; obj44.userData.explodable = 1; obj44.userData.points = []; obj44.userData.points.push(new PMPoint(0, -1, 0.003125)); obj44.userData.points.push(new PMPoint(0.180328, -0.983607, 0.00053749)); obj44.userData.points.push(new PMPoint(0.104972, -0.994475, 9.76771e-05)); obj44.userData.pointradii = 0.02; <!-- Vertex style --> obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj44.userData.pointlabels = ["11", "23", "46"]; obj44.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj44.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj44.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj44); scene.add(obj44); var obj45 = new THREE.Object3D(); obj45.name = "unnamed__46"; obj45.userData.explodable = 1; obj45.userData.points = []; obj45.userData.points.push(new PMPoint(0.6, -0.8, 0.128)); obj45.userData.points.push(new PMPoint(0.180328, -0.983607, 0.00053749)); obj45.userData.points.push(new PMPoint(0.28, -0.96, 0.00032)); obj45.userData.pointradii = 0.02; <!-- Vertex style --> obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj45.userData.pointlabels = ["0", "23", "47"]; obj45.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj45.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj45.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj45); scene.add(obj45); var obj46 = new THREE.Object3D(); obj46.name = "unnamed__47"; obj46.userData.explodable = 1; obj46.userData.points = []; obj46.userData.points.push(new PMPoint(0.6, -0.8, 0.128)); obj46.userData.points.push(new PMPoint(0.834862, -0.550459, 0.000168336)); obj46.userData.points.push(new PMPoint(0.8, -0.6, 0.000125)); obj46.userData.pointradii = 0.02; <!-- Vertex style --> obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj46.userData.pointlabels = ["0", "24", "48"]; obj46.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj46.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj46.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj46); scene.add(obj46); var obj47 = new THREE.Object3D(); obj47.name = "unnamed__48"; obj47.userData.explodable = 1; obj47.userData.points = []; obj47.userData.points.push(new PMPoint(0.882353, -0.470588, 0.000692042)); obj47.userData.points.push(new PMPoint(0.834862, -0.550459, 0.000168336)); obj47.userData.points.push(new PMPoint(0.856734, -0.515759, 2.62724e-05)); obj47.userData.pointradii = 0.02; <!-- Vertex style --> obj47.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj47.userData.pointlabels = ["12", "24", "49"]; obj47.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj47.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj47.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj47.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj47); scene.add(obj47); var obj48 = new THREE.Object3D(); obj48.name = "unnamed__49"; obj48.userData.explodable = 1; obj48.userData.points = []; obj48.userData.points.push(new PMPoint(0.882353, -0.470588, 0.000692042)); obj48.userData.points.push(new PMPoint(0.912195, -0.409756, 4.75907e-05)); obj48.userData.points.push(new PMPoint(0.901768, -0.43222, 1.23513e-05)); obj48.userData.pointradii = 0.02; <!-- Vertex style --> obj48.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj48.userData.pointlabels = ["12", "25", "50"]; obj48.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj48.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj48.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj48.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj48); scene.add(obj48); var obj49 = new THREE.Object3D(); obj49.name = "unnamed__50"; obj49.userData.explodable = 1; obj49.userData.points = []; obj49.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747)); obj49.userData.points.push(new PMPoint(0.912195, -0.409756, 4.75907e-05)); obj49.userData.points.push(new PMPoint(0.923077, -0.384615, 1.1557e-05)); obj49.userData.pointradii = 0.02; <!-- Vertex style --> obj49.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj49.userData.pointlabels = ["6", "25", "51"]; obj49.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj49.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj49.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj49.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj49); scene.add(obj49); var obj50 = new THREE.Object3D(); obj50.name = "unnamed__51"; obj50.userData.explodable = 1; obj50.userData.points = []; obj50.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747)); obj50.userData.points.push(new PMPoint(0.969231, -0.246154, 2.95858e-05)); obj50.userData.points.push(new PMPoint(0.963489, -0.267748, 1.31661e-05)); obj50.userData.pointradii = 0.02; <!-- Vertex style --> obj50.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj50.userData.pointlabels = ["6", "26", "52"]; obj50.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj50.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj50.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj50.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj50); scene.add(obj50); var obj51 = new THREE.Object3D(); obj51.name = "unnamed__52"; obj51.userData.explodable = 1; obj51.userData.points = []; obj51.userData.points.push(new PMPoint(0.980198, -0.19802, 0.000196059)); obj51.userData.points.push(new PMPoint(0.969231, -0.246154, 2.95858e-05)); obj51.userData.points.push(new PMPoint(0.973723, -0.227737, 0)); obj51.userData.pointradii = 0.02; <!-- Vertex style --> obj51.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj51.userData.pointlabels = ["13", "26", "53"]; obj51.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj51.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj51.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj51.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj51); scene.add(obj51); var obj52 = new THREE.Object3D(); obj52.name = "unnamed__53"; obj52.userData.explodable = 1; obj52.userData.points = []; obj52.userData.points.push(new PMPoint(0.980198, -0.19802, 0.000196059)); obj52.userData.points.push(new PMPoint(0.989848, -0.142132, 8.24551e-05)); obj52.userData.points.push(new PMPoint(0.986207, -0.165517, 0)); obj52.userData.pointradii = 0.02; <!-- Vertex style --> obj52.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj52.userData.pointlabels = ["13", "27", "54"]; obj52.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj52.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj52.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj52.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj52); scene.add(obj52); var obj53 = new THREE.Object3D(); obj53.name = "unnamed__54"; obj53.userData.explodable = 1; obj53.userData.points = []; obj53.userData.points.push(new PMPoint(1, 0, 0.0125)); obj53.userData.points.push(new PMPoint(0.989848, -0.142132, 8.24551e-05)); obj53.userData.points.push(new PMPoint(0.993846, -0.110769, 1.89349e-05)); obj53.userData.pointradii = 0.02; <!-- Vertex style --> obj53.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj53.userData.pointlabels = ["3", "27", "55"]; obj53.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj53.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj53.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj53.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj53); scene.add(obj53); var obj54 = new THREE.Object3D(); obj54.name = "unnamed__55"; obj54.userData.explodable = 1; obj54.userData.points = []; obj54.userData.points.push(new PMPoint(1, 0, 0.0125)); obj54.userData.points.push(new PMPoint(0.989848, 0.142132, 8.24551e-05)); obj54.userData.points.push(new PMPoint(0.993846, 0.110769, 1.89349e-05)); obj54.userData.pointradii = 0.02; <!-- Vertex style --> obj54.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj54.userData.pointlabels = ["3", "28", "56"]; obj54.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj54.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj54.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj54.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj54); scene.add(obj54); var obj55 = new THREE.Object3D(); obj55.name = "unnamed__56"; obj55.userData.explodable = 1; obj55.userData.points = []; obj55.userData.points.push(new PMPoint(0.980198, 0.19802, 0.000196059)); obj55.userData.points.push(new PMPoint(0.989848, 0.142132, 8.24551e-05)); obj55.userData.points.push(new PMPoint(0.986207, 0.165517, 0)); obj55.userData.pointradii = 0.02; <!-- Vertex style --> obj55.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj55.userData.pointlabels = ["14", "28", "57"]; obj55.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj55.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj55.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj55.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj55); scene.add(obj55); var obj56 = new THREE.Object3D(); obj56.name = "unnamed__57"; obj56.userData.explodable = 1; obj56.userData.points = []; obj56.userData.points.push(new PMPoint(0.980198, 0.19802, 0.000196059)); obj56.userData.points.push(new PMPoint(0.969231, 0.246154, 2.95858e-05)); obj56.userData.points.push(new PMPoint(0.973723, 0.227737, 0)); obj56.userData.pointradii = 0.02; <!-- Vertex style --> obj56.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj56.userData.pointlabels = ["14", "29", "58"]; obj56.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj56.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj56.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj56.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj56); scene.add(obj56); var obj57 = new THREE.Object3D(); obj57.name = "unnamed__58"; obj57.userData.explodable = 1; obj57.userData.points = []; obj57.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747)); obj57.userData.points.push(new PMPoint(0.969231, 0.246154, 2.95858e-05)); obj57.userData.points.push(new PMPoint(0.963489, 0.267748, 1.31661e-05)); obj57.userData.pointradii = 0.02; <!-- Vertex style --> obj57.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj57.userData.pointlabels = ["7", "29", "59"]; obj57.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj57.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj57.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj57.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj57); scene.add(obj57); var obj58 = new THREE.Object3D(); obj58.name = "unnamed__59"; obj58.userData.explodable = 1; obj58.userData.points = []; obj58.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747)); obj58.userData.points.push(new PMPoint(0.912195, 0.409756, 4.75907e-05)); obj58.userData.points.push(new PMPoint(0.923077, 0.384615, 1.1557e-05)); obj58.userData.pointradii = 0.02; <!-- Vertex style --> obj58.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj58.userData.pointlabels = ["7", "30", "60"]; obj58.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj58.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj58.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj58.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj58); scene.add(obj58); var obj59 = new THREE.Object3D(); obj59.name = "unnamed__60"; obj59.userData.explodable = 1; obj59.userData.points = []; obj59.userData.points.push(new PMPoint(0.882353, 0.470588, 0.000692042)); obj59.userData.points.push(new PMPoint(0.912195, 0.409756, 4.75907e-05)); obj59.userData.points.push(new PMPoint(0.901768, 0.43222, 1.23513e-05)); obj59.userData.pointradii = 0.02; <!-- Vertex style --> obj59.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj59.userData.pointlabels = ["15", "30", "61"]; obj59.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj59.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj59.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj59.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj59); scene.add(obj59); var obj60 = new THREE.Object3D(); obj60.name = "unnamed__61"; obj60.userData.explodable = 1; obj60.userData.points = []; obj60.userData.points.push(new PMPoint(0.882353, 0.470588, 0.000692042)); obj60.userData.points.push(new PMPoint(0.834862, 0.550459, 0.000168336)); obj60.userData.points.push(new PMPoint(0.856734, 0.515759, 2.62724e-05)); obj60.userData.pointradii = 0.02; <!-- Vertex style --> obj60.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj60.userData.pointlabels = ["15", "31", "62"]; obj60.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj60.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj60.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj60.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj60); scene.add(obj60); var obj61 = new THREE.Object3D(); obj61.name = "unnamed__62"; obj61.userData.explodable = 1; obj61.userData.points = []; obj61.userData.points.push(new PMPoint(0.6, 0.8, 0.128)); obj61.userData.points.push(new PMPoint(0.834862, 0.550459, 0.000168336)); obj61.userData.points.push(new PMPoint(0.8, 0.6, 0.000125)); obj61.userData.pointradii = 0.02; <!-- Vertex style --> obj61.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj61.userData.pointlabels = ["1", "31", "63"]; obj61.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj61.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj61.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj61.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj61); scene.add(obj61); var obj62 = new THREE.Object3D(); obj62.name = "unnamed__63"; obj62.userData.explodable = 1; obj62.userData.points = []; obj62.userData.points.push(new PMPoint(0.6, 0.8, 0.128)); obj62.userData.points.push(new PMPoint(0.28, 0.96, 0.00032)); obj62.userData.points.push(new PMPoint(0.342282, 0.939597, 0.000144138)); obj62.userData.pointradii = 0.02; <!-- Vertex style --> obj62.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj62.userData.pointlabels = ["1", "32", "64"]; obj62.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj62.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj62.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj62.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj62); scene.add(obj62); var obj63 = new THREE.Object3D(); obj63.name = "unnamed__64"; obj63.userData.explodable = 1; obj63.userData.points = []; obj63.userData.points.push(new PMPoint(0.180328, 0.983607, 0.00053749)); obj63.userData.points.push(new PMPoint(0.28, 0.96, 0.00032)); obj63.userData.points.push(new PMPoint(0.236593, 0.971609, 3.18443e-05)); obj63.userData.pointradii = 0.02; <!-- Vertex style --> obj63.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj63.userData.pointlabels = ["16", "32", "65"]; obj63.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj63.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj63.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj63.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj63); scene.add(obj63); var obj64 = new THREE.Object3D(); obj64.name = "unnamed__65"; obj64.userData.explodable = 1; obj64.userData.points = []; obj64.userData.points.push(new PMPoint(0.180328, 0.983607, 0.00053749)); obj64.userData.points.push(new PMPoint(0.104972, 0.994475, 9.76771e-05)); obj64.userData.points.push(new PMPoint(0.132743, 0.99115, 1.56629e-05)); obj64.userData.pointradii = 0.02; <!-- Vertex style --> obj64.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj64.userData.pointlabels = ["16", "33", "66"]; obj64.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj64.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj64.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj64.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj64); scene.add(obj64); var obj65 = new THREE.Object3D(); obj65.name = "unnamed__66"; obj65.userData.explodable = 1; obj65.userData.points = []; obj65.userData.points.push(new PMPoint(0, 1, 0.003125)); obj65.userData.points.push(new PMPoint(0.104972, 0.994475, 9.76771e-05)); obj65.userData.points.push(new PMPoint(0.0739726, 0.99726, 1.50122e-05)); obj65.userData.pointradii = 0.02; <!-- Vertex style --> obj65.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj65.userData.pointlabels = ["8", "33", "67"]; obj65.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj65.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj65.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj65.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj65); scene.add(obj65); var obj66 = new THREE.Object3D(); obj66.name = "unnamed__67"; obj66.userData.explodable = 1; obj66.userData.points = []; obj66.userData.points.push(new PMPoint(0, 1, 0.003125)); obj66.userData.points.push(new PMPoint(-0.0950226, 0.995475, 6.55187e-05)); obj66.userData.points.push(new PMPoint(-0.0688836, 0.997625, 1.12841e-05)); obj66.userData.pointradii = 0.02; <!-- Vertex style --> obj66.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj66.userData.pointlabels = ["8", "34", "68"]; obj66.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj66.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj66.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj66.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj66); scene.add(obj66); var obj67 = new THREE.Object3D(); obj67.name = "unnamed__68"; obj67.userData.explodable = 1; obj67.userData.points = []; obj67.userData.points.push(new PMPoint(-0.152941, 0.988235, 0.000276817)); obj67.userData.points.push(new PMPoint(-0.0950226, 0.995475, 6.55187e-05)); obj67.userData.points.push(new PMPoint(-0.117241, 0.993103, 0)); obj67.userData.pointradii = 0.02; <!-- Vertex style --> obj67.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj67.userData.pointlabels = ["17", "34", "69"]; obj67.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj67.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj67.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj67.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj67); scene.add(obj67); var obj68 = new THREE.Object3D(); obj68.name = "unnamed__69"; obj68.userData.explodable = 1; obj68.userData.points = []; obj68.userData.points.push(new PMPoint(-0.152941, 0.988235, 0.000276817)); obj68.userData.points.push(new PMPoint(-0.219512, 0.97561, 7.43605e-05)); obj68.userData.points.push(new PMPoint(-0.191753, 0.981443, 1.3604e-05)); obj68.userData.pointradii = 0.02; <!-- Vertex style --> obj68.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj68.userData.pointlabels = ["17", "35", "70"]; obj68.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj68.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj68.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj68.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj68); scene.add(obj68); var obj69 = new THREE.Object3D(); obj69.name = "unnamed__70"; obj69.userData.explodable = 1; obj69.userData.points = []; obj69.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349)); obj69.userData.points.push(new PMPoint(-0.219512, 0.97561, 7.43605e-05)); obj69.userData.points.push(new PMPoint(-0.256506, 0.966543, 4.42227e-05)); obj69.userData.pointradii = 0.02; <!-- Vertex style --> obj69.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj69.userData.pointlabels = ["4", "35", "71"]; obj69.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj69.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj69.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj69.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj69); scene.add(obj69); var obj70 = new THREE.Object3D(); obj70.name = "unnamed__71"; obj70.userData.explodable = 1; obj70.userData.points = []; obj70.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349)); obj70.userData.points.push(new PMPoint(-0.541401, 0.840764, 0.000129823)); obj70.userData.points.push(new PMPoint(-0.507692, 0.861538, 2.95858e-05)); obj70.userData.pointradii = 0.02; <!-- Vertex style --> obj70.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj70.userData.pointlabels = ["4", "36", "72"]; obj70.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj70.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj70.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj70.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj70); scene.add(obj70); var obj71 = new THREE.Object3D(); obj71.name = "unnamed__72"; obj71.userData.explodable = 1; obj71.userData.points = []; obj71.userData.points.push(new PMPoint(-0.6, 0.8, 0.0003125)); obj71.userData.points.push(new PMPoint(-0.541401, 0.840764, 0.000129823)); obj71.userData.points.push(new PMPoint(-0.566161, 0.824295, 1.50573e-05)); obj71.userData.pointradii = 0.02; <!-- Vertex style --> obj71.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj71.userData.pointlabels = ["18", "36", "73"]; obj71.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj71.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj71.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj71.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj71); scene.add(obj71); var obj72 = new THREE.Object3D(); obj72.name = "unnamed__73"; obj72.userData.explodable = 1; obj72.userData.points = []; obj72.userData.points.push(new PMPoint(-0.6, 0.8, 0.0003125)); obj72.userData.points.push(new PMPoint(-0.64878, 0.760976, 7.61452e-05)); obj72.userData.points.push(new PMPoint(-0.630314, 0.77634, 1.09334e-05)); obj72.userData.pointradii = 0.02; <!-- Vertex style --> obj72.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj72.userData.pointlabels = ["18", "37", "74"]; obj72.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj72.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj72.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj72.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj72); scene.add(obj72); var obj73 = new THREE.Object3D(); obj73.name = "unnamed__74"; obj73.userData.explodable = 1; obj73.userData.points = []; obj73.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812)); obj73.userData.points.push(new PMPoint(-0.64878, 0.760976, 7.61452e-05)); obj73.userData.points.push(new PMPoint(-0.670103, 0.742268, 2.12562e-05)); obj73.userData.pointradii = 0.02; <!-- Vertex style --> obj73.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj73.userData.pointlabels = ["9", "37", "75"]; obj73.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj73.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj73.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj73.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj73); scene.add(obj73); var obj74 = new THREE.Object3D(); obj74.name = "unnamed__75"; obj74.userData.explodable = 1; obj74.userData.points = []; obj74.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812)); obj74.userData.points.push(new PMPoint(-0.8, 0.6, 7.8125e-05)); obj74.userData.points.push(new PMPoint(-0.778462, 0.627692, 3.02959e-05)); obj74.userData.pointradii = 0.02; <!-- Vertex style --> obj74.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj74.userData.pointlabels = ["9", "38", "76"]; obj74.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj74.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj74.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj74.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj74); scene.add(obj74); var obj75 = new THREE.Object3D(); obj75.name = "unnamed__76"; obj75.userData.explodable = 1; obj75.userData.points = []; obj75.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.0011392)); obj75.userData.points.push(new PMPoint(-0.8, 0.6, 7.8125e-05)); obj75.userData.points.push(new PMPoint(-0.81864, 0.574307, 2.03034e-05)); obj75.userData.pointradii = 0.02; <!-- Vertex style --> obj75.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj75.userData.pointlabels = ["19", "38", "77"]; obj75.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj75.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj75.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj75.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj75); scene.add(obj75); var obj76 = new THREE.Object3D(); obj76.name = "unnamed__77"; obj76.userData.explodable = 1; obj76.userData.points = []; obj76.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.0011392)); obj76.userData.points.push(new PMPoint(-0.905882, 0.423529, 0.000276817)); obj76.userData.points.push(new PMPoint(-0.882353, 0.470588, 4.32526e-05)); obj76.userData.pointradii = 0.02; <!-- Vertex style --> obj76.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj76.userData.pointlabels = ["19", "39", "78"]; obj76.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj76.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj76.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj76.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj76); scene.add(obj76); var obj77 = new THREE.Object3D(); obj77.name = "unnamed__78"; obj77.userData.explodable = 1; obj77.userData.points = []; obj77.userData.points.push(new PMPoint(-1, 0, 0.2)); obj77.userData.points.push(new PMPoint(-0.905882, 0.423529, 0.000276817)); obj77.userData.points.push(new PMPoint(-0.936, 0.352, 0.000128)); obj77.userData.pointradii = 0.02; <!-- Vertex style --> obj77.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj77.userData.pointlabels = ["2", "39", "79"]; obj77.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj77.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj77.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj77.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj77); scene.add(obj77); var obj78 = new THREE.Object3D(); obj78.name = "unnamed__79"; obj78.userData.explodable = 1; obj78.userData.points = []; obj78.userData.points.push(new PMPoint(-1, 0, 0.2)); obj78.userData.points.push(new PMPoint(-0.905882, -0.423529, 0.000276817)); obj78.userData.points.push(new PMPoint(-0.936, -0.352, 0.000128)); obj78.userData.pointradii = 0.02; <!-- Vertex style --> obj78.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj78.userData.pointlabels = ["2", "40", "80"]; obj78.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj78.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj78.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj78.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj78); scene.add(obj78); var obj79 = new THREE.Object3D(); obj79.name = "unnamed__80"; obj79.userData.explodable = 1; obj79.userData.points = []; obj79.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.0011392)); obj79.userData.points.push(new PMPoint(-0.905882, -0.423529, 0.000276817)); obj79.userData.points.push(new PMPoint(-0.882353, -0.470588, 4.32526e-05)); obj79.userData.pointradii = 0.02; <!-- Vertex style --> obj79.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj79.userData.pointlabels = ["20", "40", "81"]; obj79.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj79.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj79.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj79.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj79); scene.add(obj79); var obj80 = new THREE.Object3D(); obj80.name = "unnamed__81"; obj80.userData.explodable = 1; obj80.userData.points = []; obj80.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.0011392)); obj80.userData.points.push(new PMPoint(-0.8, -0.6, 7.8125e-05)); obj80.userData.points.push(new PMPoint(-0.81864, -0.574307, 2.03034e-05)); obj80.userData.pointradii = 0.02; <!-- Vertex style --> obj80.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj80.userData.pointlabels = ["20", "41", "82"]; obj80.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj80.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj80.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj80.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj80); scene.add(obj80); var obj81 = new THREE.Object3D(); obj81.name = "unnamed__82"; obj81.userData.explodable = 1; obj81.userData.points = []; obj81.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812)); obj81.userData.points.push(new PMPoint(-0.8, -0.6, 7.8125e-05)); obj81.userData.points.push(new PMPoint(-0.778462, -0.627692, 3.02959e-05)); obj81.userData.pointradii = 0.02; <!-- Vertex style --> obj81.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj81.userData.pointlabels = ["10", "41", "83"]; obj81.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj81.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj81.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj81.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj81); scene.add(obj81); var obj82 = new THREE.Object3D(); obj82.name = "unnamed__83"; obj82.userData.explodable = 1; obj82.userData.points = []; obj82.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812)); obj82.userData.points.push(new PMPoint(-0.64878, -0.760976, 7.61452e-05)); obj82.userData.points.push(new PMPoint(-0.670103, -0.742268, 2.12562e-05)); obj82.userData.pointradii = 0.02; <!-- Vertex style --> obj82.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj82.userData.pointlabels = ["10", "42", "84"]; obj82.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj82.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj82.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj82.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj82); scene.add(obj82); var obj83 = new THREE.Object3D(); obj83.name = "unnamed__84"; obj83.userData.explodable = 1; obj83.userData.points = []; obj83.userData.points.push(new PMPoint(-0.6, -0.8, 0.0003125)); obj83.userData.points.push(new PMPoint(-0.64878, -0.760976, 7.61452e-05)); obj83.userData.points.push(new PMPoint(-0.630314, -0.77634, 1.09334e-05)); obj83.userData.pointradii = 0.02; <!-- Vertex style --> obj83.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj83.userData.pointlabels = ["21", "42", "85"]; obj83.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj83.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj83.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj83.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj83); scene.add(obj83); var obj84 = new THREE.Object3D(); obj84.name = "unnamed__85"; obj84.userData.explodable = 1; obj84.userData.points = []; obj84.userData.points.push(new PMPoint(-0.6, -0.8, 0.0003125)); obj84.userData.points.push(new PMPoint(-0.541401, -0.840764, 0.000129823)); obj84.userData.points.push(new PMPoint(-0.566161, -0.824295, 1.50573e-05)); obj84.userData.pointradii = 0.02; <!-- Vertex style --> obj84.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj84.userData.pointlabels = ["21", "43", "86"]; obj84.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj84.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj84.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj84.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj84); scene.add(obj84); var obj85 = new THREE.Object3D(); obj85.name = "unnamed__86"; obj85.userData.explodable = 1; obj85.userData.points = []; obj85.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349)); obj85.userData.points.push(new PMPoint(-0.541401, -0.840764, 0.000129823)); obj85.userData.points.push(new PMPoint(-0.507692, -0.861538, 2.95858e-05)); obj85.userData.pointradii = 0.02; <!-- Vertex style --> obj85.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj85.userData.pointlabels = ["5", "43", "87"]; obj85.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj85.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj85.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj85.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj85); scene.add(obj85); var obj86 = new THREE.Object3D(); obj86.name = "unnamed__87"; obj86.userData.explodable = 1; obj86.userData.points = []; obj86.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349)); obj86.userData.points.push(new PMPoint(-0.219512, -0.97561, 7.43605e-05)); obj86.userData.points.push(new PMPoint(-0.256506, -0.966543, 4.42227e-05)); obj86.userData.pointradii = 0.02; <!-- Vertex style --> obj86.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj86.userData.pointlabels = ["5", "44", "88"]; obj86.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj86.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj86.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj86.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj86); scene.add(obj86); var obj87 = new THREE.Object3D(); obj87.name = "unnamed__88"; obj87.userData.explodable = 1; obj87.userData.points = []; obj87.userData.points.push(new PMPoint(-0.152941, -0.988235, 0.000276817)); obj87.userData.points.push(new PMPoint(-0.219512, -0.97561, 7.43605e-05)); obj87.userData.points.push(new PMPoint(-0.191753, -0.981443, 1.3604e-05)); obj87.userData.pointradii = 0.02; <!-- Vertex style --> obj87.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj87.userData.pointlabels = ["22", "44", "89"]; obj87.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj87.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj87.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj87.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj87); scene.add(obj87); var obj88 = new THREE.Object3D(); obj88.name = "unnamed__89"; obj88.userData.explodable = 1; obj88.userData.points = []; obj88.userData.points.push(new PMPoint(-0.152941, -0.988235, 0.000276817)); obj88.userData.points.push(new PMPoint(-0.0950226, -0.995475, 6.55187e-05)); obj88.userData.points.push(new PMPoint(-0.117241, -0.993103, 0)); obj88.userData.pointradii = 0.02; <!-- Vertex style --> obj88.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj88.userData.pointlabels = ["22", "45", "90"]; obj88.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj88.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj88.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj88.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj88); scene.add(obj88); var obj89 = new THREE.Object3D(); obj89.name = "unnamed__90"; obj89.userData.explodable = 1; obj89.userData.points = []; obj89.userData.points.push(new PMPoint(0, -1, 0.003125)); obj89.userData.points.push(new PMPoint(-0.0950226, -0.995475, 6.55187e-05)); obj89.userData.points.push(new PMPoint(-0.0688836, -0.997625, 1.12841e-05)); obj89.userData.pointradii = 0.02; <!-- Vertex style --> obj89.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj89.userData.pointlabels = ["11", "45", "91"]; obj89.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj89.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj89.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj89.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj89); scene.add(obj89); var obj90 = new THREE.Object3D(); obj90.name = "unnamed__91"; obj90.userData.explodable = 1; obj90.userData.points = []; obj90.userData.points.push(new PMPoint(0, -1, 0.003125)); obj90.userData.points.push(new PMPoint(0.104972, -0.994475, 9.76771e-05)); obj90.userData.points.push(new PMPoint(0.0739726, -0.99726, 1.50122e-05)); obj90.userData.pointradii = 0.02; <!-- Vertex style --> obj90.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj90.userData.pointlabels = ["11", "46", "92"]; obj90.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj90.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj90.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj90.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj90); scene.add(obj90); var obj91 = new THREE.Object3D(); obj91.name = "unnamed__92"; obj91.userData.explodable = 1; obj91.userData.points = []; obj91.userData.points.push(new PMPoint(0.180328, -0.983607, 0.00053749)); obj91.userData.points.push(new PMPoint(0.104972, -0.994475, 9.76771e-05)); obj91.userData.points.push(new PMPoint(0.132743, -0.99115, 1.56629e-05)); obj91.userData.pointradii = 0.02; <!-- Vertex style --> obj91.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj91.userData.pointlabels = ["23", "46", "93"]; obj91.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj91.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj91.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj91.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj91); scene.add(obj91); var obj92 = new THREE.Object3D(); obj92.name = "unnamed__93"; obj92.userData.explodable = 1; obj92.userData.points = []; obj92.userData.points.push(new PMPoint(0.180328, -0.983607, 0.00053749)); obj92.userData.points.push(new PMPoint(0.28, -0.96, 0.00032)); obj92.userData.points.push(new PMPoint(0.236593, -0.971609, 3.18443e-05)); obj92.userData.pointradii = 0.02; <!-- Vertex style --> obj92.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj92.userData.pointlabels = ["23", "47", "94"]; obj92.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj92.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj92.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj92.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj92); scene.add(obj92); var obj93 = new THREE.Object3D(); obj93.name = "unnamed__94"; obj93.userData.explodable = 1; obj93.userData.points = []; obj93.userData.points.push(new PMPoint(0.6, -0.8, 0.128)); obj93.userData.points.push(new PMPoint(0.28, -0.96, 0.00032)); obj93.userData.points.push(new PMPoint(0.342282, -0.939597, 0.000144138)); obj93.userData.pointradii = 0.02; <!-- Vertex style --> obj93.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj93.userData.pointlabels = ["0", "47", "95"]; obj93.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj93.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj93.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj93.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj93); scene.add(obj93); // COMMON_CODE_BLOCK_BEGIN function textSpriteMaterial(message, parameters) { if ( parameters === undefined ) parameters = {}; var fontface = "Helvetica"; var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15; fontsize = fontsize*10; var lines = message.split('\\n'); var size = 512; for(var i = 0; i<lines.length; i++){ var tmp = lines[i].length; while(tmp*fontsize > size){ fontsize--; } } var canvas = document.createElement('canvas'); canvas.width = size; canvas.height = size; var context = canvas.getContext('2d'); context.fillStyle = "rgba(255, 255, 255, 0)"; context.fill(); context.font = fontsize + "px " + fontface; // text color context.fillStyle = "rgba(0, 0, 0, 1.0)"; for(var i = 0; i<lines.length; i++){ context.fillText(lines[i], size/2, size/2+i*fontsize); } // canvas contents will be used for a texture var texture = new THREE.Texture(canvas); texture.needsUpdate = true; var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 }); return spriteMaterial; } // ---------------------- INITIALIZING OBJECTS-------------------------------------- // --------------------------------------------------------------------------------- function init_object(obj) { if (obj.userData.hasOwnProperty("pointmaterial")) { init_points(obj); modelContains.points = true; } if (obj.userData.hasOwnProperty("pointlabels")) { init_pointlabels(obj); modelContains.pointlabels = true; } if (obj.userData.hasOwnProperty("edgematerial")) { init_lines(obj); modelContains.lines = true; } if (obj.userData.hasOwnProperty("edgelabels")) { init_edgelabels(obj); modelContains.edgelabels = true; } if (obj.userData.hasOwnProperty("arrowstyle")) { init_arrowheads(obj); modelContains.arrowheads = true; } if (obj.userData.hasOwnProperty("facetmaterial")) { init_faces(obj); modelContains.faces = true; } } function init_points(obj) { var pointgroup = new THREE.Group(); pointgroup.name = "points"; var points = obj.userData.points; var radii = obj.userData.pointradii; var materials = obj.userData.pointmaterial; var geometry,material; if (!Array.isArray(radii)) { geometry = new THREE.SphereBufferGeometry(radii); } if (!Array.isArray(materials)) { material = materials; } for (var i=0; i<points.length; i++) { var point = points[i]; if (Array.isArray(radii)) { if (radii[i] == 0) { continue; } geometry = new THREE.SphereBufferGeometry(radii[i]); } if (Array.isArray(materials)) { material = materials[i]; } var sphere = new THREE.Mesh(geometry, material); point.addSphere(sphere); pointgroup.add(sphere); } obj.add(pointgroup); } function init_pointlabels(obj) { var points = obj.userData.points; var labels = obj.userData.pointlabels; var pointlabels = new THREE.Group(); pointlabels.name = "pointlabels"; if (Array.isArray(labels)) { for (var i=0; i<points.length; i++) { var point = points[i]; var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<points.length; i++) { var point = points[i]; var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } obj.add(pointlabels); } function init_lines(obj) { var edgeindices = obj.userData.edgeindices; var points = obj.userData.points; var materials = obj.userData.edgematerial; var geometry = new THREE.BufferGeometry(); var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 ); var geometry = new THREE.BufferGeometry(); geometry.setAttribute('position', bufattr); if (Array.isArray(materials)) { for (var i=0; i<materials.length; i++) { geometry.addGroup(2*i,2,i); } } var lines = new THREE.LineSegments(geometry, materials); lines.name = "lines"; obj.add(lines); updateEdgesPosition(obj); } function init_edgelabels(obj) { var points = obj.userData.points; var edgeindices = obj.userData.edgeindices; var labels = obj.userData.edgelabels; var edgelabels = new THREE.Group(); edgelabels.name = "edgelabels"; if (Array.isArray(labels)) { for (var i=0; i<edgeindices.length/2; i++) { var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<edgeindices.length/2; i++) { var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } obj.add(edgelabels); } function init_arrowheads(obj) { var arrowheads = new THREE.Group(); arrowheads.name = "arrowheads"; var arrowstyle = obj.userData.arrowstyle; var edgeindices = obj.userData.edgeindices; var edgematerials = obj.userData.edgematerial; var points = obj.userData.points; var material; if (!Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials.color} ); } for (var i=0; i<edgeindices.length; i=i+2) { var start = points[edgeindices[i]]; var end = points[edgeindices[i+1]]; var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius(); if (dist <= 0) { continue; } var dir = new THREE.Vector3().subVectors(end.vector,start.vector); dir.normalize(); var axis = new THREE.Vector3().set(dir.z,0,-dir.x); axis.normalize(); var radians = Math.acos( dir.y ); var radius = dist/25; var height = dist/5; var geometry = new THREE.ConeBufferGeometry(radius,height); var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2)); if (Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} ); } var cone = new THREE.Mesh( geometry, material ); cone.quaternion.setFromAxisAngle(axis,radians);; cone.position.copy(position);; arrowheads.add(cone); } obj.add(arrowheads); } function init_faces(obj) { var points = obj.userData.points; var facets = obj.userData.facets; obj.userData.triangleindices = []; for (var i=0; i<facets.length; i++) { facet = facets[i]; for (var t=0; t<facet.length-2; t++) { obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]); } } var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute(bufarr,3); var materials = obj.userData.facetmaterial; var geometry = new THREE.BufferGeometry(); var frontmaterials = []; var backmaterials = []; geometry.setAttribute('position',bufattr); if (Array.isArray(materials)) { var tricount = 0; var facet; for (var i=0; i<facets.length; i++) { facet = facets[i]; geometry.addGroup(tricount,(facet.length-2)*3,i); tricount += (facet.length-2)*3; } for (var j=0; j<materials.length; j++) { var fmat = materials[j].clone() fmat.side = THREE.FrontSide; frontmaterials.push(fmat); var bmat = materials[j].clone() bmat.side = THREE.BackSide; backmaterials.push(bmat); obj.userData.facetmaterial = frontmaterials.concat(backmaterials); } } else if (materials instanceof THREE.Material) { frontmaterials = materials.clone() frontmaterials.side = THREE.FrontSide; backmaterials = materials.clone() backmaterials.side = THREE.BackSide; obj.userData.facetmaterial = [frontmaterials, backmaterials]; } // duplicating the object with front and back should avoid transparency issues var backmesh = new THREE.Mesh(geometry, backmaterials); // meshname is used to show/hide objects backmesh.name = "backfaces"; obj.add(backmesh); var frontmesh = new THREE.Mesh(geometry, frontmaterials); frontmesh.name = "frontfaces"; obj.add(frontmesh); updateFacesPosition(obj); } // //INITIALIZING function updateFacesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.triangleindices; var faces = obj.getObjectByName("frontfaces"); var ba = faces.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } faces.geometry.attributes.position.needsUpdate = true; } function updateEdgesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.edgeindices; var lines = obj.getObjectByName("lines"); var ba = lines.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } lines.geometry.attributes.position.needsUpdate = true; } function onWindowResize() { renderer.setSize( three.clientWidth, three.clientHeight ); svgRenderer.setSize( three.clientWidth, three.clientHeight ); updateCamera(); } function updateCamera() { var width = three.clientWidth; var height = three.clientHeight; var aspect = width / height; if (camera.type == "OrthographicCamera") { camera.left = frustumSize * aspect / - 2; camera.right = frustumSize * aspect / 2; camera.top = frustumSize / 2; camera.bottom = - frustumSize / 2; } else if (camera.type == "PerspectiveCamera") { camera.aspect = aspect; } camera.updateProjectionMatrix(); } function changeCamera(event) { var selindex = event.currentTarget.selectedIndex; camera = cameras[selindex]; control = controls[selindex]; control.enabled = true; for (var i=0; i<controls.length; i++) { if (i!=selindex) { controls[i].enabled = false; } } updateCamera(); } var camtypenode = document.getElementById('cameraType_6'); camtypenode.onchange = changeCamera; camtypenode.dispatchEvent(new Event('change')); onWindowResize(); window.addEventListener('resize', onWindowResize); var xRotationEnabled = false; var yRotationEnabled = false; var zRotationEnabled = false; var rotationSpeedFactor = 1; var settingsShown = false; var labelsShown = true; var intervals = []; var timeouts = []; var explodingSpeed = 0.05; var explodeScale = 0.000001; var XMLS = new XMLSerializer(); var svgElement; var renderId; var render = function () { renderId = requestAnimationFrame(render); // comment in for automatic explosion // explode(updateFactor()); var phi = 0.02 * rotationSpeedFactor; if (xRotationEnabled) { scene.rotation.x += phi; } if (yRotationEnabled) { scene.rotation.y += phi; } if (zRotationEnabled) { scene.rotation.z += phi; } control.update(); renderer.render(scene, camera); }; if ( THREE.WEBGL.isWebGLAvailable() ) { render(); } else { var warning = WEBGL.getWebGLErrorMessage(); three.appendChild( warning ); } function changeTransparency() { var opacity = 1-Number(event.currentTarget.value); for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].opacity = opacity; } } else { child.userData.facetmaterial.opacity = opacity; } } } } function toggleDepthWrite(event) { depthwrite = event.currentTarget.checked; for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].depthWrite = depthwrite; } } else { child.userData.facetmaterial.depthWrite = depthWrite; } } } } function changeRotationX(event){ xRotationEnabled = event.currentTarget.checked; } function changeRotationY(event){ yRotationEnabled = event.currentTarget.checked; } function changeRotationZ(event){ zRotationEnabled = event.currentTarget.checked; } function changeRotationSpeedFactor(event){ rotationSpeedFactor = Number(event.currentTarget.value); } function resetScene(){ scene.rotation.set(0,0,0); camera.position.set(0,0,5); camera.up.set(0,1,0); } function showSettings(event){ document.getElementById('settings_6').style.visibility = 'visible'; document.getElementById('showSettingsButton_6').style.visibility = 'hidden'; document.getElementById('hideSettingsButton_6').style.visibility = 'visible'; settingsShown = true; } function hideSettings(event){ document.getElementById('settings_6').style.visibility = 'hidden'; document.getElementById('showSettingsButton_6').style.visibility = 'visible'; document.getElementById('hideSettingsButton_6').style.visibility = 'hidden'; settingsShown = false; } var pos = 150* Math.PI; function updateFactor() { pos++; return Math.sin(.01*pos)+1; } // ------------------------ FOLDING ------------------------------------------------ // --------------------------------------------------------------------------------- // rotate point p around axis defined by points p1 and p2 by given angle function rotate(p, p1, p2, angle ){ angle = -angle; var x = p.x, y = p.y, z = p.z, a = p1.x, b = p1.y, c = p1.z, u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z; var result = []; var L = u*u + v*v + w*w; var sqrt = Math.sqrt; var cos = Math.cos; var sin = Math.sin; result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L; result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L; result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L; return result; } var fold = function(event){ var obj = foldables[Number(event.currentTarget.name)]; var foldvalue = Number(event.currentTarget.value); var scale = foldvalue - obj.userData.oldscale; for (var j=0; j<obj.userData.axes.length; j++) { rotateVertices(obj, j, scale); } update(obj); obj.userData.oldscale += scale; lookAtBarycenter(obj); } function lookAtBarycenter(obj){ control.target = barycenter(obj); } function barycenter(obj) { var center = new THREE.Vector3(0,0,0); var points = obj.userData.points; for (var i=0; i<points.length; i++){ center.add(points[i].vector); } center.divideScalar(points.length); return center; } function rotateVertices(obj, edge, scale) { var axes = obj.userData.axes; var subtrees = obj.userData.subtrees; var points = obj.userData.points; var angles = obj.userData.angles; if (edge < axes.length){ for (var j=0; j<subtrees[edge].length; j++){ var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge])); points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]); } } } function update(obj) { updateFacesPosition(obj); updateEdgesPosition(obj); } if (foldables.length) { var settings = document.getElementById('settings_6'); var foldDiv = document.createElement('div'); foldDiv.id = 'fold_6'; var title = document.createElement('strong'); title.innerHTML = 'Fold'; foldDiv.appendChild(title); foldDiv.className = 'group'; for (var i=0; i<foldables.length; i++) { var range = document.createElement('input'); range.type = 'range'; range.min = 0; range.max = 1; range.value = 0; range.step = 0.001; range.name = String(i); range.oninput = fold; foldDiv.appendChild(range); } lookAtBarycenter(foldables[0]); settings.insertBefore(foldDiv,settings.childNodes[0]); } // ---------------------- EXPLOSION ------------------------------------------------ // --------------------------------------------------------------------------------- if (explodableModel) { for (var i=0; i<scene.children.length; i++) { obj = scene.children[i]; if ( obj.userData.explodable ) { computeCentroid(obj); } } document.getElementById('explodeRange_6').oninput = triggerExplode; document.getElementById('explodeCheckbox_6').onchange = triggerAutomaticExplode; document.getElementById('explodingSpeedRange_6').oninput = setExplodingSpeed; explode(0.000001); } function computeCentroid(obj) { centroid = new THREE.Vector3(); obj.userData.points.forEach(function(pmpoint) { centroid.add(pmpoint.vector); }); centroid.divideScalar(obj.userData.points.length); obj.userData.centroid = centroid; } function explode(factor) { for (var i=0; i<scene.children.length; i++) { var obj = scene.children[i]; if (obj.userData.hasOwnProperty("centroid")) { var c = obj.userData.centroid; obj.position.set(c.x*factor, c.y*factor, c.z*factor); } } } function triggerExplode(event){ explodeScale = Number(event.currentTarget.value); explode(explodeScale); } function setExplodingSpeed(event){ explodingSpeed = Number(event.currentTarget.value); } function triggerAutomaticExplode(event){ if (event.currentTarget.checked){ startExploding(); } else { clearIntervals(); } } function startExploding(){ intervals.push(setInterval(explodingInterval, 25)); } function explodingInterval(){ explodeScale += explodingSpeed; if (explodeScale <= 6){ explode(explodeScale); } else{ explode(6); explodeScale = 6; clearIntervals(); timeouts.push(setTimeout(startUnexploding, 3000)); } document.getElementById('explodeRange_6').value = explodeScale; } function startUnexploding(){ intervals.push(setInterval(unexplodingInterval, 25)); } function unexplodingInterval(){ explodeScale -= explodingSpeed; if (explodeScale >= 0){ explode(explodeScale); } else { explode(0); explodeScale = 0; clearIntervals(); timeouts.push(setTimeout(startExploding, 3000)); } document.getElementById('explodeRange_6').value = explodeScale; } function clearIntervals(){ intervals.forEach(function(interval){ clearInterval(interval); }); intervals = []; timeouts.forEach(function(timeout){ clearTimeout(timeout); }); timeouts = []; } // ---------------------- DISPLAY -------------------------------------------------- // --------------------------------------------------------------------------------- const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" }; const objectTypeVisible = {}; Object.assign(objectTypeVisible,modelContains); const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort(); const shownObjectTypesList = document.getElementById('shownObjectTypesList_6'); function setVisibility(bool,objname) { for (var i=0; i<scene.children.length; i++){ var obj = scene.children[i].getObjectByName(objname); if (obj) { obj.visible = bool; } } } function toggleObjectTypeVisibility(event){ var name = event.currentTarget.name; var checked = event.currentTarget.checked; objectTypeVisible[name] = checked; if (name == "faces") { setVisibility(checked,"frontfaces"); setVisibility(checked,"backfaces"); } else { setVisibility(checked,name); } } for (var i=0; i<sortedObjectTypeKeys.length; i++){ var key = sortedObjectTypeKeys[i]; if (modelContains[key]) { var objTypeNode = document.createElement('span'); objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = key; checkbox.onchange = toggleObjectTypeVisibility; shownObjectTypesList.appendChild(checkbox); shownObjectTypesList.appendChild(objTypeNode); } } // ------------------------------------------------------ function toggleObjectVisibility(event){ var nr = Number(event.currentTarget.name); scene.children[nr].visible = event.currentTarget.checked; } // append checkboxes for displaying or hiding objects var shownObjectsList = document.getElementById('shownObjectsList_6'); for (var i=0; i<scene.children.length; i++){ obj = scene.children[i]; var objNode = document.createElement('span'); objNode.innerHTML = obj.name + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = String(i); checkbox.onchange = toggleObjectVisibility; shownObjectsList.appendChild(checkbox); shownObjectsList.appendChild(objNode); } // ---------------------- SVG ------------------------------------------------------ // --------------------------------------------------------------------------------- function takeSvgScreenshot() { if (objectTypeVisible["pointlabels"]) { setVisibility(false,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(false,"edgelabels"); } svgRenderer.render(scene,camera); svgElement = XMLS.serializeToString(svgRenderer.domElement); if (objectTypeVisible["pointlabels"]) { setVisibility(true,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(true,"edgelabels"); } if (document.getElementById('tab_6').checked){ //show in new tab var myWindow = window.open("",""); myWindow.document.body.innerHTML = svgElement; } else{ // download svg file download("screenshot.svg", svgElement); } } function download(filename, text) { var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } document.getElementById('transparencyRange_6').oninput = changeTransparency; document.getElementById('depthWriteCheckbox_6').onchange = toggleDepthWrite; document.getElementById('changeRotationX_6').onchange = changeRotationX; document.getElementById('changeRotationY_6').onchange = changeRotationY; document.getElementById('changeRotationZ_6').onchange = changeRotationZ; document.getElementById('resetButton_6').onclick = resetScene; document.getElementById('rotationSpeedRange_6').oninput = changeRotationSpeedFactor; document.getElementById('takeScreenshot_6').onclick = takeSvgScreenshot; document.getElementById('showSettingsButton_6').onclick = showSettings; document.getElementById('hideSettingsButton_6').onclick = hideSettings; // ------------------ SHORTCUTS -------------------------------------------- // ------------------------------------------------------------------------- /** * http://www.openjs.com/scripts/events/keyboard_shortcuts/ * Version : 2.01.B * By Binny V A * License : BSD */ shortcut = { 'all_shortcuts':{},//All the shortcuts are stored in this array 'add': function(shortcut_combination,callback,opt) { //Provide a set of default options var default_options = { 'type':'keydown', 'propagate':false, 'disable_in_input':false, 'target':document, 'keycode':false } if(!opt) opt = default_options; else { for(var dfo in default_options) { if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo]; } } var ele = opt.target; if(typeof opt.target == 'string') ele = document.getElementById(opt.target); var ths = this; shortcut_combination = shortcut_combination.toLowerCase(); //The function to be called at keypress var func = function(e) { e = e || window.event; if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields var element; if(e.target) element=e.target; else if(e.srcElement) element=e.srcElement; if(element.nodeType==3) element=element.parentNode; if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return; } //Find Which key is pressed if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; var character = String.fromCharCode(code).toLowerCase(); if(code == 188) character=","; //If the user presses , when the type is onkeydown if(code == 190) character="."; //If the user presses , when the type is onkeydown var keys = shortcut_combination.split("+"); //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked var kp = 0; //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken var shift_nums = { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&", "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<", ".":">", "/":"?", "\\":"|" } //Special Keys - and their codes var special_keys = { 'esc':27, 'escape':27, 'tab':9, 'space':32, 'return':13, 'enter':13, 'backspace':8, 'scrolllock':145, 'scroll_lock':145, 'scroll':145, 'capslock':20, 'caps_lock':20, 'caps':20, 'numlock':144, 'num_lock':144, 'num':144, 'pause':19, 'break':19, 'insert':45, 'home':36, 'delete':46, 'end':35, 'pageup':33, 'page_up':33, 'pu':33, 'pagedown':34, 'page_down':34, 'pd':34, 'left':37, 'up':38, 'right':39, 'down':40, 'f1':112, 'f2':113, 'f3':114, 'f4':115, 'f5':116, 'f6':117, 'f7':118, 'f8':119, 'f9':120, 'f10':121, 'f11':122, 'f12':123 } var modifiers = { shift: { wanted:false, pressed:false}, ctrl : { wanted:false, pressed:false}, alt : { wanted:false, pressed:false}, meta : { wanted:false, pressed:false} //Meta is Mac specific }; if(e.ctrlKey) modifiers.ctrl.pressed = true; if(e.shiftKey) modifiers.shift.pressed = true; if(e.altKey) modifiers.alt.pressed = true; if(e.metaKey) modifiers.meta.pressed = true; for(var i=0; k=keys[i],i<keys.length; i++) { //Modifiers if(k == 'ctrl' || k == 'control') { kp++; modifiers.ctrl.wanted = true; } else if(k == 'shift') { kp++; modifiers.shift.wanted = true; } else if(k == 'alt') { kp++; modifiers.alt.wanted = true; } else if(k == 'meta') { kp++; modifiers.meta.wanted = true; } else if(k.length > 1) { //If it is a special key if(special_keys[k] == code) kp++; } else if(opt['keycode']) { if(opt['keycode'] == code) kp++; } else { //The special keys did not match if(character == k) kp++; else { if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase character = shift_nums[character]; if(character == k) kp++; } } } } if(kp == keys.length && modifiers.ctrl.pressed == modifiers.ctrl.wanted && modifiers.shift.pressed == modifiers.shift.wanted && modifiers.alt.pressed == modifiers.alt.wanted && modifiers.meta.pressed == modifiers.meta.wanted) { callback(e); if(!opt['propagate']) { //Stop the event //e.cancelBubble is supported by IE - this will kill the bubbling process. e.cancelBubble = true; e.returnValue = false; //e.stopPropagation works in Firefox. if (e.stopPropagation) { e.stopPropagation(); e.preventDefault(); } return false; } } } this.all_shortcuts[shortcut_combination] = { 'callback':func, 'target':ele, 'event': opt['type'] }; //Attach the function with the event if(ele.addEventListener) ele.addEventListener(opt['type'], func, false); else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func); else ele['on'+opt['type']] = func; }, //Remove the shortcut - just specify the shortcut and I will remove the binding 'remove':function(shortcut_combination) { shortcut_combination = shortcut_combination.toLowerCase(); var binding = this.all_shortcuts[shortcut_combination]; delete(this.all_shortcuts[shortcut_combination]) if(!binding) return; var type = binding['event']; var ele = binding['target']; var callback = binding['callback']; if(ele.detachEvent) ele.detachEvent('on'+type, callback); else if(ele.removeEventListener) ele.removeEventListener(type, callback, false); else ele['on'+type] = false; } } shortcut.add("Alt+Left",function() { var event = new Event('click'); if (settingsShown){ document.getElementById('hideSettingsButton_6').dispatchEvent(event); } else { document.getElementById('showSettingsButton_6').dispatchEvent(event); } }); // COMMON_CODE_BLOCK_END });}); </script> </body> </html> </HTML> <code perl> > $s = new HyperbolicSurface(DCEL=>$T3, PENNER_COORDINATES=>[2,1,1,1,1,1,1,1,1], SPECIAL_POINT=>[new Rational(1.5196714),new Rational(-0.5773503)]); > $p = secondary_polyhedron($s,7); > $p->VISUAL(FacetColor=>'255 180 80'); </code> <HTML> <!-- polymake for knusper Thu Mar 3 00:31:46 2022 p_bounded --> <html> <head> <meta charset=utf-8> <title>p_bounded</title> <style> /* // COMMON_CODE_BLOCK_BEGIN */ html {overflow: scroll;} strong{font-size: 18px;} canvas { z-index: 8; } input[type='radio'] {margin-left:0;} input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;} .group{padding-bottom: 15px;} .settings * {z-index: 11; } .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;} .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;} .showSettingsButton{visibility: visible; z-index: 12; position: absolute } .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5} button{margin-left: 0; margin-top: 10px} img{cursor: pointer;} .suboption{padding-top: 15px;} #model62478843586 { width: 100%; height: 100%; } .threejs_container { width: 100%; height: 75vh;} .settings{max-height: 74vh} input[type=range] { -webkit-appearance: none; padding:0; width:90%; margin-left: auto; margin-right: auto; margin-top: 15px; margin-bottom: 15px; display: block; } input[type=range]:focus { outline: none; } input[type=range]::-webkit-slider-runnable-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-webkit-slider-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; -webkit-appearance: none; margin-top: -5px; } input[type=range]:focus::-webkit-slider-runnable-track { background: #E3E3E3; } input[type=range]::-moz-range-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-moz-range-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]::-ms-track { height: 4px; cursor: pointer; animate: 0.2s; background: transparent; border-color: transparent; color: transparent; } input[type=range]::-ms-fill-lower { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-fill-upper { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]:focus::-ms-fill-lower { background: #E3E3E3; } input[type=range]:focus::-ms-fill-upper { background: #E3E3E3; } /* // COMMON_CODE_BLOCK_END */ </style> </head> <body> <div class='threejs_container'> <div id='settings_7' class='settings'> <div class=group id='transparency_7' class='transparency'> <strong>Transparency</strong> <input id='transparencyRange_7' type='range' min=0 max=1 step=0.01 value=0> <div class=indented><input id='depthWriteCheckbox_7' type='checkbox'>depthWrite</div> </div> <div class=group id='rotation_7'> <strong>Rotation</strong> <div class=indented> <div><input type='checkbox' id='changeRotationX_7'> x-axis</div> <div><input type='checkbox' id='changeRotationY_7'> y-axis</div> <div><input type='checkbox' id='changeRotationZ_7'> z-axis</div> <button id='resetButton_7'>Reset</button> </div> <div class=suboption>Rotation speed</div> <input id='rotationSpeedRange_7' type='range' min=0 max=5 step=0.01 value=2> </div> <div class=group id='display_7'> <strong>Display</strong> <div class=indented> <div id='shownObjectTypesList_7' class='shownObjectsList'></div> </div> <div class=suboption>Objects</div> <div class=indented> <div id='shownObjectsList_7' class='shownObjectsList'></div> </div> </div> <div class=group id='camera_7'> <strong>Camera</strong> <div class=indented> <form> <select id="cameraType_7"> <option value='perspective' selected> Perspective<br></option> <option value='orthographic' > Orthographic<br></option> </select> </form> </div> </div> <div class=group id='svg_7'> <strong>SVG</strong> <div class=indented> <form> <input type="radio" name='screenshotMode' value='download' id='download_7' checked> Download<br> <input type="radio" name='screenshotMode' value='tab' id='tab_7' > New tab<br> </form> <button id='takeScreenshot_7'>Screenshot</button> </div> </div> </div> <!-- end of settings --> <img id='hideSettingsButton_7' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px"> <img id='showSettingsButton_7' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px"> <div id="model62478843586"></div> </div> <script> requirejs.config({ paths: { three: '/kernelspecs/r118/polymake/three', TrackballControls: '/kernelspecs/r118/polymake/TrackballControls', OrbitControls: '/kernelspecs/r118/polymake/OrbitControls', Projector: '/kernelspecs/r118/polymake/Projector', SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer', WEBGL: '/kernelspecs/r118/polymake/WebGL', }, shim: { 'three': { exports: 'THREE'}, 'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' }, 'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' }, 'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' }, 'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' }, 'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' }, } }); require(['three'],function(THREE){ window.THREE = THREE; require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'], function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) { THREE.TrackballControls = TrackballControls; THREE.OrbitControls = OrbitControls; THREE.Projector = Projector; THREE.SVGRenderer = SVGRenderer; THREE.WEBGL = WEBGL; // COMMON_CODE_BLOCK_BEGIN const intervalLength = 25; // for automatic animations const explodableModel = false; const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false }; const foldables = []; var three = document.getElementById("model62478843586"); var scene = new THREE.Scene(); var renderer = new THREE.WebGLRenderer( { antialias: true } ); var svgRenderer = new THREE.SVGRenderer( { antialias: true } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setClearColor(0xFFFFFF, 1); svgRenderer.setClearColor(0xFFFFFF, 1); three.appendChild(renderer.domElement); var frustumSize = 4; var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()]; cameras.forEach(function(cam) { cam.position.set(0, 0, 5); cam.lookAt(0, 0, 0); cam.up.set(0, 1, 0); }); var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)]; var camera, control; controls[0].zoomSpeed = 0.2; controls[0].rotateSpeed = 4; // class to allow move points together with labels and spheres var PMPoint = function (x,y,z) { this.vector = new THREE.Vector3(x,y,z); this.sprite = null; this.sphere = null; } PMPoint.prototype.addLabel = function(labelsprite) { this.sprite = labelsprite; this.sprite.position.copy(this.vector); } PMPoint.prototype.addSphere = function(spheremesh) { this.sphere = spheremesh; this.sphere.position.copy(this.vector); } PMPoint.prototype.set = function(x,y,z) { this.vector.set(x,y,z); if (this.sprite) { this.sprite.position.copy(this.vector); } if (this.sphere) { this.sphere.position.copy(this.vector); } } PMPoint.prototype.radius = function() { if (this.sphere) { return this.sphere.geometry.parameters.radius; } else { return 0; } }; // select the target node var target = document.querySelector('#model62478843586'); // create an observer instance var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.removedNodes && mutation.removedNodes.length > 0) { cancelAnimationFrame(renderId); observer.disconnect(); console.log("cancelled frame "+renderId); } }); }); // configuration of the observer: var config = { childList: true, characterData: true } // pass in the target node, as well as the observer options while (target) { if (target.className=="output") { observer.observe(target, config); break; } target = target.parentNode; } // COMMON_CODE_BLOCK_END var obj0 = new THREE.Object3D(); obj0.name = "p_bounded"; obj0.userData.explodable = 1; obj0.userData.points = []; obj0.userData.points.push(new PMPoint(0.120339, 0.120455, 0.777622)); obj0.userData.points.push(new PMPoint(0.150264, 0.150243, 0.760835)); obj0.userData.points.push(new PMPoint(0.22754, -0.43769, 0.717368)); obj0.userData.points.push(new PMPoint(0.22748, 0.0136946, 0.71748)); obj0.userData.points.push(new PMPoint(0.120167, -0.43769, 0.777622)); obj0.userData.points.push(new PMPoint(0.174312, 0.125425, 0.747335)); obj0.userData.points.push(new PMPoint(0.390909, -0.43769, 0.411662)); obj0.userData.points.push(new PMPoint(0.202302, 0.248431, 0.561138)); obj0.userData.points.push(new PMPoint(0.0823926, 0.368335, 0.411682)); obj0.userData.points.push(new PMPoint(0.225353, 0.225381, 0.574804)); obj0.userData.points.push(new PMPoint(-0.437693, -0.43769, -0.0274964)); obj0.userData.points.push(new PMPoint(-0.437693, 0.390909, -0.0274964)); obj0.userData.points.push(new PMPoint(0.0823657, 0.368344, -0.0274964)); obj0.userData.points.push(new PMPoint(0.0142733, 0.390909, -0.0274964)); obj0.userData.points.push(new PMPoint(0.390909, -0.43769, -0.0274964)); obj0.userData.points.push(new PMPoint(0.248336, 0.202397, 0.56121)); obj0.userData.points.push(new PMPoint(-0.437693, -0.43769, 0.777622)); obj0.userData.points.push(new PMPoint(-0.437693, 0.390909, 0.411662)); obj0.userData.points.push(new PMPoint(0.0142733, 0.390909, 0.411662)); obj0.userData.points.push(new PMPoint(0.0144763, 0.390842, 0.411788)); obj0.userData.points.push(new PMPoint(0.12563, 0.174143, 0.747357)); obj0.userData.points.push(new PMPoint(0.150263, 0.150246, 0.760833)); obj0.userData.points.push(new PMPoint(-0.437693, 0.120281, 0.777622)); obj0.userData.points.push(new PMPoint(0.013813, 0.227381, 0.717324)); obj0.userData.points.push(new PMPoint(-0.437693, 0.227442, 0.71721)); obj0.userData.points.push(new PMPoint(0.368344, 0.0823657, -0.0274964)); obj0.userData.points.push(new PMPoint(0.390909, 0.0142733, -0.0274964)); obj0.userData.points.push(new PMPoint(0.368335, 0.0823926, 0.411662)); obj0.userData.points.push(new PMPoint(0.390909, 0.0142733, 0.411662)); obj0.userData.points.push(new PMPoint(0.390814, 0.0145615, 0.411841)); obj0.userData.pointradii = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; <!-- Vertex style --> obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj0.userData.pointlabels = [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "]; obj0.userData.edgeindices = [0, 1, 2, 3, 0, 4, 2, 4, 1, 5, 3, 5, 2, 6, 7, 8, 7, 9, 10, 11, 8, 12, 11, 13, 12, 13, 6, 14, 10, 14, 5, 15, 9, 15, 4, 16, 10, 16, 11, 17, 13, 18, 17, 18, 8, 19, 18, 19, 7, 20, 1, 21, 9, 21, 20, 21, 0, 22, 16, 22, 19, 23, 20, 23, 17, 24, 22, 24, 23, 24, 12, 25, 14, 26, 25, 26, 15, 27, 25, 27, 6, 28, 26, 28, 3, 29, 27, 29, 28, 29]; <!-- Edge style --> obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj0.userData.facets = [[21, 20, 23, 24, 22, 0, 1], [7, 20, 21, 9], [1, 0, 4, 2, 3, 5], [21, 1, 5, 15, 9], [8, 7, 9, 15, 27, 25, 12], [5, 3, 29, 27, 15], [0, 22, 16, 4], [23, 20, 7, 8, 19], [3, 2, 6, 28, 29], [24, 23, 19, 18, 17], [25, 27, 29, 28, 26], [19, 8, 12, 13, 18], [14, 26, 28, 6], [17, 18, 13, 11], [22, 24, 17, 11, 10, 16], [16, 10, 14, 6, 2, 4], [10, 11, 13, 12, 25, 26, 14]]; <!-- Facet style --> obj0.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj0); scene.add(obj0); // COMMON_CODE_BLOCK_BEGIN function textSpriteMaterial(message, parameters) { if ( parameters === undefined ) parameters = {}; var fontface = "Helvetica"; var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15; fontsize = fontsize*10; var lines = message.split('\\n'); var size = 512; for(var i = 0; i<lines.length; i++){ var tmp = lines[i].length; while(tmp*fontsize > size){ fontsize--; } } var canvas = document.createElement('canvas'); canvas.width = size; canvas.height = size; var context = canvas.getContext('2d'); context.fillStyle = "rgba(255, 255, 255, 0)"; context.fill(); context.font = fontsize + "px " + fontface; // text color context.fillStyle = "rgba(0, 0, 0, 1.0)"; for(var i = 0; i<lines.length; i++){ context.fillText(lines[i], size/2, size/2+i*fontsize); } // canvas contents will be used for a texture var texture = new THREE.Texture(canvas); texture.needsUpdate = true; var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 }); return spriteMaterial; } // ---------------------- INITIALIZING OBJECTS-------------------------------------- // --------------------------------------------------------------------------------- function init_object(obj) { if (obj.userData.hasOwnProperty("pointmaterial")) { init_points(obj); modelContains.points = true; } if (obj.userData.hasOwnProperty("pointlabels")) { init_pointlabels(obj); modelContains.pointlabels = true; } if (obj.userData.hasOwnProperty("edgematerial")) { init_lines(obj); modelContains.lines = true; } if (obj.userData.hasOwnProperty("edgelabels")) { init_edgelabels(obj); modelContains.edgelabels = true; } if (obj.userData.hasOwnProperty("arrowstyle")) { init_arrowheads(obj); modelContains.arrowheads = true; } if (obj.userData.hasOwnProperty("facetmaterial")) { init_faces(obj); modelContains.faces = true; } } function init_points(obj) { var pointgroup = new THREE.Group(); pointgroup.name = "points"; var points = obj.userData.points; var radii = obj.userData.pointradii; var materials = obj.userData.pointmaterial; var geometry,material; if (!Array.isArray(radii)) { geometry = new THREE.SphereBufferGeometry(radii); } if (!Array.isArray(materials)) { material = materials; } for (var i=0; i<points.length; i++) { var point = points[i]; if (Array.isArray(radii)) { if (radii[i] == 0) { continue; } geometry = new THREE.SphereBufferGeometry(radii[i]); } if (Array.isArray(materials)) { material = materials[i]; } var sphere = new THREE.Mesh(geometry, material); point.addSphere(sphere); pointgroup.add(sphere); } obj.add(pointgroup); } function init_pointlabels(obj) { var points = obj.userData.points; var labels = obj.userData.pointlabels; var pointlabels = new THREE.Group(); pointlabels.name = "pointlabels"; if (Array.isArray(labels)) { for (var i=0; i<points.length; i++) { var point = points[i]; var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<points.length; i++) { var point = points[i]; var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } obj.add(pointlabels); } function init_lines(obj) { var edgeindices = obj.userData.edgeindices; var points = obj.userData.points; var materials = obj.userData.edgematerial; var geometry = new THREE.BufferGeometry(); var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 ); var geometry = new THREE.BufferGeometry(); geometry.setAttribute('position', bufattr); if (Array.isArray(materials)) { for (var i=0; i<materials.length; i++) { geometry.addGroup(2*i,2,i); } } var lines = new THREE.LineSegments(geometry, materials); lines.name = "lines"; obj.add(lines); updateEdgesPosition(obj); } function init_edgelabels(obj) { var points = obj.userData.points; var edgeindices = obj.userData.edgeindices; var labels = obj.userData.edgelabels; var edgelabels = new THREE.Group(); edgelabels.name = "edgelabels"; if (Array.isArray(labels)) { for (var i=0; i<edgeindices.length/2; i++) { var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<edgeindices.length/2; i++) { var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } obj.add(edgelabels); } function init_arrowheads(obj) { var arrowheads = new THREE.Group(); arrowheads.name = "arrowheads"; var arrowstyle = obj.userData.arrowstyle; var edgeindices = obj.userData.edgeindices; var edgematerials = obj.userData.edgematerial; var points = obj.userData.points; var material; if (!Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials.color} ); } for (var i=0; i<edgeindices.length; i=i+2) { var start = points[edgeindices[i]]; var end = points[edgeindices[i+1]]; var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius(); if (dist <= 0) { continue; } var dir = new THREE.Vector3().subVectors(end.vector,start.vector); dir.normalize(); var axis = new THREE.Vector3().set(dir.z,0,-dir.x); axis.normalize(); var radians = Math.acos( dir.y ); var radius = dist/25; var height = dist/5; var geometry = new THREE.ConeBufferGeometry(radius,height); var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2)); if (Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} ); } var cone = new THREE.Mesh( geometry, material ); cone.quaternion.setFromAxisAngle(axis,radians);; cone.position.copy(position);; arrowheads.add(cone); } obj.add(arrowheads); } function init_faces(obj) { var points = obj.userData.points; var facets = obj.userData.facets; obj.userData.triangleindices = []; for (var i=0; i<facets.length; i++) { facet = facets[i]; for (var t=0; t<facet.length-2; t++) { obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]); } } var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute(bufarr,3); var materials = obj.userData.facetmaterial; var geometry = new THREE.BufferGeometry(); var frontmaterials = []; var backmaterials = []; geometry.setAttribute('position',bufattr); if (Array.isArray(materials)) { var tricount = 0; var facet; for (var i=0; i<facets.length; i++) { facet = facets[i]; geometry.addGroup(tricount,(facet.length-2)*3,i); tricount += (facet.length-2)*3; } for (var j=0; j<materials.length; j++) { var fmat = materials[j].clone() fmat.side = THREE.FrontSide; frontmaterials.push(fmat); var bmat = materials[j].clone() bmat.side = THREE.BackSide; backmaterials.push(bmat); obj.userData.facetmaterial = frontmaterials.concat(backmaterials); } } else if (materials instanceof THREE.Material) { frontmaterials = materials.clone() frontmaterials.side = THREE.FrontSide; backmaterials = materials.clone() backmaterials.side = THREE.BackSide; obj.userData.facetmaterial = [frontmaterials, backmaterials]; } // duplicating the object with front and back should avoid transparency issues var backmesh = new THREE.Mesh(geometry, backmaterials); // meshname is used to show/hide objects backmesh.name = "backfaces"; obj.add(backmesh); var frontmesh = new THREE.Mesh(geometry, frontmaterials); frontmesh.name = "frontfaces"; obj.add(frontmesh); updateFacesPosition(obj); } // //INITIALIZING function updateFacesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.triangleindices; var faces = obj.getObjectByName("frontfaces"); var ba = faces.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } faces.geometry.attributes.position.needsUpdate = true; } function updateEdgesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.edgeindices; var lines = obj.getObjectByName("lines"); var ba = lines.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } lines.geometry.attributes.position.needsUpdate = true; } function onWindowResize() { renderer.setSize( three.clientWidth, three.clientHeight ); svgRenderer.setSize( three.clientWidth, three.clientHeight ); updateCamera(); } function updateCamera() { var width = three.clientWidth; var height = three.clientHeight; var aspect = width / height; if (camera.type == "OrthographicCamera") { camera.left = frustumSize * aspect / - 2; camera.right = frustumSize * aspect / 2; camera.top = frustumSize / 2; camera.bottom = - frustumSize / 2; } else if (camera.type == "PerspectiveCamera") { camera.aspect = aspect; } camera.updateProjectionMatrix(); } function changeCamera(event) { var selindex = event.currentTarget.selectedIndex; camera = cameras[selindex]; control = controls[selindex]; control.enabled = true; for (var i=0; i<controls.length; i++) { if (i!=selindex) { controls[i].enabled = false; } } updateCamera(); } var camtypenode = document.getElementById('cameraType_7'); camtypenode.onchange = changeCamera; camtypenode.dispatchEvent(new Event('change')); onWindowResize(); window.addEventListener('resize', onWindowResize); var xRotationEnabled = false; var yRotationEnabled = false; var zRotationEnabled = false; var rotationSpeedFactor = 1; var settingsShown = false; var labelsShown = true; var intervals = []; var timeouts = []; var explodingSpeed = 0.05; var explodeScale = 0.000001; var XMLS = new XMLSerializer(); var svgElement; var renderId; var render = function () { renderId = requestAnimationFrame(render); // comment in for automatic explosion // explode(updateFactor()); var phi = 0.02 * rotationSpeedFactor; if (xRotationEnabled) { scene.rotation.x += phi; } if (yRotationEnabled) { scene.rotation.y += phi; } if (zRotationEnabled) { scene.rotation.z += phi; } control.update(); renderer.render(scene, camera); }; if ( THREE.WEBGL.isWebGLAvailable() ) { render(); } else { var warning = WEBGL.getWebGLErrorMessage(); three.appendChild( warning ); } function changeTransparency() { var opacity = 1-Number(event.currentTarget.value); for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].opacity = opacity; } } else { child.userData.facetmaterial.opacity = opacity; } } } } function toggleDepthWrite(event) { depthwrite = event.currentTarget.checked; for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].depthWrite = depthwrite; } } else { child.userData.facetmaterial.depthWrite = depthWrite; } } } } function changeRotationX(event){ xRotationEnabled = event.currentTarget.checked; } function changeRotationY(event){ yRotationEnabled = event.currentTarget.checked; } function changeRotationZ(event){ zRotationEnabled = event.currentTarget.checked; } function changeRotationSpeedFactor(event){ rotationSpeedFactor = Number(event.currentTarget.value); } function resetScene(){ scene.rotation.set(0,0,0); camera.position.set(0,0,5); camera.up.set(0,1,0); } function showSettings(event){ document.getElementById('settings_7').style.visibility = 'visible'; document.getElementById('showSettingsButton_7').style.visibility = 'hidden'; document.getElementById('hideSettingsButton_7').style.visibility = 'visible'; settingsShown = true; } function hideSettings(event){ document.getElementById('settings_7').style.visibility = 'hidden'; document.getElementById('showSettingsButton_7').style.visibility = 'visible'; document.getElementById('hideSettingsButton_7').style.visibility = 'hidden'; settingsShown = false; } var pos = 150* Math.PI; function updateFactor() { pos++; return Math.sin(.01*pos)+1; } // ------------------------ FOLDING ------------------------------------------------ // --------------------------------------------------------------------------------- // rotate point p around axis defined by points p1 and p2 by given angle function rotate(p, p1, p2, angle ){ angle = -angle; var x = p.x, y = p.y, z = p.z, a = p1.x, b = p1.y, c = p1.z, u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z; var result = []; var L = u*u + v*v + w*w; var sqrt = Math.sqrt; var cos = Math.cos; var sin = Math.sin; result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L; result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L; result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L; return result; } var fold = function(event){ var obj = foldables[Number(event.currentTarget.name)]; var foldvalue = Number(event.currentTarget.value); var scale = foldvalue - obj.userData.oldscale; for (var j=0; j<obj.userData.axes.length; j++) { rotateVertices(obj, j, scale); } update(obj); obj.userData.oldscale += scale; lookAtBarycenter(obj); } function lookAtBarycenter(obj){ control.target = barycenter(obj); } function barycenter(obj) { var center = new THREE.Vector3(0,0,0); var points = obj.userData.points; for (var i=0; i<points.length; i++){ center.add(points[i].vector); } center.divideScalar(points.length); return center; } function rotateVertices(obj, edge, scale) { var axes = obj.userData.axes; var subtrees = obj.userData.subtrees; var points = obj.userData.points; var angles = obj.userData.angles; if (edge < axes.length){ for (var j=0; j<subtrees[edge].length; j++){ var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge])); points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]); } } } function update(obj) { updateFacesPosition(obj); updateEdgesPosition(obj); } if (foldables.length) { var settings = document.getElementById('settings_7'); var foldDiv = document.createElement('div'); foldDiv.id = 'fold_7'; var title = document.createElement('strong'); title.innerHTML = 'Fold'; foldDiv.appendChild(title); foldDiv.className = 'group'; for (var i=0; i<foldables.length; i++) { var range = document.createElement('input'); range.type = 'range'; range.min = 0; range.max = 1; range.value = 0; range.step = 0.001; range.name = String(i); range.oninput = fold; foldDiv.appendChild(range); } lookAtBarycenter(foldables[0]); settings.insertBefore(foldDiv,settings.childNodes[0]); } // ---------------------- EXPLOSION ------------------------------------------------ // --------------------------------------------------------------------------------- if (explodableModel) { for (var i=0; i<scene.children.length; i++) { obj = scene.children[i]; if ( obj.userData.explodable ) { computeCentroid(obj); } } document.getElementById('explodeRange_7').oninput = triggerExplode; document.getElementById('explodeCheckbox_7').onchange = triggerAutomaticExplode; document.getElementById('explodingSpeedRange_7').oninput = setExplodingSpeed; explode(0.000001); } function computeCentroid(obj) { centroid = new THREE.Vector3(); obj.userData.points.forEach(function(pmpoint) { centroid.add(pmpoint.vector); }); centroid.divideScalar(obj.userData.points.length); obj.userData.centroid = centroid; } function explode(factor) { for (var i=0; i<scene.children.length; i++) { var obj = scene.children[i]; if (obj.userData.hasOwnProperty("centroid")) { var c = obj.userData.centroid; obj.position.set(c.x*factor, c.y*factor, c.z*factor); } } } function triggerExplode(event){ explodeScale = Number(event.currentTarget.value); explode(explodeScale); } function setExplodingSpeed(event){ explodingSpeed = Number(event.currentTarget.value); } function triggerAutomaticExplode(event){ if (event.currentTarget.checked){ startExploding(); } else { clearIntervals(); } } function startExploding(){ intervals.push(setInterval(explodingInterval, 25)); } function explodingInterval(){ explodeScale += explodingSpeed; if (explodeScale <= 6){ explode(explodeScale); } else{ explode(6); explodeScale = 6; clearIntervals(); timeouts.push(setTimeout(startUnexploding, 3000)); } document.getElementById('explodeRange_7').value = explodeScale; } function startUnexploding(){ intervals.push(setInterval(unexplodingInterval, 25)); } function unexplodingInterval(){ explodeScale -= explodingSpeed; if (explodeScale >= 0){ explode(explodeScale); } else { explode(0); explodeScale = 0; clearIntervals(); timeouts.push(setTimeout(startExploding, 3000)); } document.getElementById('explodeRange_7').value = explodeScale; } function clearIntervals(){ intervals.forEach(function(interval){ clearInterval(interval); }); intervals = []; timeouts.forEach(function(timeout){ clearTimeout(timeout); }); timeouts = []; } // ---------------------- DISPLAY -------------------------------------------------- // --------------------------------------------------------------------------------- const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" }; const objectTypeVisible = {}; Object.assign(objectTypeVisible,modelContains); const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort(); const shownObjectTypesList = document.getElementById('shownObjectTypesList_7'); function setVisibility(bool,objname) { for (var i=0; i<scene.children.length; i++){ var obj = scene.children[i].getObjectByName(objname); if (obj) { obj.visible = bool; } } } function toggleObjectTypeVisibility(event){ var name = event.currentTarget.name; var checked = event.currentTarget.checked; objectTypeVisible[name] = checked; if (name == "faces") { setVisibility(checked,"frontfaces"); setVisibility(checked,"backfaces"); } else { setVisibility(checked,name); } } for (var i=0; i<sortedObjectTypeKeys.length; i++){ var key = sortedObjectTypeKeys[i]; if (modelContains[key]) { var objTypeNode = document.createElement('span'); objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = key; checkbox.onchange = toggleObjectTypeVisibility; shownObjectTypesList.appendChild(checkbox); shownObjectTypesList.appendChild(objTypeNode); } } // ------------------------------------------------------ function toggleObjectVisibility(event){ var nr = Number(event.currentTarget.name); scene.children[nr].visible = event.currentTarget.checked; } // append checkboxes for displaying or hiding objects var shownObjectsList = document.getElementById('shownObjectsList_7'); for (var i=0; i<scene.children.length; i++){ obj = scene.children[i]; var objNode = document.createElement('span'); objNode.innerHTML = obj.name + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = String(i); checkbox.onchange = toggleObjectVisibility; shownObjectsList.appendChild(checkbox); shownObjectsList.appendChild(objNode); } // ---------------------- SVG ------------------------------------------------------ // --------------------------------------------------------------------------------- function takeSvgScreenshot() { if (objectTypeVisible["pointlabels"]) { setVisibility(false,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(false,"edgelabels"); } svgRenderer.render(scene,camera); svgElement = XMLS.serializeToString(svgRenderer.domElement); if (objectTypeVisible["pointlabels"]) { setVisibility(true,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(true,"edgelabels"); } if (document.getElementById('tab_7').checked){ //show in new tab var myWindow = window.open("",""); myWindow.document.body.innerHTML = svgElement; } else{ // download svg file download("screenshot.svg", svgElement); } } function download(filename, text) { var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } document.getElementById('transparencyRange_7').oninput = changeTransparency; document.getElementById('depthWriteCheckbox_7').onchange = toggleDepthWrite; document.getElementById('changeRotationX_7').onchange = changeRotationX; document.getElementById('changeRotationY_7').onchange = changeRotationY; document.getElementById('changeRotationZ_7').onchange = changeRotationZ; document.getElementById('resetButton_7').onclick = resetScene; document.getElementById('rotationSpeedRange_7').oninput = changeRotationSpeedFactor; document.getElementById('takeScreenshot_7').onclick = takeSvgScreenshot; document.getElementById('showSettingsButton_7').onclick = showSettings; document.getElementById('hideSettingsButton_7').onclick = hideSettings; // ------------------ SHORTCUTS -------------------------------------------- // ------------------------------------------------------------------------- /** * http://www.openjs.com/scripts/events/keyboard_shortcuts/ * Version : 2.01.B * By Binny V A * License : BSD */ shortcut = { 'all_shortcuts':{},//All the shortcuts are stored in this array 'add': function(shortcut_combination,callback,opt) { //Provide a set of default options var default_options = { 'type':'keydown', 'propagate':false, 'disable_in_input':false, 'target':document, 'keycode':false } if(!opt) opt = default_options; else { for(var dfo in default_options) { if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo]; } } var ele = opt.target; if(typeof opt.target == 'string') ele = document.getElementById(opt.target); var ths = this; shortcut_combination = shortcut_combination.toLowerCase(); //The function to be called at keypress var func = function(e) { e = e || window.event; if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields var element; if(e.target) element=e.target; else if(e.srcElement) element=e.srcElement; if(element.nodeType==3) element=element.parentNode; if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return; } //Find Which key is pressed if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; var character = String.fromCharCode(code).toLowerCase(); if(code == 188) character=","; //If the user presses , when the type is onkeydown if(code == 190) character="."; //If the user presses , when the type is onkeydown var keys = shortcut_combination.split("+"); //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked var kp = 0; //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken var shift_nums = { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&", "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<", ".":">", "/":"?", "\\":"|" } //Special Keys - and their codes var special_keys = { 'esc':27, 'escape':27, 'tab':9, 'space':32, 'return':13, 'enter':13, 'backspace':8, 'scrolllock':145, 'scroll_lock':145, 'scroll':145, 'capslock':20, 'caps_lock':20, 'caps':20, 'numlock':144, 'num_lock':144, 'num':144, 'pause':19, 'break':19, 'insert':45, 'home':36, 'delete':46, 'end':35, 'pageup':33, 'page_up':33, 'pu':33, 'pagedown':34, 'page_down':34, 'pd':34, 'left':37, 'up':38, 'right':39, 'down':40, 'f1':112, 'f2':113, 'f3':114, 'f4':115, 'f5':116, 'f6':117, 'f7':118, 'f8':119, 'f9':120, 'f10':121, 'f11':122, 'f12':123 } var modifiers = { shift: { wanted:false, pressed:false}, ctrl : { wanted:false, pressed:false}, alt : { wanted:false, pressed:false}, meta : { wanted:false, pressed:false} //Meta is Mac specific }; if(e.ctrlKey) modifiers.ctrl.pressed = true; if(e.shiftKey) modifiers.shift.pressed = true; if(e.altKey) modifiers.alt.pressed = true; if(e.metaKey) modifiers.meta.pressed = true; for(var i=0; k=keys[i],i<keys.length; i++) { //Modifiers if(k == 'ctrl' || k == 'control') { kp++; modifiers.ctrl.wanted = true; } else if(k == 'shift') { kp++; modifiers.shift.wanted = true; } else if(k == 'alt') { kp++; modifiers.alt.wanted = true; } else if(k == 'meta') { kp++; modifiers.meta.wanted = true; } else if(k.length > 1) { //If it is a special key if(special_keys[k] == code) kp++; } else if(opt['keycode']) { if(opt['keycode'] == code) kp++; } else { //The special keys did not match if(character == k) kp++; else { if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase character = shift_nums[character]; if(character == k) kp++; } } } } if(kp == keys.length && modifiers.ctrl.pressed == modifiers.ctrl.wanted && modifiers.shift.pressed == modifiers.shift.wanted && modifiers.alt.pressed == modifiers.alt.wanted && modifiers.meta.pressed == modifiers.meta.wanted) { callback(e); if(!opt['propagate']) { //Stop the event //e.cancelBubble is supported by IE - this will kill the bubbling process. e.cancelBubble = true; e.returnValue = false; //e.stopPropagation works in Firefox. if (e.stopPropagation) { e.stopPropagation(); e.preventDefault(); } return false; } } } this.all_shortcuts[shortcut_combination] = { 'callback':func, 'target':ele, 'event': opt['type'] }; //Attach the function with the event if(ele.addEventListener) ele.addEventListener(opt['type'], func, false); else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func); else ele['on'+opt['type']] = func; }, //Remove the shortcut - just specify the shortcut and I will remove the binding 'remove':function(shortcut_combination) { shortcut_combination = shortcut_combination.toLowerCase(); var binding = this.all_shortcuts[shortcut_combination]; delete(this.all_shortcuts[shortcut_combination]) if(!binding) return; var type = binding['event']; var ele = binding['target']; var callback = binding['callback']; if(ele.detachEvent) ele.detachEvent('on'+type, callback); else if(ele.removeEventListener) ele.removeEventListener(type, callback, false); else ele['on'+type] = false; } } shortcut.add("Alt+Left",function() { var event = new Event('click'); if (settingsShown){ document.getElementById('hideSettingsButton_7').dispatchEvent(event); } else { document.getElementById('showSettingsButton_7').dispatchEvent(event); } }); // COMMON_CODE_BLOCK_END });}); </script> </body> </html> </HTML> <code perl> > $d0 = $s->gkz_dome(0,5); > $d0->VISUAL(FacetColor=>'80 180 255'); </code> <HTML> <!-- polymake for knusper Thu Mar 3 00:31:49 2022 pcom:d0 --> <html> <head> <meta charset=utf-8> <title>pcom:d0</title> <style> /* // COMMON_CODE_BLOCK_BEGIN */ html {overflow: scroll;} strong{font-size: 18px;} canvas { z-index: 8; } input[type='radio'] {margin-left:0;} input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;} .group{padding-bottom: 15px;} .settings * {z-index: 11; } .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;} .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;} .showSettingsButton{visibility: visible; z-index: 12; position: absolute } .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5} button{margin-left: 0; margin-top: 10px} img{cursor: pointer;} .suboption{padding-top: 15px;} #model80848344258 { width: 100%; height: 100%; } .threejs_container { width: 100%; height: 75vh;} .settings{max-height: 74vh} input[type=range] { -webkit-appearance: none; padding:0; width:90%; margin-left: auto; margin-right: auto; margin-top: 15px; margin-bottom: 15px; display: block; } input[type=range]:focus { outline: none; } input[type=range]::-webkit-slider-runnable-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-webkit-slider-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; -webkit-appearance: none; margin-top: -5px; } input[type=range]:focus::-webkit-slider-runnable-track { background: #E3E3E3; } input[type=range]::-moz-range-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-moz-range-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]::-ms-track { height: 4px; cursor: pointer; animate: 0.2s; background: transparent; border-color: transparent; color: transparent; } input[type=range]::-ms-fill-lower { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-fill-upper { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]:focus::-ms-fill-lower { background: #E3E3E3; } input[type=range]:focus::-ms-fill-upper { background: #E3E3E3; } /* // COMMON_CODE_BLOCK_END */ </style> </head> <body> <div class='threejs_container'> <div id='settings_8' class='settings'> <div class=group id='explode_8'> <strong>Explode</strong> <input id='explodeRange_8' type='range' min='0.00001' max=6 step=0.01 value=0.00001> <div class=indented><input id='explodeCheckbox_8' type='checkbox'>Automatic explosion</div> <div class=suboption>Exploding speed</div> <input id='explodingSpeedRange_8' type='range' min=0 max=0.5 step=0.001 value=0.05> </div> <div class=group id='transparency_8' class='transparency'> <strong>Transparency</strong> <input id='transparencyRange_8' type='range' min=0 max=1 step=0.01 value=0> <div class=indented><input id='depthWriteCheckbox_8' type='checkbox'>depthWrite</div> </div> <div class=group id='rotation_8'> <strong>Rotation</strong> <div class=indented> <div><input type='checkbox' id='changeRotationX_8'> x-axis</div> <div><input type='checkbox' id='changeRotationY_8'> y-axis</div> <div><input type='checkbox' id='changeRotationZ_8'> z-axis</div> <button id='resetButton_8'>Reset</button> </div> <div class=suboption>Rotation speed</div> <input id='rotationSpeedRange_8' type='range' min=0 max=5 step=0.01 value=2> </div> <div class=group id='display_8'> <strong>Display</strong> <div class=indented> <div id='shownObjectTypesList_8' class='shownObjectsList'></div> </div> <div class=suboption>Objects</div> <div class=indented> <div id='shownObjectsList_8' class='shownObjectsList'></div> </div> </div> <div class=group id='camera_8'> <strong>Camera</strong> <div class=indented> <form> <select id="cameraType_8"> <option value='perspective' selected> Perspective<br></option> <option value='orthographic' > Orthographic<br></option> </select> </form> </div> </div> <div class=group id='svg_8'> <strong>SVG</strong> <div class=indented> <form> <input type="radio" name='screenshotMode' value='download' id='download_8' checked> Download<br> <input type="radio" name='screenshotMode' value='tab' id='tab_8' > New tab<br> </form> <button id='takeScreenshot_8'>Screenshot</button> </div> </div> </div> <!-- end of settings --> <img id='hideSettingsButton_8' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px"> <img id='showSettingsButton_8' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px"> <div id="model80848344258"></div> </div> <script> requirejs.config({ paths: { three: '/kernelspecs/r118/polymake/three', TrackballControls: '/kernelspecs/r118/polymake/TrackballControls', OrbitControls: '/kernelspecs/r118/polymake/OrbitControls', Projector: '/kernelspecs/r118/polymake/Projector', SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer', WEBGL: '/kernelspecs/r118/polymake/WebGL', }, shim: { 'three': { exports: 'THREE'}, 'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' }, 'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' }, 'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' }, 'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' }, 'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' }, } }); require(['three'],function(THREE){ window.THREE = THREE; require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'], function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) { THREE.TrackballControls = TrackballControls; THREE.OrbitControls = OrbitControls; THREE.Projector = Projector; THREE.SVGRenderer = SVGRenderer; THREE.WEBGL = WEBGL; // COMMON_CODE_BLOCK_BEGIN const intervalLength = 25; // for automatic animations const explodableModel = true; const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false }; const foldables = []; var three = document.getElementById("model80848344258"); var scene = new THREE.Scene(); var renderer = new THREE.WebGLRenderer( { antialias: true } ); var svgRenderer = new THREE.SVGRenderer( { antialias: true } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setClearColor(0xFFFFFF, 1); svgRenderer.setClearColor(0xFFFFFF, 1); three.appendChild(renderer.domElement); var frustumSize = 4; var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()]; cameras.forEach(function(cam) { cam.position.set(0, 0, 5); cam.lookAt(0, 0, 0); cam.up.set(0, 1, 0); }); var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)]; var camera, control; controls[0].zoomSpeed = 0.2; controls[0].rotateSpeed = 4; // class to allow move points together with labels and spheres var PMPoint = function (x,y,z) { this.vector = new THREE.Vector3(x,y,z); this.sprite = null; this.sphere = null; } PMPoint.prototype.addLabel = function(labelsprite) { this.sprite = labelsprite; this.sprite.position.copy(this.vector); } PMPoint.prototype.addSphere = function(spheremesh) { this.sphere = spheremesh; this.sphere.position.copy(this.vector); } PMPoint.prototype.set = function(x,y,z) { this.vector.set(x,y,z); if (this.sprite) { this.sprite.position.copy(this.vector); } if (this.sphere) { this.sphere.position.copy(this.vector); } } PMPoint.prototype.radius = function() { if (this.sphere) { return this.sphere.geometry.parameters.radius; } else { return 0; } }; // select the target node var target = document.querySelector('#model80848344258'); // create an observer instance var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.removedNodes && mutation.removedNodes.length > 0) { cancelAnimationFrame(renderId); observer.disconnect(); console.log("cancelled frame "+renderId); } }); }); // configuration of the observer: var config = { childList: true, characterData: true } // pass in the target node, as well as the observer options while (target) { if (target.className=="output") { observer.observe(target, config); break; } target = target.parentNode; } // COMMON_CODE_BLOCK_END var obj0 = new THREE.Object3D(); obj0.name = "unnamed__1"; obj0.userData.explodable = 1; obj0.userData.points = []; obj0.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667)); obj0.userData.points.push(new PMPoint(0.5, 0.866025, 0.6)); obj0.userData.points.push(new PMPoint(-1, 0, 0.0375)); obj0.userData.pointradii = 0.02; <!-- Vertex style --> obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj0.userData.pointlabels = ["0", "1", "2"]; obj0.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj0.userData.facets = [[0, 2, 1]]; <!-- Facet style --> obj0.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj0); scene.add(obj0); var obj1 = new THREE.Object3D(); obj1.name = "unnamed__2"; obj1.userData.explodable = 1; obj1.userData.points = []; obj1.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667)); obj1.userData.points.push(new PMPoint(0.5, 0.866025, 0.6)); obj1.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375)); obj1.userData.pointradii = 0.02; <!-- Vertex style --> obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj1.userData.pointlabels = ["0", "1", "3"]; obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj1.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj1.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj1); scene.add(obj1); var obj2 = new THREE.Object3D(); obj2.name = "unnamed__3"; obj2.userData.explodable = 1; obj2.userData.points = []; obj2.userData.points.push(new PMPoint(0.5, 0.866025, 0.6)); obj2.userData.points.push(new PMPoint(-1, 0, 0.0375)); obj2.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449)); obj2.userData.pointradii = 0.02; <!-- Vertex style --> obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj2.userData.pointlabels = ["1", "2", "4"]; obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj2.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj2); scene.add(obj2); var obj3 = new THREE.Object3D(); obj3.name = "unnamed__4"; obj3.userData.explodable = 1; obj3.userData.points = []; obj3.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667)); obj3.userData.points.push(new PMPoint(-1, 0, 0.0375)); obj3.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503)); obj3.userData.pointradii = 0.02; <!-- Vertex style --> obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj3.userData.pointlabels = ["0", "2", "5"]; obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj3.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj3.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj3); scene.add(obj3); var obj4 = new THREE.Object3D(); obj4.name = "unnamed__5"; obj4.userData.explodable = 1; obj4.userData.points = []; obj4.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667)); obj4.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375)); obj4.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503)); obj4.userData.pointradii = 0.02; <!-- Vertex style --> obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj4.userData.pointlabels = ["0", "3", "6"]; obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj4.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj4.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj4); scene.add(obj4); var obj5 = new THREE.Object3D(); obj5.name = "unnamed__6"; obj5.userData.explodable = 1; obj5.userData.points = []; obj5.userData.points.push(new PMPoint(0.5, 0.866025, 0.6)); obj5.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375)); obj5.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449)); obj5.userData.pointradii = 0.02; <!-- Vertex style --> obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj5.userData.pointlabels = ["1", "3", "7"]; obj5.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj5.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj5); scene.add(obj5); var obj6 = new THREE.Object3D(); obj6.name = "unnamed__7"; obj6.userData.explodable = 1; obj6.userData.points = []; obj6.userData.points.push(new PMPoint(0.5, 0.866025, 0.6)); obj6.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449)); obj6.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667)); obj6.userData.pointradii = 0.02; <!-- Vertex style --> obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj6.userData.pointlabels = ["1", "4", "8"]; obj6.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj6.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj6); scene.add(obj6); var obj7 = new THREE.Object3D(); obj7.name = "unnamed__8"; obj7.userData.explodable = 1; obj7.userData.points = []; obj7.userData.points.push(new PMPoint(-1, 0, 0.0375)); obj7.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449)); obj7.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034)); obj7.userData.pointradii = 0.02; <!-- Vertex style --> obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj7.userData.pointlabels = ["2", "4", "9"]; obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj7.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj7.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj7); scene.add(obj7); var obj8 = new THREE.Object3D(); obj8.name = "unnamed__9"; obj8.userData.explodable = 1; obj8.userData.points = []; obj8.userData.points.push(new PMPoint(-1, 0, 0.0375)); obj8.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503)); obj8.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218)); obj8.userData.pointradii = 0.02; <!-- Vertex style --> obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj8.userData.pointlabels = ["2", "5", "10"]; obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj8.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj8.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj8); scene.add(obj8); var obj9 = new THREE.Object3D(); obj9.name = "unnamed__10"; obj9.userData.explodable = 1; obj9.userData.points = []; obj9.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667)); obj9.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503)); obj9.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306)); obj9.userData.pointradii = 0.02; <!-- Vertex style --> obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj9.userData.pointlabels = ["0", "5", "11"]; obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj9.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj9.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj9); scene.add(obj9); var obj10 = new THREE.Object3D(); obj10.name = "unnamed__11"; obj10.userData.explodable = 1; obj10.userData.points = []; obj10.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667)); obj10.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503)); obj10.userData.points.push(new PMPoint(-0.142857, -0.989743, 0.000765306)); obj10.userData.pointradii = 0.02; <!-- Vertex style --> obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj10.userData.pointlabels = ["0", "6", "12"]; obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj10.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj10.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj10); scene.add(obj10); var obj11 = new THREE.Object3D(); obj11.name = "unnamed__12"; obj11.userData.explodable = 1; obj11.userData.points = []; obj11.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375)); obj11.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503)); obj11.userData.points.push(new PMPoint(0.209677, -0.977771, 0.000390219)); obj11.userData.pointradii = 0.02; <!-- Vertex style --> obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj11.userData.pointlabels = ["3", "6", "13"]; obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj11.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj11); scene.add(obj11); var obj12 = new THREE.Object3D(); obj12.name = "unnamed__13"; obj12.userData.explodable = 1; obj12.userData.points = []; obj12.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375)); obj12.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449)); obj12.userData.points.push(new PMPoint(0.785714, -0.61859, 0.00085034)); obj12.userData.pointradii = 0.02; <!-- Vertex style --> obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj12.userData.pointlabels = ["3", "7", "14"]; obj12.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj12.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj12); scene.add(obj12); var obj13 = new THREE.Object3D(); obj13.name = "unnamed__14"; obj13.userData.explodable = 1; obj13.userData.points = []; obj13.userData.points.push(new PMPoint(0.5, 0.866025, 0.6)); obj13.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449)); obj13.userData.points.push(new PMPoint(1, 0, 0.00416667)); obj13.userData.pointradii = 0.02; <!-- Vertex style --> obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj13.userData.pointlabels = ["1", "7", "15"]; obj13.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj13.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj13); scene.add(obj13); var obj14 = new THREE.Object3D(); obj14.name = "unnamed__15"; obj14.userData.explodable = 1; obj14.userData.points = []; obj14.userData.points.push(new PMPoint(0.5, 0.866025, 0.6)); obj14.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667)); obj14.userData.points.push(new PMPoint(-0.289474, 0.957186, 0.00103878)); obj14.userData.pointradii = 0.02; <!-- Vertex style --> obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj14.userData.pointlabels = ["1", "8", "16"]; obj14.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj14.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj14); scene.add(obj14); var obj15 = new THREE.Object3D(); obj15.name = "unnamed__16"; obj15.userData.explodable = 1; obj15.userData.points = []; obj15.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449)); obj15.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667)); obj15.userData.points.push(new PMPoint(-0.635135, 0.772401, 0.000273923)); obj15.userData.pointradii = 0.02; <!-- Vertex style --> obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj15.userData.pointlabels = ["4", "8", "17"]; obj15.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj15.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj15.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj15); scene.add(obj15); var obj16 = new THREE.Object3D(); obj16.name = "unnamed__17"; obj16.userData.explodable = 1; obj16.userData.points = []; obj16.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449)); obj16.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034)); obj16.userData.points.push(new PMPoint(-0.884615, 0.466321, 0.000138683)); obj16.userData.pointradii = 0.02; <!-- Vertex style --> obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj16.userData.pointlabels = ["4", "9", "18"]; obj16.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj16.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj16.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj16); scene.add(obj16); var obj17 = new THREE.Object3D(); obj17.name = "unnamed__18"; obj17.userData.explodable = 1; obj17.userData.points = []; obj17.userData.points.push(new PMPoint(-1, 0, 0.0375)); obj17.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034)); obj17.userData.points.push(new PMPoint(-0.965116, 0.261822, 0.0003245)); obj17.userData.pointradii = 0.02; <!-- Vertex style --> obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj17.userData.pointlabels = ["2", "9", "19"]; obj17.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj17.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj17.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj17); scene.add(obj17); var obj18 = new THREE.Object3D(); obj18.name = "unnamed__19"; obj18.userData.explodable = 1; obj18.userData.points = []; obj18.userData.points.push(new PMPoint(-1, 0, 0.0375)); obj18.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218)); obj18.userData.points.push(new PMPoint(-0.973684, -0.227901, 0.000184672)); obj18.userData.pointradii = 0.02; <!-- Vertex style --> obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj18.userData.pointlabels = ["2", "10", "20"]; obj18.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj18.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj18.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj18); scene.add(obj18); var obj19 = new THREE.Object3D(); obj19.name = "unnamed__20"; obj19.userData.explodable = 1; obj19.userData.points = []; obj19.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503)); obj19.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218)); obj19.userData.points.push(new PMPoint(-0.928571, -0.371154, 5.31463e-05)); obj19.userData.pointradii = 0.02; <!-- Vertex style --> obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj19.userData.pointlabels = ["5", "10", "21"]; obj19.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj19.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj19.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj19); scene.add(obj19); var obj20 = new THREE.Object3D(); obj20.name = "unnamed__21"; obj20.userData.explodable = 1; obj20.userData.points = []; obj20.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503)); obj20.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306)); obj20.userData.points.push(new PMPoint(-0.829114, -0.55908, 6.00865e-05)); obj20.userData.pointradii = 0.02; <!-- Vertex style --> obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj20.userData.pointlabels = ["5", "11", "22"]; obj20.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj20.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj20.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj20); scene.add(obj20); var obj21 = new THREE.Object3D(); obj21.name = "unnamed__22"; obj21.userData.explodable = 1; obj21.userData.points = []; obj21.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667)); obj21.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306)); obj21.userData.points.push(new PMPoint(-0.72449, -0.689286, 0.000156185)); obj21.userData.pointradii = 0.02; <!-- Vertex style --> obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj21.userData.pointlabels = ["0", "11", "23"]; obj21.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj21.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj21.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj21); scene.add(obj21); var obj22 = new THREE.Object3D(); obj22.name = "unnamed__23"; obj22.userData.explodable = 1; obj22.userData.points = []; obj22.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667)); obj22.userData.points.push(new PMPoint(-0.142857, -0.989743, 0.000765306)); obj22.userData.points.push(new PMPoint(-0.234694, -0.972069, 0.000156185)); obj22.userData.pointradii = 0.02; <!-- Vertex style --> obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj22.userData.pointlabels = ["0", "12", "24"]; obj22.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj22.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj22.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj22); scene.add(obj22); var obj23 = new THREE.Object3D(); obj23.name = "unnamed__24"; obj23.userData.explodable = 1; obj23.userData.points = []; obj23.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503)); obj23.userData.points.push(new PMPoint(-0.142857, -0.989743, 0.000765306)); obj23.userData.points.push(new PMPoint(-0.0696203, -0.997574, 6.00865e-05)); obj23.userData.pointradii = 0.02; <!-- Vertex style --> obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj23.userData.pointlabels = ["6", "12", "25"]; obj23.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj23.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj23); scene.add(obj23); var obj24 = new THREE.Object3D(); obj24.name = "unnamed__25"; obj24.userData.explodable = 1; obj24.userData.points = []; obj24.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503)); obj24.userData.points.push(new PMPoint(0.209677, -0.977771, 0.000390219)); obj24.userData.points.push(new PMPoint(0.142857, -0.989743, 5.31463e-05)); obj24.userData.pointradii = 0.02; <!-- Vertex style --> obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj24.userData.pointlabels = ["6", "13", "26"]; obj24.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj24.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj24.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj24); scene.add(obj24); var obj25 = new THREE.Object3D(); obj25.name = "unnamed__26"; obj25.userData.explodable = 1; obj25.userData.points = []; obj25.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375)); obj25.userData.points.push(new PMPoint(0.209677, -0.977771, 0.000390219)); obj25.userData.points.push(new PMPoint(0.289474, -0.957186, 0.000184672)); obj25.userData.pointradii = 0.02; <!-- Vertex style --> obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj25.userData.pointlabels = ["3", "13", "27"]; obj25.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj25.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj25.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj25); scene.add(obj25); var obj26 = new THREE.Object3D(); obj26.name = "unnamed__27"; obj26.userData.explodable = 1; obj26.userData.points = []; obj26.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375)); obj26.userData.points.push(new PMPoint(0.785714, -0.61859, 0.00085034)); obj26.userData.points.push(new PMPoint(0.709302, -0.704904, 0.0003245)); obj26.userData.pointradii = 0.02; <!-- Vertex style --> obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj26.userData.pointlabels = ["3", "14", "28"]; obj26.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj26.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj26.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj26); scene.add(obj26); var obj27 = new THREE.Object3D(); obj27.name = "unnamed__28"; obj27.userData.explodable = 1; obj27.userData.points = []; obj27.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449)); obj27.userData.points.push(new PMPoint(0.785714, -0.61859, 0.00085034)); obj27.userData.points.push(new PMPoint(0.846154, -0.532939, 0.000138683)); obj27.userData.pointradii = 0.02; <!-- Vertex style --> obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj27.userData.pointlabels = ["7", "14", "29"]; obj27.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj27.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj27.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj27); scene.add(obj27); var obj28 = new THREE.Object3D(); obj28.name = "unnamed__29"; obj28.userData.explodable = 1; obj28.userData.points = []; obj28.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449)); obj28.userData.points.push(new PMPoint(1, 0, 0.00416667)); obj28.userData.points.push(new PMPoint(0.986486, -0.163843, 0.000273923)); obj28.userData.pointradii = 0.02; <!-- Vertex style --> obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj28.userData.pointlabels = ["7", "15", "30"]; obj28.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj28.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj28.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj28); scene.add(obj28); var obj29 = new THREE.Object3D(); obj29.name = "unnamed__30"; obj29.userData.explodable = 1; obj29.userData.points = []; obj29.userData.points.push(new PMPoint(0.5, 0.866025, 0.6)); obj29.userData.points.push(new PMPoint(1, 0, 0.00416667)); obj29.userData.points.push(new PMPoint(0.973684, 0.227901, 0.00103878)); obj29.userData.pointradii = 0.02; <!-- Vertex style --> obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj29.userData.pointlabels = ["1", "15", "31"]; obj29.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj29.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj29.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj29); scene.add(obj29); var obj30 = new THREE.Object3D(); obj30.name = "unnamed__31"; obj30.userData.explodable = 1; obj30.userData.points = []; obj30.userData.points.push(new PMPoint(0.5, 0.866025, 0.6)); obj30.userData.points.push(new PMPoint(-0.289474, 0.957186, 0.00103878)); obj30.userData.points.push(new PMPoint(-0.142857, 0.989743, 0.000765306)); obj30.userData.pointradii = 0.02; <!-- Vertex style --> obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj30.userData.pointlabels = ["1", "16", "32"]; obj30.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj30.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj30.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj30); scene.add(obj30); var obj31 = new THREE.Object3D(); obj31.name = "unnamed__32"; obj31.userData.explodable = 1; obj31.userData.points = []; obj31.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667)); obj31.userData.points.push(new PMPoint(-0.289474, 0.957186, 0.00103878)); obj31.userData.points.push(new PMPoint(-0.385246, 0.922814, 0.000161247)); obj31.userData.pointradii = 0.02; <!-- Vertex style --> obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj31.userData.pointlabels = ["8", "16", "33"]; obj31.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj31.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj31.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj31); scene.add(obj31); var obj32 = new THREE.Object3D(); obj32.name = "unnamed__33"; obj32.userData.explodable = 1; obj32.userData.points = []; obj32.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667)); obj32.userData.points.push(new PMPoint(-0.635135, 0.772401, 0.000273923)); obj32.userData.points.push(new PMPoint(-0.587912, 0.808925, 7.2455e-05)); obj32.userData.pointradii = 0.02; <!-- Vertex style --> obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj32.userData.pointlabels = ["8", "17", "34"]; obj32.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj32.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj32.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj32); scene.add(obj32); var obj33 = new THREE.Object3D(); obj33.name = "unnamed__34"; obj33.userData.explodable = 1; obj33.userData.points = []; obj33.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449)); obj33.userData.points.push(new PMPoint(-0.635135, 0.772401, 0.000273923)); obj33.userData.points.push(new PMPoint(-0.684211, 0.729285, 6.49238e-05)); obj33.userData.pointradii = 0.02; <!-- Vertex style --> obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj33.userData.pointlabels = ["4", "17", "35"]; obj33.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj33.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj33.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj33); scene.add(obj33); var obj34 = new THREE.Object3D(); obj34.name = "unnamed__35"; obj34.userData.explodable = 1; obj34.userData.points = []; obj34.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449)); obj34.userData.points.push(new PMPoint(-0.884615, 0.466321, 0.000138683)); obj34.userData.points.push(new PMPoint(-0.860825, 0.508902, 6.37687e-05)); obj34.userData.pointradii = 0.02; <!-- Vertex style --> obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj34.userData.pointlabels = ["4", "18", "36"]; obj34.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj34.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj34.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj34); scene.add(obj34); var obj35 = new THREE.Object3D(); obj35.name = "unnamed__36"; obj35.userData.explodable = 1; obj35.userData.points = []; obj35.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034)); obj35.userData.points.push(new PMPoint(-0.884615, 0.466321, 0.000138683)); obj35.userData.points.push(new PMPoint(-0.902878, 0.429897, 3.10543e-05)); obj35.userData.pointradii = 0.02; <!-- Vertex style --> obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj35.userData.pointlabels = ["9", "18", "37"]; obj35.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj35.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj35.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj35); scene.add(obj35); var obj36 = new THREE.Object3D(); obj36.name = "unnamed__37"; obj36.userData.explodable = 1; obj36.userData.points = []; obj36.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034)); obj36.userData.points.push(new PMPoint(-0.965116, 0.261822, 0.0003245)); obj36.userData.points.push(new PMPoint(-0.951613, 0.307299, 2.43887e-05)); obj36.userData.pointradii = 0.02; <!-- Vertex style --> obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj36.userData.pointlabels = ["9", "19", "38"]; obj36.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj36.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj36.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj36); scene.add(obj36); var obj37 = new THREE.Object3D(); obj37.name = "unnamed__38"; obj37.userData.explodable = 1; obj37.userData.points = []; obj37.userData.points.push(new PMPoint(-1, 0, 0.0375)); obj37.userData.points.push(new PMPoint(-0.965116, 0.261822, 0.0003245)); obj37.userData.points.push(new PMPoint(-0.979452, 0.201677, 7.03697e-05)); obj37.userData.pointradii = 0.02; <!-- Vertex style --> obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj37.userData.pointlabels = ["2", "19", "39"]; obj37.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj37.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj37.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj37); scene.add(obj37); var obj38 = new THREE.Object3D(); obj38.name = "unnamed__39"; obj38.userData.explodable = 1; obj38.userData.points = []; obj38.userData.points.push(new PMPoint(-1, 0, 0.0375)); obj38.userData.points.push(new PMPoint(-0.973684, -0.227901, 0.000184672)); obj38.userData.points.push(new PMPoint(-0.983516, -0.180818, 4.52844e-05)); obj38.userData.pointradii = 0.02; <!-- Vertex style --> obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj38.userData.pointlabels = ["2", "20", "40"]; obj38.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj38.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj38.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj38); scene.add(obj38); var obj39 = new THREE.Object3D(); obj39.name = "unnamed__40"; obj39.userData.explodable = 1; obj39.userData.points = []; obj39.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218)); obj39.userData.points.push(new PMPoint(-0.973684, -0.227901, 0.000184672)); obj39.userData.points.push(new PMPoint(-0.965116, -0.261822, 1.26758e-05)); obj39.userData.pointradii = 0.02; <!-- Vertex style --> obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj39.userData.pointlabels = ["10", "20", "41"]; obj39.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj39.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj39.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj39); scene.add(obj39); var obj40 = new THREE.Object3D(); obj40.name = "unnamed__41"; obj40.userData.explodable = 1; obj40.userData.points = []; obj40.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218)); obj40.userData.points.push(new PMPoint(-0.928571, -0.371154, 5.31463e-05)); obj40.userData.points.push(new PMPoint(-0.937788, -0.347208, 1.27418e-05)); obj40.userData.pointradii = 0.02; <!-- Vertex style --> obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj40.userData.pointlabels = ["10", "21", "42"]; obj40.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj40.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj40.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj40); scene.add(obj40); var obj41 = new THREE.Object3D(); obj41.name = "unnamed__42"; obj41.userData.explodable = 1; obj41.userData.points = []; obj41.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503)); obj41.userData.points.push(new PMPoint(-0.928571, -0.371154, 5.31463e-05)); obj41.userData.points.push(new PMPoint(-0.917178, -0.398478, 2.25827e-05)); obj41.userData.pointradii = 0.02; <!-- Vertex style --> obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj41.userData.pointlabels = ["5", "21", "43"]; obj41.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj41.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj41.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj41); scene.add(obj41); var obj42 = new THREE.Object3D(); obj42.name = "unnamed__43"; obj42.userData.explodable = 1; obj42.userData.points = []; obj42.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503)); obj42.userData.points.push(new PMPoint(-0.829114, -0.55908, 6.00865e-05)); obj42.userData.points.push(new PMPoint(-0.846154, -0.532939, 1.54093e-05)); obj42.userData.pointradii = 0.02; <!-- Vertex style --> obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj42.userData.pointlabels = ["5", "22", "44"]; obj42.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj42.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj42.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj42); scene.add(obj42); var obj43 = new THREE.Object3D(); obj43.name = "unnamed__44"; obj43.userData.explodable = 1; obj43.userData.points = []; obj43.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306)); obj43.userData.points.push(new PMPoint(-0.829114, -0.55908, 6.00865e-05)); obj43.userData.points.push(new PMPoint(-0.813433, -0.581659, 1.48511e-05)); obj43.userData.pointradii = 0.02; <!-- Vertex style --> obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj43.userData.pointlabels = ["11", "22", "45"]; obj43.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj43.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj43.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj43); scene.add(obj43); var obj44 = new THREE.Object3D(); obj44.name = "unnamed__45"; obj44.userData.explodable = 1; obj44.userData.points = []; obj44.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306)); obj44.userData.points.push(new PMPoint(-0.72449, -0.689286, 0.000156185)); obj44.userData.points.push(new PMPoint(-0.751656, -0.659556, 2.63146e-05)); obj44.userData.pointradii = 0.02; <!-- Vertex style --> obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj44.userData.pointlabels = ["11", "23", "46"]; obj44.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj44.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj44.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj44); scene.add(obj44); var obj45 = new THREE.Object3D(); obj45.name = "unnamed__46"; obj45.userData.explodable = 1; obj45.userData.points = []; obj45.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667)); obj45.userData.points.push(new PMPoint(-0.72449, -0.689286, 0.000156185)); obj45.userData.points.push(new PMPoint(-0.684211, -0.729285, 0.000103878)); obj45.userData.pointradii = 0.02; <!-- Vertex style --> obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj45.userData.pointlabels = ["0", "23", "47"]; obj45.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj45.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj45.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj45); scene.add(obj45); var obj46 = new THREE.Object3D(); obj46.name = "unnamed__47"; obj46.userData.explodable = 1; obj46.userData.points = []; obj46.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667)); obj46.userData.points.push(new PMPoint(-0.234694, -0.972069, 0.000156185)); obj46.userData.points.push(new PMPoint(-0.289474, -0.957186, 0.000103878)); obj46.userData.pointradii = 0.02; <!-- Vertex style --> obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj46.userData.pointlabels = ["0", "24", "48"]; obj46.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj46.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj46.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj46); scene.add(obj46); var obj47 = new THREE.Object3D(); obj47.name = "unnamed__48"; obj47.userData.explodable = 1; obj47.userData.points = []; obj47.userData.points.push(new PMPoint(-0.142857, -0.989743, 0.000765306)); obj47.userData.points.push(new PMPoint(-0.234694, -0.972069, 0.000156185)); obj47.userData.points.push(new PMPoint(-0.195364, -0.980731, 2.63146e-05)); obj47.userData.pointradii = 0.02; <!-- Vertex style --> obj47.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj47.userData.pointlabels = ["12", "24", "49"]; obj47.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj47.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj47.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj47.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj47); scene.add(obj47); var obj48 = new THREE.Object3D(); obj48.name = "unnamed__49"; obj48.userData.explodable = 1; obj48.userData.points = []; obj48.userData.points.push(new PMPoint(-0.142857, -0.989743, 0.000765306)); obj48.userData.points.push(new PMPoint(-0.0696203, -0.997574, 6.00865e-05)); obj48.userData.points.push(new PMPoint(-0.097015, -0.995283, 1.48511e-05)); obj48.userData.pointradii = 0.02; <!-- Vertex style --> obj48.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj48.userData.pointlabels = ["12", "25", "50"]; obj48.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj48.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj48.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj48.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj48); scene.add(obj48); var obj49 = new THREE.Object3D(); obj49.name = "unnamed__50"; obj49.userData.explodable = 1; obj49.userData.points = []; obj49.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503)); obj49.userData.points.push(new PMPoint(-0.0696203, -0.997574, 6.00865e-05)); obj49.userData.points.push(new PMPoint(-0.0384616, -0.99926, 1.54093e-05)); obj49.userData.pointradii = 0.02; <!-- Vertex style --> obj49.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj49.userData.pointlabels = ["6", "25", "51"]; obj49.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj49.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj49.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj49.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj49); scene.add(obj49); var obj50 = new THREE.Object3D(); obj50.name = "unnamed__51"; obj50.userData.explodable = 1; obj50.userData.points = []; obj50.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503)); obj50.userData.points.push(new PMPoint(0.142857, -0.989743, 5.31463e-05)); obj50.userData.points.push(new PMPoint(0.113497, -0.993538, 2.25827e-05)); obj50.userData.pointradii = 0.02; <!-- Vertex style --> obj50.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj50.userData.pointlabels = ["6", "26", "52"]; obj50.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj50.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj50.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj50.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj50); scene.add(obj50); var obj51 = new THREE.Object3D(); obj51.name = "unnamed__52"; obj51.userData.explodable = 1; obj51.userData.points = []; obj51.userData.points.push(new PMPoint(0.209677, -0.977771, 0.000390219)); obj51.userData.points.push(new PMPoint(0.142857, -0.989743, 5.31463e-05)); obj51.userData.points.push(new PMPoint(0.168203, -0.985752, 1.27418e-05)); obj51.userData.pointradii = 0.02; <!-- Vertex style --> obj51.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj51.userData.pointlabels = ["13", "26", "53"]; obj51.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj51.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj51.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj51.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj51); scene.add(obj51); var obj52 = new THREE.Object3D(); obj52.name = "unnamed__53"; obj52.userData.explodable = 1; obj52.userData.points = []; obj52.userData.points.push(new PMPoint(0.209677, -0.977771, 0.000390219)); obj52.userData.points.push(new PMPoint(0.289474, -0.957186, 0.000184672)); obj52.userData.points.push(new PMPoint(0.255814, -0.966726, 1.26758e-05)); obj52.userData.pointradii = 0.02; <!-- Vertex style --> obj52.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj52.userData.pointlabels = ["13", "27", "54"]; obj52.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj52.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj52.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj52.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj52); scene.add(obj52); var obj53 = new THREE.Object3D(); obj53.name = "unnamed__54"; obj53.userData.explodable = 1; obj53.userData.points = []; obj53.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375)); obj53.userData.points.push(new PMPoint(0.289474, -0.957186, 0.000184672)); obj53.userData.points.push(new PMPoint(0.335165, -0.94216, 4.52844e-05)); obj53.userData.pointradii = 0.02; <!-- Vertex style --> obj53.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj53.userData.pointlabels = ["3", "27", "55"]; obj53.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj53.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj53.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj53.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj53); scene.add(obj53); var obj54 = new THREE.Object3D(); obj54.name = "unnamed__55"; obj54.userData.explodable = 1; obj54.userData.points = []; obj54.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375)); obj54.userData.points.push(new PMPoint(0.709302, -0.704904, 0.0003245)); obj54.userData.points.push(new PMPoint(0.664384, -0.747392, 7.03697e-05)); obj54.userData.pointradii = 0.02; <!-- Vertex style --> obj54.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj54.userData.pointlabels = ["3", "28", "56"]; obj54.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj54.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj54.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj54.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj54); scene.add(obj54); var obj55 = new THREE.Object3D(); obj55.name = "unnamed__56"; obj55.userData.explodable = 1; obj55.userData.points = []; obj55.userData.points.push(new PMPoint(0.785714, -0.61859, 0.00085034)); obj55.userData.points.push(new PMPoint(0.709302, -0.704904, 0.0003245)); obj55.userData.points.push(new PMPoint(0.741935, -0.670471, 2.43887e-05)); obj55.userData.pointradii = 0.02; <!-- Vertex style --> obj55.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj55.userData.pointlabels = ["14", "28", "57"]; obj55.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj55.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj55.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj55.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj55); scene.add(obj55); var obj56 = new THREE.Object3D(); obj56.name = "unnamed__57"; obj56.userData.explodable = 1; obj56.userData.points = []; obj56.userData.points.push(new PMPoint(0.785714, -0.61859, 0.00085034)); obj56.userData.points.push(new PMPoint(0.846154, -0.532939, 0.000138683)); obj56.userData.points.push(new PMPoint(0.823741, -0.566966, 3.10543e-05)); obj56.userData.pointradii = 0.02; <!-- Vertex style --> obj56.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj56.userData.pointlabels = ["14", "29", "58"]; obj56.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj56.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj56.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj56.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj56); scene.add(obj56); var obj57 = new THREE.Object3D(); obj57.name = "unnamed__58"; obj57.userData.explodable = 1; obj57.userData.points = []; obj57.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449)); obj57.userData.points.push(new PMPoint(0.846154, -0.532939, 0.000138683)); obj57.userData.points.push(new PMPoint(0.871134, -0.491045, 6.37687e-05)); obj57.userData.pointradii = 0.02; <!-- Vertex style --> obj57.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj57.userData.pointlabels = ["7", "29", "59"]; obj57.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj57.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj57.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj57.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj57); scene.add(obj57); var obj58 = new THREE.Object3D(); obj58.name = "unnamed__59"; obj58.userData.explodable = 1; obj58.userData.points = []; obj58.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449)); obj58.userData.points.push(new PMPoint(0.986486, -0.163843, 0.000273923)); obj58.userData.points.push(new PMPoint(0.973684, -0.227901, 6.49238e-05)); obj58.userData.pointradii = 0.02; <!-- Vertex style --> obj58.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj58.userData.pointlabels = ["7", "30", "60"]; obj58.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj58.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj58.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj58.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj58); scene.add(obj58); var obj59 = new THREE.Object3D(); obj59.name = "unnamed__60"; obj59.userData.explodable = 1; obj59.userData.points = []; obj59.userData.points.push(new PMPoint(1, 0, 0.00416667)); obj59.userData.points.push(new PMPoint(0.986486, -0.163843, 0.000273923)); obj59.userData.points.push(new PMPoint(0.994505, -0.104684, 7.2455e-05)); obj59.userData.pointradii = 0.02; <!-- Vertex style --> obj59.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj59.userData.pointlabels = ["15", "30", "61"]; obj59.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj59.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj59.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj59.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj59); scene.add(obj59); var obj60 = new THREE.Object3D(); obj60.name = "unnamed__61"; obj60.userData.explodable = 1; obj60.userData.points = []; obj60.userData.points.push(new PMPoint(1, 0, 0.00416667)); obj60.userData.points.push(new PMPoint(0.973684, 0.227901, 0.00103878)); obj60.userData.points.push(new PMPoint(0.991803, 0.127774, 0.000161247)); obj60.userData.pointradii = 0.02; <!-- Vertex style --> obj60.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj60.userData.pointlabels = ["15", "31", "62"]; obj60.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj60.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj60.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj60.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj60); scene.add(obj60); var obj61 = new THREE.Object3D(); obj61.name = "unnamed__62"; obj61.userData.explodable = 1; obj61.userData.points = []; obj61.userData.points.push(new PMPoint(0.5, 0.866025, 0.6)); obj61.userData.points.push(new PMPoint(0.973684, 0.227901, 0.00103878)); obj61.userData.points.push(new PMPoint(0.928571, 0.371154, 0.000765306)); obj61.userData.pointradii = 0.02; <!-- Vertex style --> obj61.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj61.userData.pointlabels = ["1", "31", "63"]; obj61.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj61.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj61.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj61.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj61); scene.add(obj61); var obj62 = new THREE.Object3D(); obj62.name = "unnamed__63"; obj62.userData.explodable = 1; obj62.userData.points = []; obj62.userData.points.push(new PMPoint(0.5, 0.866025, 0.6)); obj62.userData.points.push(new PMPoint(-0.142857, 0.989743, 0.000765306)); obj62.userData.points.push(new PMPoint(-0.0384616, 0.99926, 0.000394477)); obj62.userData.pointradii = 0.02; <!-- Vertex style --> obj62.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj62.userData.pointlabels = ["1", "32", "64"]; obj62.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj62.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj62.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj62.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj62); scene.add(obj62); var obj63 = new THREE.Object3D(); obj63.name = "unnamed__64"; obj63.userData.explodable = 1; obj63.userData.points = []; obj63.userData.points.push(new PMPoint(-0.289474, 0.957186, 0.00103878)); obj63.userData.points.push(new PMPoint(-0.142857, 0.989743, 0.000765306)); obj63.userData.points.push(new PMPoint(-0.209677, 0.977771, 6.93722e-05)); obj63.userData.pointradii = 0.02; <!-- Vertex style --> obj63.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj63.userData.pointlabels = ["16", "32", "65"]; obj63.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj63.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj63.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj63.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj63); scene.add(obj63); var obj64 = new THREE.Object3D(); obj64.name = "unnamed__65"; obj64.userData.explodable = 1; obj64.userData.points = []; obj64.userData.points.push(new PMPoint(-0.289474, 0.957186, 0.00103878)); obj64.userData.points.push(new PMPoint(-0.385246, 0.922814, 0.000161247)); obj64.userData.points.push(new PMPoint(-0.351351, 0.936244, 2.73923e-05)); obj64.userData.pointradii = 0.02; <!-- Vertex style --> obj64.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj64.userData.pointlabels = ["16", "33", "66"]; obj64.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj64.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj64.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj64.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj64); scene.add(obj64); var obj65 = new THREE.Object3D(); obj65.name = "unnamed__66"; obj65.userData.explodable = 1; obj65.userData.points = []; obj65.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667)); obj65.userData.points.push(new PMPoint(-0.385246, 0.922814, 0.000161247)); obj65.userData.points.push(new PMPoint(-0.42126, 0.90694, 2.325e-05)); obj65.userData.pointradii = 0.02; <!-- Vertex style --> obj65.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj65.userData.pointlabels = ["8", "33", "67"]; obj65.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj65.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj65.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj65.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj65); scene.add(obj65); var obj66 = new THREE.Object3D(); obj66.name = "unnamed__67"; obj66.userData.explodable = 1; obj66.userData.points = []; obj66.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667)); obj66.userData.points.push(new PMPoint(-0.587912, 0.808925, 7.2455e-05)); obj66.userData.points.push(new PMPoint(-0.565089, 0.82503, 1.31298e-05)); obj66.userData.pointradii = 0.02; <!-- Vertex style --> obj66.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj66.userData.pointlabels = ["8", "34", "68"]; obj66.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj66.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj66.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj66.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj66); scene.add(obj66); var obj67 = new THREE.Object3D(); obj67.name = "unnamed__68"; obj67.userData.explodable = 1; obj67.userData.points = []; obj67.userData.points.push(new PMPoint(-0.635135, 0.772401, 0.000273923)); obj67.userData.points.push(new PMPoint(-0.587912, 0.808925, 7.2455e-05)); obj67.userData.points.push(new PMPoint(-0.606557, 0.79504, 0)); obj67.userData.pointradii = 0.02; <!-- Vertex style --> obj67.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj67.userData.pointlabels = ["17", "34", "69"]; obj67.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj67.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj67.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj67.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj67); scene.add(obj67); var obj68 = new THREE.Object3D(); obj68.name = "unnamed__69"; obj68.userData.explodable = 1; obj68.userData.points = []; obj68.userData.points.push(new PMPoint(-0.635135, 0.772401, 0.000273923)); obj68.userData.points.push(new PMPoint(-0.684211, 0.729285, 6.49238e-05)); obj68.userData.points.push(new PMPoint(-0.664384, 0.747392, 1.25102e-05)); obj68.userData.pointradii = 0.02; <!-- Vertex style --> obj68.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj68.userData.pointlabels = ["17", "35", "70"]; obj68.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj68.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj68.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj68.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj68); scene.add(obj68); var obj69 = new THREE.Object3D(); obj69.name = "unnamed__70"; obj69.userData.explodable = 1; obj69.userData.points = []; obj69.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449)); obj69.userData.points.push(new PMPoint(-0.684211, 0.729285, 6.49238e-05)); obj69.userData.points.push(new PMPoint(-0.709302, 0.704904, 3.60555e-05)); obj69.userData.pointradii = 0.02; <!-- Vertex style --> obj69.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj69.userData.pointlabels = ["4", "35", "71"]; obj69.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj69.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj69.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj69.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj69); scene.add(obj69); var obj70 = new THREE.Object3D(); obj70.name = "unnamed__71"; obj70.userData.explodable = 1; obj70.userData.points = []; obj70.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449)); obj70.userData.points.push(new PMPoint(-0.860825, 0.508902, 6.37687e-05)); obj70.userData.points.push(new PMPoint(-0.846154, 0.532939, 1.54093e-05)); obj70.userData.pointradii = 0.02; <!-- Vertex style --> obj70.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj70.userData.pointlabels = ["4", "36", "72"]; obj70.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj70.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj70.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj70.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj70); scene.add(obj70); var obj71 = new THREE.Object3D(); obj71.name = "unnamed__72"; obj71.userData.explodable = 1; obj71.userData.points = []; obj71.userData.points.push(new PMPoint(-0.884615, 0.466321, 0.000138683)); obj71.userData.points.push(new PMPoint(-0.860825, 0.508902, 6.37687e-05)); obj71.userData.points.push(new PMPoint(-0.871134, 0.491045, 0)); obj71.userData.pointradii = 0.02; <!-- Vertex style --> obj71.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj71.userData.pointlabels = ["18", "36", "73"]; obj71.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj71.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj71.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj71.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj71); scene.add(obj71); var obj72 = new THREE.Object3D(); obj72.name = "unnamed__73"; obj72.userData.explodable = 1; obj72.userData.points = []; obj72.userData.points.push(new PMPoint(-0.884615, 0.466321, 0.000138683)); obj72.userData.points.push(new PMPoint(-0.902878, 0.429897, 3.10543e-05)); obj72.userData.points.push(new PMPoint(-0.896122, 0.443808, 0)); obj72.userData.pointradii = 0.02; <!-- Vertex style --> obj72.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj72.userData.pointlabels = ["18", "37", "74"]; obj72.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj72.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj72.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj72.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj72); scene.add(obj72); var obj73 = new THREE.Object3D(); obj73.name = "unnamed__74"; obj73.userData.explodable = 1; obj73.userData.points = []; obj73.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034)); obj73.userData.points.push(new PMPoint(-0.902878, 0.429897, 3.10543e-05)); obj73.userData.points.push(new PMPoint(-0.910448, 0.413624, 0)); obj73.userData.pointradii = 0.02; <!-- Vertex style --> obj73.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj73.userData.pointlabels = ["9", "37", "75"]; obj73.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj73.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj73.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj73.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj73); scene.add(obj73); var obj74 = new THREE.Object3D(); obj74.name = "unnamed__75"; obj74.userData.explodable = 1; obj74.userData.points = []; obj74.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034)); obj74.userData.points.push(new PMPoint(-0.951613, 0.307299, 2.43887e-05)); obj74.userData.points.push(new PMPoint(-0.945344, 0.326074, 0)); obj74.userData.pointradii = 0.02; <!-- Vertex style --> obj74.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj74.userData.pointlabels = ["9", "38", "76"]; obj74.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj74.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj74.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj74.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj74); scene.add(obj74); var obj75 = new THREE.Object3D(); obj75.name = "unnamed__76"; obj75.userData.explodable = 1; obj75.userData.points = []; obj75.userData.points.push(new PMPoint(-0.965116, 0.261822, 0.0003245)); obj75.userData.points.push(new PMPoint(-0.951613, 0.307299, 2.43887e-05)); obj75.userData.points.push(new PMPoint(-0.956869, 0.29052, 0)); obj75.userData.pointradii = 0.02; <!-- Vertex style --> obj75.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj75.userData.pointlabels = ["19", "38", "77"]; obj75.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj75.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj75.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj75.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj75); scene.add(obj75); var obj76 = new THREE.Object3D(); obj76.name = "unnamed__77"; obj76.userData.explodable = 1; obj76.userData.points = []; obj76.userData.points.push(new PMPoint(-0.965116, 0.261822, 0.0003245)); obj76.userData.points.push(new PMPoint(-0.979452, 0.201677, 7.03697e-05)); obj76.userData.points.push(new PMPoint(-0.973684, 0.227901, 1.1542e-05)); obj76.userData.pointradii = 0.02; <!-- Vertex style --> obj76.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj76.userData.pointlabels = ["19", "39", "78"]; obj76.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj76.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj76.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj76.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj76); scene.add(obj76); var obj77 = new THREE.Object3D(); obj77.name = "unnamed__78"; obj77.userData.explodable = 1; obj77.userData.points = []; obj77.userData.points.push(new PMPoint(-1, 0, 0.0375)); obj77.userData.points.push(new PMPoint(-0.979452, 0.201677, 7.03697e-05)); obj77.userData.points.push(new PMPoint(-0.986486, 0.163843, 3.04358e-05)); obj77.userData.pointradii = 0.02; <!-- Vertex style --> obj77.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj77.userData.pointlabels = ["2", "39", "79"]; obj77.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj77.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj77.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj77.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj77); scene.add(obj77); var obj78 = new THREE.Object3D(); obj78.name = "unnamed__79"; obj78.userData.explodable = 1; obj78.userData.points = []; obj78.userData.points.push(new PMPoint(-1, 0, 0.0375)); obj78.userData.points.push(new PMPoint(-0.983516, -0.180818, 4.52844e-05)); obj78.userData.points.push(new PMPoint(-0.988722, -0.149764, 2.11996e-05)); obj78.userData.pointradii = 0.02; <!-- Vertex style --> obj78.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj78.userData.pointlabels = ["2", "40", "80"]; obj78.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj78.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj78.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj78.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj78); scene.add(obj78); var obj79 = new THREE.Object3D(); obj79.name = "unnamed__80"; obj79.userData.explodable = 1; obj79.userData.points = []; obj79.userData.points.push(new PMPoint(-0.973684, -0.227901, 0.000184672)); obj79.userData.points.push(new PMPoint(-0.983516, -0.180818, 4.52844e-05)); obj79.userData.points.push(new PMPoint(-0.979452, -0.201677, 0)); obj79.userData.pointradii = 0.02; <!-- Vertex style --> obj79.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj79.userData.pointlabels = ["20", "40", "81"]; obj79.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj79.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj79.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj79.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj79); scene.add(obj79); var obj80 = new THREE.Object3D(); obj80.name = "unnamed__81"; obj80.userData.explodable = 1; obj80.userData.points = []; obj80.userData.points.push(new PMPoint(-0.973684, -0.227901, 0.000184672)); obj80.userData.points.push(new PMPoint(-0.965116, -0.261822, 1.26758e-05)); obj80.userData.points.push(new PMPoint(-0.968384, -0.249464, 0)); obj80.userData.pointradii = 0.02; <!-- Vertex style --> obj80.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj80.userData.pointlabels = ["20", "41", "82"]; obj80.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj80.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj80.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj80.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj80); scene.add(obj80); var obj81 = new THREE.Object3D(); obj81.name = "unnamed__82"; obj81.userData.explodable = 1; obj81.userData.points = []; obj81.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218)); obj81.userData.points.push(new PMPoint(-0.965116, -0.261822, 1.26758e-05)); obj81.userData.points.push(new PMPoint(-0.961318, -0.275441, 0)); obj81.userData.pointradii = 0.02; <!-- Vertex style --> obj81.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj81.userData.pointlabels = ["10", "41", "83"]; obj81.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj81.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj81.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj81.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj81); scene.add(obj81); var obj82 = new THREE.Object3D(); obj82.name = "unnamed__83"; obj82.userData.explodable = 1; obj82.userData.points = []; obj82.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218)); obj82.userData.points.push(new PMPoint(-0.937788, -0.347208, 1.27418e-05)); obj82.userData.points.push(new PMPoint(-0.941748, -0.336321, 0)); obj82.userData.pointradii = 0.02; <!-- Vertex style --> obj82.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj82.userData.pointlabels = ["10", "42", "84"]; obj82.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj82.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj82.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj82.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj82); scene.add(obj82); var obj83 = new THREE.Object3D(); obj83.name = "unnamed__84"; obj83.userData.explodable = 1; obj83.userData.points = []; obj83.userData.points.push(new PMPoint(-0.928571, -0.371154, 5.31463e-05)); obj83.userData.points.push(new PMPoint(-0.937788, -0.347208, 1.27418e-05)); obj83.userData.points.push(new PMPoint(-0.934326, -0.35642, 0)); obj83.userData.pointradii = 0.02; <!-- Vertex style --> obj83.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj83.userData.pointlabels = ["21", "42", "85"]; obj83.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj83.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj83.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj83.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj83); scene.add(obj83); var obj84 = new THREE.Object3D(); obj84.name = "unnamed__85"; obj84.userData.explodable = 1; obj84.userData.points = []; obj84.userData.points.push(new PMPoint(-0.928571, -0.371154, 5.31463e-05)); obj84.userData.points.push(new PMPoint(-0.917178, -0.398478, 2.25827e-05)); obj84.userData.points.push(new PMPoint(-0.922037, -0.387101, 0)); obj84.userData.pointradii = 0.02; <!-- Vertex style --> obj84.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj84.userData.pointlabels = ["21", "43", "86"]; obj84.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj84.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj84.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj84.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj84); scene.add(obj84); var obj85 = new THREE.Object3D(); obj85.name = "unnamed__86"; obj85.userData.explodable = 1; obj85.userData.points = []; obj85.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503)); obj85.userData.points.push(new PMPoint(-0.917178, -0.398478, 2.25827e-05)); obj85.userData.points.push(new PMPoint(-0.910448, -0.413624, 0)); obj85.userData.pointradii = 0.02; <!-- Vertex style --> obj85.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj85.userData.pointlabels = ["5", "43", "87"]; obj85.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj85.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj85.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj85.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj85); scene.add(obj85); var obj86 = new THREE.Object3D(); obj86.name = "unnamed__87"; obj86.userData.explodable = 1; obj86.userData.points = []; obj86.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503)); obj86.userData.points.push(new PMPoint(-0.846154, -0.532939, 1.54093e-05)); obj86.userData.points.push(new PMPoint(-0.855212, -0.518278, 0)); obj86.userData.pointradii = 0.02; <!-- Vertex style --> obj86.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj86.userData.pointlabels = ["5", "44", "88"]; obj86.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj86.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj86.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj86.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj86); scene.add(obj86); var obj87 = new THREE.Object3D(); obj87.name = "unnamed__88"; obj87.userData.explodable = 1; obj87.userData.points = []; obj87.userData.points.push(new PMPoint(-0.829114, -0.55908, 6.00865e-05)); obj87.userData.points.push(new PMPoint(-0.846154, -0.532939, 1.54093e-05)); obj87.userData.points.push(new PMPoint(-0.839169, -0.543872, 0)); obj87.userData.pointradii = 0.02; <!-- Vertex style --> obj87.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj87.userData.pointlabels = ["22", "44", "89"]; obj87.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj87.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj87.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj87.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj87); scene.add(obj87); var obj88 = new THREE.Object3D(); obj88.name = "unnamed__89"; obj88.userData.explodable = 1; obj88.userData.points = []; obj88.userData.points.push(new PMPoint(-0.829114, -0.55908, 6.00865e-05)); obj88.userData.points.push(new PMPoint(-0.813433, -0.581659, 1.48511e-05)); obj88.userData.points.push(new PMPoint(-0.819549, -0.573009, 0)); obj88.userData.pointradii = 0.02; <!-- Vertex style --> obj88.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj88.userData.pointlabels = ["22", "45", "90"]; obj88.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj88.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj88.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj88.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj88); scene.add(obj88); var obj89 = new THREE.Object3D(); obj89.name = "unnamed__90"; obj89.userData.explodable = 1; obj89.userData.points = []; obj89.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306)); obj89.userData.points.push(new PMPoint(-0.813433, -0.581659, 1.48511e-05)); obj89.userData.points.push(new PMPoint(-0.806069, -0.591822, 0)); obj89.userData.pointradii = 0.02; <!-- Vertex style --> obj89.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj89.userData.pointlabels = ["11", "45", "91"]; obj89.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj89.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj89.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj89.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj89); scene.add(obj89); var obj90 = new THREE.Object3D(); obj90.name = "unnamed__91"; obj90.userData.explodable = 1; obj90.userData.points = []; obj90.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306)); obj90.userData.points.push(new PMPoint(-0.751656, -0.659556, 2.63146e-05)); obj90.userData.points.push(new PMPoint(-0.762136, -0.647417, 0)); obj90.userData.pointradii = 0.02; <!-- Vertex style --> obj90.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj90.userData.pointlabels = ["11", "46", "92"]; obj90.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj90.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj90.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj90.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj90); scene.add(obj90); var obj91 = new THREE.Object3D(); obj91.name = "unnamed__92"; obj91.userData.explodable = 1; obj91.userData.points = []; obj91.userData.points.push(new PMPoint(-0.72449, -0.689286, 0.000156185)); obj91.userData.points.push(new PMPoint(-0.751656, -0.659556, 2.63146e-05)); obj91.userData.points.push(new PMPoint(-0.741936, -0.670471, 0)); obj91.userData.pointradii = 0.02; <!-- Vertex style --> obj91.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj91.userData.pointlabels = ["23", "46", "93"]; obj91.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj91.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj91.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj91.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj91); scene.add(obj91); var obj92 = new THREE.Object3D(); obj92.name = "unnamed__93"; obj92.userData.explodable = 1; obj92.userData.points = []; obj92.userData.points.push(new PMPoint(-0.72449, -0.689286, 0.000156185)); obj92.userData.points.push(new PMPoint(-0.684211, -0.729285, 0.000103878)); obj92.userData.points.push(new PMPoint(-0.702429, -0.711754, 0)); obj92.userData.pointradii = 0.02; <!-- Vertex style --> obj92.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj92.userData.pointlabels = ["23", "47", "94"]; obj92.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj92.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj92.userData.facets = [[1, 0, 2]]; <!-- Facet style --> obj92.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj92); scene.add(obj92); var obj93 = new THREE.Object3D(); obj93.name = "unnamed__94"; obj93.userData.explodable = 1; obj93.userData.points = []; obj93.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667)); obj93.userData.points.push(new PMPoint(-0.684211, -0.729285, 0.000103878)); obj93.userData.points.push(new PMPoint(-0.655963, -0.754793, 5.05008e-05)); obj93.userData.pointradii = 0.02; <!-- Vertex style --> obj93.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj93.userData.pointlabels = ["0", "47", "95"]; obj93.userData.edgeindices = [0, 1, 0, 2, 1, 2]; <!-- Edge style --> obj93.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj93.userData.facets = [[0, 1, 2]]; <!-- Facet style --> obj93.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj93); scene.add(obj93); // COMMON_CODE_BLOCK_BEGIN function textSpriteMaterial(message, parameters) { if ( parameters === undefined ) parameters = {}; var fontface = "Helvetica"; var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15; fontsize = fontsize*10; var lines = message.split('\\n'); var size = 512; for(var i = 0; i<lines.length; i++){ var tmp = lines[i].length; while(tmp*fontsize > size){ fontsize--; } } var canvas = document.createElement('canvas'); canvas.width = size; canvas.height = size; var context = canvas.getContext('2d'); context.fillStyle = "rgba(255, 255, 255, 0)"; context.fill(); context.font = fontsize + "px " + fontface; // text color context.fillStyle = "rgba(0, 0, 0, 1.0)"; for(var i = 0; i<lines.length; i++){ context.fillText(lines[i], size/2, size/2+i*fontsize); } // canvas contents will be used for a texture var texture = new THREE.Texture(canvas); texture.needsUpdate = true; var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 }); return spriteMaterial; } // ---------------------- INITIALIZING OBJECTS-------------------------------------- // --------------------------------------------------------------------------------- function init_object(obj) { if (obj.userData.hasOwnProperty("pointmaterial")) { init_points(obj); modelContains.points = true; } if (obj.userData.hasOwnProperty("pointlabels")) { init_pointlabels(obj); modelContains.pointlabels = true; } if (obj.userData.hasOwnProperty("edgematerial")) { init_lines(obj); modelContains.lines = true; } if (obj.userData.hasOwnProperty("edgelabels")) { init_edgelabels(obj); modelContains.edgelabels = true; } if (obj.userData.hasOwnProperty("arrowstyle")) { init_arrowheads(obj); modelContains.arrowheads = true; } if (obj.userData.hasOwnProperty("facetmaterial")) { init_faces(obj); modelContains.faces = true; } } function init_points(obj) { var pointgroup = new THREE.Group(); pointgroup.name = "points"; var points = obj.userData.points; var radii = obj.userData.pointradii; var materials = obj.userData.pointmaterial; var geometry,material; if (!Array.isArray(radii)) { geometry = new THREE.SphereBufferGeometry(radii); } if (!Array.isArray(materials)) { material = materials; } for (var i=0; i<points.length; i++) { var point = points[i]; if (Array.isArray(radii)) { if (radii[i] == 0) { continue; } geometry = new THREE.SphereBufferGeometry(radii[i]); } if (Array.isArray(materials)) { material = materials[i]; } var sphere = new THREE.Mesh(geometry, material); point.addSphere(sphere); pointgroup.add(sphere); } obj.add(pointgroup); } function init_pointlabels(obj) { var points = obj.userData.points; var labels = obj.userData.pointlabels; var pointlabels = new THREE.Group(); pointlabels.name = "pointlabels"; if (Array.isArray(labels)) { for (var i=0; i<points.length; i++) { var point = points[i]; var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<points.length; i++) { var point = points[i]; var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } obj.add(pointlabels); } function init_lines(obj) { var edgeindices = obj.userData.edgeindices; var points = obj.userData.points; var materials = obj.userData.edgematerial; var geometry = new THREE.BufferGeometry(); var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 ); var geometry = new THREE.BufferGeometry(); geometry.setAttribute('position', bufattr); if (Array.isArray(materials)) { for (var i=0; i<materials.length; i++) { geometry.addGroup(2*i,2,i); } } var lines = new THREE.LineSegments(geometry, materials); lines.name = "lines"; obj.add(lines); updateEdgesPosition(obj); } function init_edgelabels(obj) { var points = obj.userData.points; var edgeindices = obj.userData.edgeindices; var labels = obj.userData.edgelabels; var edgelabels = new THREE.Group(); edgelabels.name = "edgelabels"; if (Array.isArray(labels)) { for (var i=0; i<edgeindices.length/2; i++) { var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<edgeindices.length/2; i++) { var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } obj.add(edgelabels); } function init_arrowheads(obj) { var arrowheads = new THREE.Group(); arrowheads.name = "arrowheads"; var arrowstyle = obj.userData.arrowstyle; var edgeindices = obj.userData.edgeindices; var edgematerials = obj.userData.edgematerial; var points = obj.userData.points; var material; if (!Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials.color} ); } for (var i=0; i<edgeindices.length; i=i+2) { var start = points[edgeindices[i]]; var end = points[edgeindices[i+1]]; var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius(); if (dist <= 0) { continue; } var dir = new THREE.Vector3().subVectors(end.vector,start.vector); dir.normalize(); var axis = new THREE.Vector3().set(dir.z,0,-dir.x); axis.normalize(); var radians = Math.acos( dir.y ); var radius = dist/25; var height = dist/5; var geometry = new THREE.ConeBufferGeometry(radius,height); var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2)); if (Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} ); } var cone = new THREE.Mesh( geometry, material ); cone.quaternion.setFromAxisAngle(axis,radians);; cone.position.copy(position);; arrowheads.add(cone); } obj.add(arrowheads); } function init_faces(obj) { var points = obj.userData.points; var facets = obj.userData.facets; obj.userData.triangleindices = []; for (var i=0; i<facets.length; i++) { facet = facets[i]; for (var t=0; t<facet.length-2; t++) { obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]); } } var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute(bufarr,3); var materials = obj.userData.facetmaterial; var geometry = new THREE.BufferGeometry(); var frontmaterials = []; var backmaterials = []; geometry.setAttribute('position',bufattr); if (Array.isArray(materials)) { var tricount = 0; var facet; for (var i=0; i<facets.length; i++) { facet = facets[i]; geometry.addGroup(tricount,(facet.length-2)*3,i); tricount += (facet.length-2)*3; } for (var j=0; j<materials.length; j++) { var fmat = materials[j].clone() fmat.side = THREE.FrontSide; frontmaterials.push(fmat); var bmat = materials[j].clone() bmat.side = THREE.BackSide; backmaterials.push(bmat); obj.userData.facetmaterial = frontmaterials.concat(backmaterials); } } else if (materials instanceof THREE.Material) { frontmaterials = materials.clone() frontmaterials.side = THREE.FrontSide; backmaterials = materials.clone() backmaterials.side = THREE.BackSide; obj.userData.facetmaterial = [frontmaterials, backmaterials]; } // duplicating the object with front and back should avoid transparency issues var backmesh = new THREE.Mesh(geometry, backmaterials); // meshname is used to show/hide objects backmesh.name = "backfaces"; obj.add(backmesh); var frontmesh = new THREE.Mesh(geometry, frontmaterials); frontmesh.name = "frontfaces"; obj.add(frontmesh); updateFacesPosition(obj); } // //INITIALIZING function updateFacesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.triangleindices; var faces = obj.getObjectByName("frontfaces"); var ba = faces.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } faces.geometry.attributes.position.needsUpdate = true; } function updateEdgesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.edgeindices; var lines = obj.getObjectByName("lines"); var ba = lines.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } lines.geometry.attributes.position.needsUpdate = true; } function onWindowResize() { renderer.setSize( three.clientWidth, three.clientHeight ); svgRenderer.setSize( three.clientWidth, three.clientHeight ); updateCamera(); } function updateCamera() { var width = three.clientWidth; var height = three.clientHeight; var aspect = width / height; if (camera.type == "OrthographicCamera") { camera.left = frustumSize * aspect / - 2; camera.right = frustumSize * aspect / 2; camera.top = frustumSize / 2; camera.bottom = - frustumSize / 2; } else if (camera.type == "PerspectiveCamera") { camera.aspect = aspect; } camera.updateProjectionMatrix(); } function changeCamera(event) { var selindex = event.currentTarget.selectedIndex; camera = cameras[selindex]; control = controls[selindex]; control.enabled = true; for (var i=0; i<controls.length; i++) { if (i!=selindex) { controls[i].enabled = false; } } updateCamera(); } var camtypenode = document.getElementById('cameraType_8'); camtypenode.onchange = changeCamera; camtypenode.dispatchEvent(new Event('change')); onWindowResize(); window.addEventListener('resize', onWindowResize); var xRotationEnabled = false; var yRotationEnabled = false; var zRotationEnabled = false; var rotationSpeedFactor = 1; var settingsShown = false; var labelsShown = true; var intervals = []; var timeouts = []; var explodingSpeed = 0.05; var explodeScale = 0.000001; var XMLS = new XMLSerializer(); var svgElement; var renderId; var render = function () { renderId = requestAnimationFrame(render); // comment in for automatic explosion // explode(updateFactor()); var phi = 0.02 * rotationSpeedFactor; if (xRotationEnabled) { scene.rotation.x += phi; } if (yRotationEnabled) { scene.rotation.y += phi; } if (zRotationEnabled) { scene.rotation.z += phi; } control.update(); renderer.render(scene, camera); }; if ( THREE.WEBGL.isWebGLAvailable() ) { render(); } else { var warning = WEBGL.getWebGLErrorMessage(); three.appendChild( warning ); } function changeTransparency() { var opacity = 1-Number(event.currentTarget.value); for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].opacity = opacity; } } else { child.userData.facetmaterial.opacity = opacity; } } } } function toggleDepthWrite(event) { depthwrite = event.currentTarget.checked; for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].depthWrite = depthwrite; } } else { child.userData.facetmaterial.depthWrite = depthWrite; } } } } function changeRotationX(event){ xRotationEnabled = event.currentTarget.checked; } function changeRotationY(event){ yRotationEnabled = event.currentTarget.checked; } function changeRotationZ(event){ zRotationEnabled = event.currentTarget.checked; } function changeRotationSpeedFactor(event){ rotationSpeedFactor = Number(event.currentTarget.value); } function resetScene(){ scene.rotation.set(0,0,0); camera.position.set(0,0,5); camera.up.set(0,1,0); } function showSettings(event){ document.getElementById('settings_8').style.visibility = 'visible'; document.getElementById('showSettingsButton_8').style.visibility = 'hidden'; document.getElementById('hideSettingsButton_8').style.visibility = 'visible'; settingsShown = true; } function hideSettings(event){ document.getElementById('settings_8').style.visibility = 'hidden'; document.getElementById('showSettingsButton_8').style.visibility = 'visible'; document.getElementById('hideSettingsButton_8').style.visibility = 'hidden'; settingsShown = false; } var pos = 150* Math.PI; function updateFactor() { pos++; return Math.sin(.01*pos)+1; } // ------------------------ FOLDING ------------------------------------------------ // --------------------------------------------------------------------------------- // rotate point p around axis defined by points p1 and p2 by given angle function rotate(p, p1, p2, angle ){ angle = -angle; var x = p.x, y = p.y, z = p.z, a = p1.x, b = p1.y, c = p1.z, u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z; var result = []; var L = u*u + v*v + w*w; var sqrt = Math.sqrt; var cos = Math.cos; var sin = Math.sin; result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L; result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L; result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L; return result; } var fold = function(event){ var obj = foldables[Number(event.currentTarget.name)]; var foldvalue = Number(event.currentTarget.value); var scale = foldvalue - obj.userData.oldscale; for (var j=0; j<obj.userData.axes.length; j++) { rotateVertices(obj, j, scale); } update(obj); obj.userData.oldscale += scale; lookAtBarycenter(obj); } function lookAtBarycenter(obj){ control.target = barycenter(obj); } function barycenter(obj) { var center = new THREE.Vector3(0,0,0); var points = obj.userData.points; for (var i=0; i<points.length; i++){ center.add(points[i].vector); } center.divideScalar(points.length); return center; } function rotateVertices(obj, edge, scale) { var axes = obj.userData.axes; var subtrees = obj.userData.subtrees; var points = obj.userData.points; var angles = obj.userData.angles; if (edge < axes.length){ for (var j=0; j<subtrees[edge].length; j++){ var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge])); points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]); } } } function update(obj) { updateFacesPosition(obj); updateEdgesPosition(obj); } if (foldables.length) { var settings = document.getElementById('settings_8'); var foldDiv = document.createElement('div'); foldDiv.id = 'fold_8'; var title = document.createElement('strong'); title.innerHTML = 'Fold'; foldDiv.appendChild(title); foldDiv.className = 'group'; for (var i=0; i<foldables.length; i++) { var range = document.createElement('input'); range.type = 'range'; range.min = 0; range.max = 1; range.value = 0; range.step = 0.001; range.name = String(i); range.oninput = fold; foldDiv.appendChild(range); } lookAtBarycenter(foldables[0]); settings.insertBefore(foldDiv,settings.childNodes[0]); } // ---------------------- EXPLOSION ------------------------------------------------ // --------------------------------------------------------------------------------- if (explodableModel) { for (var i=0; i<scene.children.length; i++) { obj = scene.children[i]; if ( obj.userData.explodable ) { computeCentroid(obj); } } document.getElementById('explodeRange_8').oninput = triggerExplode; document.getElementById('explodeCheckbox_8').onchange = triggerAutomaticExplode; document.getElementById('explodingSpeedRange_8').oninput = setExplodingSpeed; explode(0.000001); } function computeCentroid(obj) { centroid = new THREE.Vector3(); obj.userData.points.forEach(function(pmpoint) { centroid.add(pmpoint.vector); }); centroid.divideScalar(obj.userData.points.length); obj.userData.centroid = centroid; } function explode(factor) { for (var i=0; i<scene.children.length; i++) { var obj = scene.children[i]; if (obj.userData.hasOwnProperty("centroid")) { var c = obj.userData.centroid; obj.position.set(c.x*factor, c.y*factor, c.z*factor); } } } function triggerExplode(event){ explodeScale = Number(event.currentTarget.value); explode(explodeScale); } function setExplodingSpeed(event){ explodingSpeed = Number(event.currentTarget.value); } function triggerAutomaticExplode(event){ if (event.currentTarget.checked){ startExploding(); } else { clearIntervals(); } } function startExploding(){ intervals.push(setInterval(explodingInterval, 25)); } function explodingInterval(){ explodeScale += explodingSpeed; if (explodeScale <= 6){ explode(explodeScale); } else{ explode(6); explodeScale = 6; clearIntervals(); timeouts.push(setTimeout(startUnexploding, 3000)); } document.getElementById('explodeRange_8').value = explodeScale; } function startUnexploding(){ intervals.push(setInterval(unexplodingInterval, 25)); } function unexplodingInterval(){ explodeScale -= explodingSpeed; if (explodeScale >= 0){ explode(explodeScale); } else { explode(0); explodeScale = 0; clearIntervals(); timeouts.push(setTimeout(startExploding, 3000)); } document.getElementById('explodeRange_8').value = explodeScale; } function clearIntervals(){ intervals.forEach(function(interval){ clearInterval(interval); }); intervals = []; timeouts.forEach(function(timeout){ clearTimeout(timeout); }); timeouts = []; } // ---------------------- DISPLAY -------------------------------------------------- // --------------------------------------------------------------------------------- const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" }; const objectTypeVisible = {}; Object.assign(objectTypeVisible,modelContains); const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort(); const shownObjectTypesList = document.getElementById('shownObjectTypesList_8'); function setVisibility(bool,objname) { for (var i=0; i<scene.children.length; i++){ var obj = scene.children[i].getObjectByName(objname); if (obj) { obj.visible = bool; } } } function toggleObjectTypeVisibility(event){ var name = event.currentTarget.name; var checked = event.currentTarget.checked; objectTypeVisible[name] = checked; if (name == "faces") { setVisibility(checked,"frontfaces"); setVisibility(checked,"backfaces"); } else { setVisibility(checked,name); } } for (var i=0; i<sortedObjectTypeKeys.length; i++){ var key = sortedObjectTypeKeys[i]; if (modelContains[key]) { var objTypeNode = document.createElement('span'); objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = key; checkbox.onchange = toggleObjectTypeVisibility; shownObjectTypesList.appendChild(checkbox); shownObjectTypesList.appendChild(objTypeNode); } } // ------------------------------------------------------ function toggleObjectVisibility(event){ var nr = Number(event.currentTarget.name); scene.children[nr].visible = event.currentTarget.checked; } // append checkboxes for displaying or hiding objects var shownObjectsList = document.getElementById('shownObjectsList_8'); for (var i=0; i<scene.children.length; i++){ obj = scene.children[i]; var objNode = document.createElement('span'); objNode.innerHTML = obj.name + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = String(i); checkbox.onchange = toggleObjectVisibility; shownObjectsList.appendChild(checkbox); shownObjectsList.appendChild(objNode); } // ---------------------- SVG ------------------------------------------------------ // --------------------------------------------------------------------------------- function takeSvgScreenshot() { if (objectTypeVisible["pointlabels"]) { setVisibility(false,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(false,"edgelabels"); } svgRenderer.render(scene,camera); svgElement = XMLS.serializeToString(svgRenderer.domElement); if (objectTypeVisible["pointlabels"]) { setVisibility(true,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(true,"edgelabels"); } if (document.getElementById('tab_8').checked){ //show in new tab var myWindow = window.open("",""); myWindow.document.body.innerHTML = svgElement; } else{ // download svg file download("screenshot.svg", svgElement); } } function download(filename, text) { var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } document.getElementById('transparencyRange_8').oninput = changeTransparency; document.getElementById('depthWriteCheckbox_8').onchange = toggleDepthWrite; document.getElementById('changeRotationX_8').onchange = changeRotationX; document.getElementById('changeRotationY_8').onchange = changeRotationY; document.getElementById('changeRotationZ_8').onchange = changeRotationZ; document.getElementById('resetButton_8').onclick = resetScene; document.getElementById('rotationSpeedRange_8').oninput = changeRotationSpeedFactor; document.getElementById('takeScreenshot_8').onclick = takeSvgScreenshot; document.getElementById('showSettingsButton_8').onclick = showSettings; document.getElementById('hideSettingsButton_8').onclick = hideSettings; // ------------------ SHORTCUTS -------------------------------------------- // ------------------------------------------------------------------------- /** * http://www.openjs.com/scripts/events/keyboard_shortcuts/ * Version : 2.01.B * By Binny V A * License : BSD */ shortcut = { 'all_shortcuts':{},//All the shortcuts are stored in this array 'add': function(shortcut_combination,callback,opt) { //Provide a set of default options var default_options = { 'type':'keydown', 'propagate':false, 'disable_in_input':false, 'target':document, 'keycode':false } if(!opt) opt = default_options; else { for(var dfo in default_options) { if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo]; } } var ele = opt.target; if(typeof opt.target == 'string') ele = document.getElementById(opt.target); var ths = this; shortcut_combination = shortcut_combination.toLowerCase(); //The function to be called at keypress var func = function(e) { e = e || window.event; if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields var element; if(e.target) element=e.target; else if(e.srcElement) element=e.srcElement; if(element.nodeType==3) element=element.parentNode; if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return; } //Find Which key is pressed if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; var character = String.fromCharCode(code).toLowerCase(); if(code == 188) character=","; //If the user presses , when the type is onkeydown if(code == 190) character="."; //If the user presses , when the type is onkeydown var keys = shortcut_combination.split("+"); //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked var kp = 0; //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken var shift_nums = { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&", "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<", ".":">", "/":"?", "\\":"|" } //Special Keys - and their codes var special_keys = { 'esc':27, 'escape':27, 'tab':9, 'space':32, 'return':13, 'enter':13, 'backspace':8, 'scrolllock':145, 'scroll_lock':145, 'scroll':145, 'capslock':20, 'caps_lock':20, 'caps':20, 'numlock':144, 'num_lock':144, 'num':144, 'pause':19, 'break':19, 'insert':45, 'home':36, 'delete':46, 'end':35, 'pageup':33, 'page_up':33, 'pu':33, 'pagedown':34, 'page_down':34, 'pd':34, 'left':37, 'up':38, 'right':39, 'down':40, 'f1':112, 'f2':113, 'f3':114, 'f4':115, 'f5':116, 'f6':117, 'f7':118, 'f8':119, 'f9':120, 'f10':121, 'f11':122, 'f12':123 } var modifiers = { shift: { wanted:false, pressed:false}, ctrl : { wanted:false, pressed:false}, alt : { wanted:false, pressed:false}, meta : { wanted:false, pressed:false} //Meta is Mac specific }; if(e.ctrlKey) modifiers.ctrl.pressed = true; if(e.shiftKey) modifiers.shift.pressed = true; if(e.altKey) modifiers.alt.pressed = true; if(e.metaKey) modifiers.meta.pressed = true; for(var i=0; k=keys[i],i<keys.length; i++) { //Modifiers if(k == 'ctrl' || k == 'control') { kp++; modifiers.ctrl.wanted = true; } else if(k == 'shift') { kp++; modifiers.shift.wanted = true; } else if(k == 'alt') { kp++; modifiers.alt.wanted = true; } else if(k == 'meta') { kp++; modifiers.meta.wanted = true; } else if(k.length > 1) { //If it is a special key if(special_keys[k] == code) kp++; } else if(opt['keycode']) { if(opt['keycode'] == code) kp++; } else { //The special keys did not match if(character == k) kp++; else { if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase character = shift_nums[character]; if(character == k) kp++; } } } } if(kp == keys.length && modifiers.ctrl.pressed == modifiers.ctrl.wanted && modifiers.shift.pressed == modifiers.shift.wanted && modifiers.alt.pressed == modifiers.alt.wanted && modifiers.meta.pressed == modifiers.meta.wanted) { callback(e); if(!opt['propagate']) { //Stop the event //e.cancelBubble is supported by IE - this will kill the bubbling process. e.cancelBubble = true; e.returnValue = false; //e.stopPropagation works in Firefox. if (e.stopPropagation) { e.stopPropagation(); e.preventDefault(); } return false; } } } this.all_shortcuts[shortcut_combination] = { 'callback':func, 'target':ele, 'event': opt['type'] }; //Attach the function with the event if(ele.addEventListener) ele.addEventListener(opt['type'], func, false); else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func); else ele['on'+opt['type']] = func; }, //Remove the shortcut - just specify the shortcut and I will remove the binding 'remove':function(shortcut_combination) { shortcut_combination = shortcut_combination.toLowerCase(); var binding = this.all_shortcuts[shortcut_combination]; delete(this.all_shortcuts[shortcut_combination]) if(!binding) return; var type = binding['event']; var ele = binding['target']; var callback = binding['callback']; if(ele.detachEvent) ele.detachEvent('on'+type, callback); else if(ele.removeEventListener) ele.removeEventListener(type, callback, false); else ele['on'+type] = false; } } shortcut.add("Alt+Left",function() { var event = new Event('click'); if (settingsShown){ document.getElementById('hideSettingsButton_8').dispatchEvent(event); } else { document.getElementById('showSettingsButton_8').dispatchEvent(event); } }); // COMMON_CODE_BLOCK_END });}); </script> </body> </html> </HTML> ==== More examples can be studied via the following: ==== <code perl> > # a torus with two cusps (6 edges) > $T2 = new Matrix<Int>([[0,0,6,5],[0,0,1,10],[0,0,8,2],[1,0,11,4],[1,0,7,3],[1,0,9,0]]); > > # a sphere with four cusps (6 edges) > $S4 = new Matrix<Int>([[1,0,2,6],[2,1,4,9],[0,2,0,11],[3,0,8,5],[1,3,1,10],[2,3,3,7]]); > > # a double torus with two cusps (12 edges) > $DT2 = new Matrix<Int>([[0,0,8,10],[0,0,12,14],[0,0,16,18],[0,0,20,22],[1,0,23,2],[1,0,13,3],[1,0,9,1],[1,0,11,4],[1,0,15,6],[1,0,21,7],[1,0,17,5],[1,0,19,0]]); </code> To study 4-dim. secondary fans the following method is useful. It intersects the secondary fan with the 3-dim. standard simplex. <code perl> > sub norm($){ > my $B = new Matrix(shift); > for (my $i = 0; $i < $B->rows(); ++$i) { > my $sum = 0; > for (my $j = 1; $j < $B->cols(); ++$j) { > $sum = $sum + $B->elem($i,$j); > } > $x = 1/$sum; > $B->row($i) = $x * $B->row($i); > } > return $B; > } > $s = new HyperbolicSurface(DCEL=>$S4,PENNER_COORDINATES=>[1,1,1,1,1,1],SPECIAL_POINT=>[1,0]); > $f = $s->SECONDARY_FAN; > $v = ones_vector | $f->RAYS; > $a = norm($v); > $b = $a->minor(All,~[0]); > $c = ones_vector | $b; > $q = new fan::PolyhedralComplex(POINTS=>$c,INPUT_POLYTOPES=>rows($f->MAXIMAL_CONES)); > $pro = fan::project_full($q); > $pro->VISUAL; </code> <HTML> <!-- polymake for knusper Thu Mar 3 00:31:55 2022 pcom:pro --> <html> <head> <meta charset=utf-8> <title>pcom:pro</title> <style> /* // COMMON_CODE_BLOCK_BEGIN */ html {overflow: scroll;} strong{font-size: 18px;} canvas { z-index: 8; } input[type='radio'] {margin-left:0;} input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;} .group{padding-bottom: 15px;} .settings * {z-index: 11; } .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;} .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;} .showSettingsButton{visibility: visible; z-index: 12; position: absolute } .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5} button{margin-left: 0; margin-top: 10px} img{cursor: pointer;} .suboption{padding-top: 15px;} #model22424937343 { width: 100%; height: 100%; } .threejs_container { width: 100%; height: 75vh;} .settings{max-height: 74vh} input[type=range] { -webkit-appearance: none; padding:0; width:90%; margin-left: auto; margin-right: auto; margin-top: 15px; margin-bottom: 15px; display: block; } input[type=range]:focus { outline: none; } input[type=range]::-webkit-slider-runnable-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-webkit-slider-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; -webkit-appearance: none; margin-top: -5px; } input[type=range]:focus::-webkit-slider-runnable-track { background: #E3E3E3; } input[type=range]::-moz-range-track { height: 4px; cursor: pointer; animate: 0.2s; box-shadow: 0px 0px 0px #000000; background: #E3E3E3; border-radius: 0px; border: 0px solid #000000; } input[type=range]::-moz-range-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]::-ms-track { height: 4px; cursor: pointer; animate: 0.2s; background: transparent; border-color: transparent; color: transparent; } input[type=range]::-ms-fill-lower { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-fill-upper { background: #E3E3E3; border: 0px solid #000000; border-radius: 0px; box-shadow: 0px 0px 0px #000000; } input[type=range]::-ms-thumb { box-shadow: 1px 1px 2px #B8B8B8; border: 1px solid #ABABAB; height: 13px; width: 25px; border-radius: 20px; background: #E0E0E0; cursor: pointer; } input[type=range]:focus::-ms-fill-lower { background: #E3E3E3; } input[type=range]:focus::-ms-fill-upper { background: #E3E3E3; } /* // COMMON_CODE_BLOCK_END */ </style> </head> <body> <div class='threejs_container'> <div id='settings_9' class='settings'> <div class=group id='explode_9'> <strong>Explode</strong> <input id='explodeRange_9' type='range' min='0.00001' max=6 step=0.01 value=0.00001> <div class=indented><input id='explodeCheckbox_9' type='checkbox'>Automatic explosion</div> <div class=suboption>Exploding speed</div> <input id='explodingSpeedRange_9' type='range' min=0 max=0.5 step=0.001 value=0.05> </div> <div class=group id='transparency_9' class='transparency'> <strong>Transparency</strong> <input id='transparencyRange_9' type='range' min=0 max=1 step=0.01 value=0> <div class=indented><input id='depthWriteCheckbox_9' type='checkbox'>depthWrite</div> </div> <div class=group id='rotation_9'> <strong>Rotation</strong> <div class=indented> <div><input type='checkbox' id='changeRotationX_9'> x-axis</div> <div><input type='checkbox' id='changeRotationY_9'> y-axis</div> <div><input type='checkbox' id='changeRotationZ_9'> z-axis</div> <button id='resetButton_9'>Reset</button> </div> <div class=suboption>Rotation speed</div> <input id='rotationSpeedRange_9' type='range' min=0 max=5 step=0.01 value=2> </div> <div class=group id='display_9'> <strong>Display</strong> <div class=indented> <div id='shownObjectTypesList_9' class='shownObjectsList'></div> </div> <div class=suboption>Objects</div> <div class=indented> <div id='shownObjectsList_9' class='shownObjectsList'></div> </div> </div> <div class=group id='camera_9'> <strong>Camera</strong> <div class=indented> <form> <select id="cameraType_9"> <option value='perspective' selected> Perspective<br></option> <option value='orthographic' > Orthographic<br></option> </select> </form> </div> </div> <div class=group id='svg_9'> <strong>SVG</strong> <div class=indented> <form> <input type="radio" name='screenshotMode' value='download' id='download_9' checked> Download<br> <input type="radio" name='screenshotMode' value='tab' id='tab_9' > New tab<br> </form> <button id='takeScreenshot_9'>Screenshot</button> </div> </div> </div> <!-- end of settings --> <img id='hideSettingsButton_9' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px"> <img id='showSettingsButton_9' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px"> <div id="model22424937343"></div> </div> <script> requirejs.config({ paths: { three: '/kernelspecs/r118/polymake/three', TrackballControls: '/kernelspecs/r118/polymake/TrackballControls', OrbitControls: '/kernelspecs/r118/polymake/OrbitControls', Projector: '/kernelspecs/r118/polymake/Projector', SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer', WEBGL: '/kernelspecs/r118/polymake/WebGL', }, shim: { 'three': { exports: 'THREE'}, 'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' }, 'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' }, 'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' }, 'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' }, 'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' }, } }); require(['three'],function(THREE){ window.THREE = THREE; require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'], function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) { THREE.TrackballControls = TrackballControls; THREE.OrbitControls = OrbitControls; THREE.Projector = Projector; THREE.SVGRenderer = SVGRenderer; THREE.WEBGL = WEBGL; // COMMON_CODE_BLOCK_BEGIN const intervalLength = 25; // for automatic animations const explodableModel = true; const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false }; const foldables = []; var three = document.getElementById("model22424937343"); var scene = new THREE.Scene(); var renderer = new THREE.WebGLRenderer( { antialias: true } ); var svgRenderer = new THREE.SVGRenderer( { antialias: true } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setClearColor(0xFFFFFF, 1); svgRenderer.setClearColor(0xFFFFFF, 1); three.appendChild(renderer.domElement); var frustumSize = 4; var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()]; cameras.forEach(function(cam) { cam.position.set(0, 0, 5); cam.lookAt(0, 0, 0); cam.up.set(0, 1, 0); }); var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)]; var camera, control; controls[0].zoomSpeed = 0.2; controls[0].rotateSpeed = 4; // class to allow move points together with labels and spheres var PMPoint = function (x,y,z) { this.vector = new THREE.Vector3(x,y,z); this.sprite = null; this.sphere = null; } PMPoint.prototype.addLabel = function(labelsprite) { this.sprite = labelsprite; this.sprite.position.copy(this.vector); } PMPoint.prototype.addSphere = function(spheremesh) { this.sphere = spheremesh; this.sphere.position.copy(this.vector); } PMPoint.prototype.set = function(x,y,z) { this.vector.set(x,y,z); if (this.sprite) { this.sprite.position.copy(this.vector); } if (this.sphere) { this.sphere.position.copy(this.vector); } } PMPoint.prototype.radius = function() { if (this.sphere) { return this.sphere.geometry.parameters.radius; } else { return 0; } }; // select the target node var target = document.querySelector('#model22424937343'); // create an observer instance var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.removedNodes && mutation.removedNodes.length > 0) { cancelAnimationFrame(renderId); observer.disconnect(); console.log("cancelled frame "+renderId); } }); }); // configuration of the observer: var config = { childList: true, characterData: true } // pass in the target node, as well as the observer options while (target) { if (target.className=="output") { observer.observe(target, config); break; } target = target.parentNode; } // COMMON_CODE_BLOCK_END var obj0 = new THREE.Object3D(); obj0.name = "_bounded"; obj0.userData.explodable = 1; obj0.userData.points = []; obj0.userData.points.push(new PMPoint(6.6, 6.6, 5.6)); obj0.userData.points.push(new PMPoint(4.6, 6.6, 4.6)); obj0.userData.points.push(new PMPoint(1, 1, 3)); obj0.userData.points.push(new PMPoint(1, 3, 1)); obj0.userData.points.push(new PMPoint(0, 1, 1)); obj0.userData.points.push(new PMPoint(1, 1, 0)); obj0.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333)); obj0.userData.points.push(new PMPoint(1, 0, 1)); obj0.userData.points.push(new PMPoint(3, 1, 1)); obj0.userData.points.push(new PMPoint(6.6, 4.6, 4.6)); obj0.userData.points.push(new PMPoint(4.6, 4.6, 6.6)); obj0.userData.points.push(new PMPoint(6.6, 5.6, 6.6)); obj0.userData.points.push(new PMPoint(5.6, 6.6, 6.6)); obj0.userData.points.push(new PMPoint(6.6, 6.6, 6.6)); obj0.userData.pointradii = [0, 0, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0, 0, 0, 0, 0]; <!-- Vertex style --> obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj0.userData.pointlabels = [" ", " ", "1", "2", "4", "6", "7", "5", "3", " ", " ", " ", " ", " "]; obj0.userData.edgeindices = [0, 1, 1, 3, 2, 4, 3, 4, 3, 5, 4, 6, 5, 6, 2, 7, 6, 7, 5, 8, 7, 8, 0, 9, 8, 9, 2, 10, 9, 11, 10, 11, 1, 12, 10, 12, 0, 13, 11, 13, 12, 13]; <!-- Edge style --> obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj0.userData.facets = [[3, 4, 2, 10, 12, 1], [6, 4, 3, 5], [2, 4, 6, 7], [10, 2, 7, 8, 9, 11], [7, 6, 5, 8], [3, 1, 0, 9, 8, 5], [11, 9, 0, 13], [1, 12, 13, 0], [12, 10, 11, 13]]; <!-- Facet style --> obj0.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj0); scene.add(obj0); var obj1 = new THREE.Object3D(); obj1.name = "_bounded"; obj1.userData.explodable = 1; obj1.userData.points = []; obj1.userData.points.push(new PMPoint(1, 6.6, 4.6)); obj1.userData.points.push(new PMPoint(4.6, 6.6, 4.6)); obj1.userData.points.push(new PMPoint(1, 3, 1)); obj1.userData.points.push(new PMPoint(0, 1, 1)); obj1.userData.points.push(new PMPoint(1, 1, 3)); obj1.userData.points.push(new PMPoint(1, 4.6, 6.6)); obj1.userData.points.push(new PMPoint(4.6, 4.6, 6.6)); obj1.userData.points.push(new PMPoint(5.6, 6.6, 6.6)); obj1.userData.points.push(new PMPoint(0, 6.6, 6.6)); obj1.userData.pointradii = [0, 0, 0.02, 0.02, 0.02, 0, 0, 0, 0]; <!-- Vertex style --> obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj1.userData.pointlabels = [" ", " ", "2", "4", "1", " ", " ", " ", " "]; obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 3, 4, 4, 5, 4, 6, 5, 6, 1, 7, 6, 7, 0, 8, 3, 8, 5, 8, 7, 8]; <!-- Edge style --> obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj1.userData.facets = [[4, 5, 8, 3], [6, 5, 4], [2, 0, 1], [3, 8, 0, 2], [4, 3, 2, 1, 7, 6], [8, 7, 1, 0], [8, 5, 6, 7]]; <!-- Facet style --> obj1.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj1); scene.add(obj1); var obj2 = new THREE.Object3D(); obj2.name = "unnamed__1"; obj2.userData.explodable = 1; obj2.userData.points = []; obj2.userData.points.push(new PMPoint(1, 1, 3)); obj2.userData.points.push(new PMPoint(0, 1, 1)); obj2.userData.points.push(new PMPoint(1, 0, 1)); obj2.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333)); obj2.userData.points.push(new PMPoint(0, 0, 1)); obj2.userData.pointradii = 0.02; <!-- Vertex style --> obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj2.userData.pointlabels = ["1", "4", "5", "7", "9"]; obj2.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4]; <!-- Edge style --> obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj2.userData.facets = [[3, 4, 1], [3, 2, 4], [0, 4, 2], [1, 4, 0], [3, 1, 0, 2]]; <!-- Facet style --> obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj2); scene.add(obj2); var obj3 = new THREE.Object3D(); obj3.name = "_bounded"; obj3.userData.explodable = 1; obj3.userData.points = []; obj3.userData.points.push(new PMPoint(6.6, 1, 4.6)); obj3.userData.points.push(new PMPoint(6.6, 4.6, 4.6)); obj3.userData.points.push(new PMPoint(3, 1, 1)); obj3.userData.points.push(new PMPoint(1, 0, 1)); obj3.userData.points.push(new PMPoint(1, 1, 3)); obj3.userData.points.push(new PMPoint(4.6, 1, 6.6)); obj3.userData.points.push(new PMPoint(4.6, 4.6, 6.6)); obj3.userData.points.push(new PMPoint(6.6, 5.6, 6.6)); obj3.userData.points.push(new PMPoint(6.6, 0, 6.6)); obj3.userData.pointradii = [0, 0, 0.02, 0.02, 0.02, 0, 0, 0, 0]; <!-- Vertex style --> obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj3.userData.pointlabels = [" ", " ", "3", "5", "1", " ", " ", " ", " "]; obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 3, 4, 4, 5, 4, 6, 5, 6, 1, 7, 6, 7, 0, 8, 3, 8, 5, 8, 7, 8]; <!-- Edge style --> obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj3.userData.facets = [[5, 4, 3, 8], [6, 4, 5], [2, 1, 0], [8, 3, 2, 0], [3, 4, 6, 7, 1, 2], [1, 7, 8, 0], [5, 8, 7, 6]]; <!-- Facet style --> obj3.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj3); scene.add(obj3); var obj4 = new THREE.Object3D(); obj4.name = "_bounded"; obj4.userData.explodable = 1; obj4.userData.points = []; obj4.userData.points.push(new PMPoint(6.6, 4.6, 1)); obj4.userData.points.push(new PMPoint(6.6, 4.6, 4.6)); obj4.userData.points.push(new PMPoint(3, 1, 1)); obj4.userData.points.push(new PMPoint(1, 1, 0)); obj4.userData.points.push(new PMPoint(1, 3, 1)); obj4.userData.points.push(new PMPoint(4.6, 6.6, 1)); obj4.userData.points.push(new PMPoint(4.6, 6.6, 4.6)); obj4.userData.points.push(new PMPoint(6.6, 6.6, 5.6)); obj4.userData.points.push(new PMPoint(6.6, 6.6, 0)); obj4.userData.pointradii = [0, 0, 0.02, 0.02, 0.02, 0, 0, 0, 0]; <!-- Vertex style --> obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj4.userData.pointlabels = [" ", " ", "3", "6", "2", " ", " ", " ", " "]; obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 3, 4, 4, 5, 4, 6, 5, 6, 1, 7, 6, 7, 0, 8, 3, 8, 5, 8, 7, 8]; <!-- Edge style --> obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj4.userData.facets = [[4, 5, 8, 3], [6, 5, 4], [2, 0, 1], [3, 8, 0, 2], [4, 3, 2, 1, 7, 6], [8, 7, 1, 0], [8, 5, 6, 7]]; <!-- Facet style --> obj4.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj4); scene.add(obj4); var obj5 = new THREE.Object3D(); obj5.name = "unnamed__2"; obj5.userData.explodable = 1; obj5.userData.points = []; obj5.userData.points.push(new PMPoint(1, 3, 1)); obj5.userData.points.push(new PMPoint(0, 1, 1)); obj5.userData.points.push(new PMPoint(1, 1, 0)); obj5.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333)); obj5.userData.points.push(new PMPoint(0, 1, 0)); obj5.userData.pointradii = 0.02; <!-- Vertex style --> obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj5.userData.pointlabels = ["2", "4", "6", "7", "12"]; obj5.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4]; <!-- Edge style --> obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj5.userData.facets = [[3, 4, 2], [3, 1, 4], [0, 4, 1], [2, 4, 0], [3, 2, 0, 1]]; <!-- Facet style --> obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj5); scene.add(obj5); var obj6 = new THREE.Object3D(); obj6.name = "unnamed__3"; obj6.userData.explodable = 1; obj6.userData.points = []; obj6.userData.points.push(new PMPoint(3, 1, 1)); obj6.userData.points.push(new PMPoint(1, 0, 1)); obj6.userData.points.push(new PMPoint(1, 1, 0)); obj6.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333)); obj6.userData.points.push(new PMPoint(1, 0, 0)); obj6.userData.pointradii = 0.02; <!-- Vertex style --> obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj6.userData.pointlabels = ["3", "5", "6", "7", "13"]; obj6.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4]; <!-- Edge style --> obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj6.userData.facets = [[4, 3, 2], [1, 3, 4], [0, 1, 4], [4, 2, 0], [2, 3, 1, 0]]; <!-- Facet style --> obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj6); scene.add(obj6); var obj7 = new THREE.Object3D(); obj7.name = "_bounded"; obj7.userData.explodable = 1; obj7.userData.points = []; obj7.userData.points.push(new PMPoint(1, 1, 3)); obj7.userData.points.push(new PMPoint(0, 1, 3)); obj7.userData.points.push(new PMPoint(0, 1, 1)); obj7.userData.points.push(new PMPoint(0, 6.6, 6.6)); obj7.userData.points.push(new PMPoint(0, 4.6, 6.6)); obj7.userData.points.push(new PMPoint(1, 4.6, 6.6)); obj7.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0]; <!-- Vertex style --> obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj7.userData.pointlabels = ["1", "14", "4", " ", " ", " "]; obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5]; <!-- Edge style --> obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj7.userData.facets = [[4, 1, 0, 5], [2, 1, 4, 3], [0, 1, 2], [5, 0, 2, 3], [4, 5, 3]]; <!-- Facet style --> obj7.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj7); scene.add(obj7); var obj8 = new THREE.Object3D(); obj8.name = "_bounded"; obj8.userData.explodable = 1; obj8.userData.points = []; obj8.userData.points.push(new PMPoint(1, 1, 3)); obj8.userData.points.push(new PMPoint(2.2, 2.2, 6.6)); obj8.userData.points.push(new PMPoint(1, 4.6, 6.6)); obj8.userData.points.push(new PMPoint(4.6, 4.6, 6.6)); obj8.userData.pointradii = [0.02, 0, 0, 0]; <!-- Vertex style --> obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj8.userData.pointlabels = ["1", " ", " ", " "]; obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj8.userData.facets = [[0, 1, 2], [3, 1, 0], [0, 2, 3], [2, 1, 3]]; <!-- Facet style --> obj8.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj8); scene.add(obj8); var obj9 = new THREE.Object3D(); obj9.name = "_bounded"; obj9.userData.explodable = 1; obj9.userData.points = []; obj9.userData.points.push(new PMPoint(1, 3, 1)); obj9.userData.points.push(new PMPoint(2.2, 6.6, 2.2)); obj9.userData.points.push(new PMPoint(1, 6.6, 4.6)); obj9.userData.points.push(new PMPoint(4.6, 6.6, 4.6)); obj9.userData.pointradii = [0.02, 0, 0, 0]; <!-- Vertex style --> obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj9.userData.pointlabels = ["2", " ", " ", " "]; obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj9.userData.facets = [[1, 0, 2], [3, 0, 1], [2, 0, 3], [1, 2, 3]]; <!-- Facet style --> obj9.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj9); scene.add(obj9); var obj10 = new THREE.Object3D(); obj10.name = "_bounded"; obj10.userData.explodable = 1; obj10.userData.points = []; obj10.userData.points.push(new PMPoint(1, 3, 1)); obj10.userData.points.push(new PMPoint(0, 3, 1)); obj10.userData.points.push(new PMPoint(0, 1, 1)); obj10.userData.points.push(new PMPoint(0, 6.6, 6.6)); obj10.userData.points.push(new PMPoint(0, 6.6, 4.6)); obj10.userData.points.push(new PMPoint(1, 6.6, 4.6)); obj10.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0]; <!-- Vertex style --> obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj10.userData.pointlabels = ["2", "17", "4", " ", " ", " "]; obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5]; <!-- Edge style --> obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj10.userData.facets = [[1, 4, 5, 0], [3, 4, 1, 2], [1, 0, 2], [0, 5, 3, 2], [5, 4, 3]]; <!-- Facet style --> obj10.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj10); scene.add(obj10); var obj11 = new THREE.Object3D(); obj11.name = "unnamed__4"; obj11.userData.explodable = 1; obj11.userData.points = []; obj11.userData.points.push(new PMPoint(1, 1, 3)); obj11.userData.points.push(new PMPoint(0, 1, 1)); obj11.userData.points.push(new PMPoint(0, 0, 1)); obj11.userData.points.push(new PMPoint(0, 1, 3)); obj11.userData.pointradii = 0.02; <!-- Vertex style --> obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj11.userData.pointlabels = ["1", "4", "9", "14"]; obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj11.userData.facets = [[1, 3, 0], [2, 3, 1], [0, 3, 2], [1, 0, 2]]; <!-- Facet style --> obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj11); scene.add(obj11); var obj12 = new THREE.Object3D(); obj12.name = "unnamed__5"; obj12.userData.explodable = 1; obj12.userData.points = []; obj12.userData.points.push(new PMPoint(1, 1, 3)); obj12.userData.points.push(new PMPoint(1, 0, 1)); obj12.userData.points.push(new PMPoint(0, 0, 1)); obj12.userData.points.push(new PMPoint(1, 0, 3)); obj12.userData.pointradii = 0.02; <!-- Vertex style --> obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj12.userData.pointlabels = ["1", "5", "9", "18"]; obj12.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj12.userData.facets = [[0, 3, 1], [2, 3, 0], [1, 3, 2], [0, 1, 2]]; <!-- Facet style --> obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj12); scene.add(obj12); var obj13 = new THREE.Object3D(); obj13.name = "unnamed__6"; obj13.userData.explodable = 1; obj13.userData.points = []; obj13.userData.points.push(new PMPoint(0, 1, 1)); obj13.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333)); obj13.userData.points.push(new PMPoint(0, 0, 1)); obj13.userData.points.push(new PMPoint(0, 0.333333, 0.333333)); obj13.userData.pointradii = 0.02; <!-- Vertex style --> obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj13.userData.pointlabels = ["4", "7", "9", "19"]; obj13.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj13.userData.facets = [[3, 0, 1], [2, 0, 3], [1, 0, 2], [3, 1, 2]]; <!-- Facet style --> obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj13); scene.add(obj13); var obj14 = new THREE.Object3D(); obj14.name = "unnamed__7"; obj14.userData.explodable = 1; obj14.userData.points = []; obj14.userData.points.push(new PMPoint(1, 0, 1)); obj14.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333)); obj14.userData.points.push(new PMPoint(0, 0, 1)); obj14.userData.points.push(new PMPoint(0.333333, 0, 0.333333)); obj14.userData.pointradii = 0.02; <!-- Vertex style --> obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj14.userData.pointlabels = ["5", "7", "9", "20"]; obj14.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj14.userData.facets = [[1, 0, 3], [2, 0, 1], [3, 0, 2], [1, 3, 2]]; <!-- Facet style --> obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj14); scene.add(obj14); var obj15 = new THREE.Object3D(); obj15.name = "_bounded"; obj15.userData.explodable = 1; obj15.userData.points = []; obj15.userData.points.push(new PMPoint(1, 1, 3)); obj15.userData.points.push(new PMPoint(2.2, 2.2, 6.6)); obj15.userData.points.push(new PMPoint(4.6, 1, 6.6)); obj15.userData.points.push(new PMPoint(4.6, 4.6, 6.6)); obj15.userData.pointradii = [0.02, 0, 0, 0]; <!-- Vertex style --> obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj15.userData.pointlabels = ["1", " ", " ", " "]; obj15.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj15.userData.facets = [[0, 1, 3], [2, 1, 0], [0, 3, 2], [3, 1, 2]]; <!-- Facet style --> obj15.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj15); scene.add(obj15); var obj16 = new THREE.Object3D(); obj16.name = "_bounded"; obj16.userData.explodable = 1; obj16.userData.points = []; obj16.userData.points.push(new PMPoint(1, 1, 3)); obj16.userData.points.push(new PMPoint(1, 0, 3)); obj16.userData.points.push(new PMPoint(1, 0, 1)); obj16.userData.points.push(new PMPoint(6.6, 0, 6.6)); obj16.userData.points.push(new PMPoint(4.6, 0, 6.6)); obj16.userData.points.push(new PMPoint(4.6, 1, 6.6)); obj16.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0]; <!-- Vertex style --> obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj16.userData.pointlabels = ["1", "18", "5", " ", " ", " "]; obj16.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5]; <!-- Edge style --> obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj16.userData.facets = [[0, 1, 4, 5], [2, 1, 0], [4, 1, 2, 3], [0, 5, 3, 2], [5, 4, 3]]; <!-- Facet style --> obj16.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj16); scene.add(obj16); var obj17 = new THREE.Object3D(); obj17.name = "_bounded"; obj17.userData.explodable = 1; obj17.userData.points = []; obj17.userData.points.push(new PMPoint(3, 1, 1)); obj17.userData.points.push(new PMPoint(6.6, 2.2, 2.2)); obj17.userData.points.push(new PMPoint(6.6, 4.6, 4.6)); obj17.userData.points.push(new PMPoint(6.6, 1, 4.6)); obj17.userData.pointradii = [0.02, 0, 0, 0]; <!-- Vertex style --> obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj17.userData.pointlabels = ["3", " ", " ", " "]; obj17.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj17.userData.facets = [[0, 2, 1], [3, 2, 0], [0, 1, 3], [1, 2, 3]]; <!-- Facet style --> obj17.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj17); scene.add(obj17); var obj18 = new THREE.Object3D(); obj18.name = "_bounded"; obj18.userData.explodable = 1; obj18.userData.points = []; obj18.userData.points.push(new PMPoint(3, 1, 1)); obj18.userData.points.push(new PMPoint(3, 0, 1)); obj18.userData.points.push(new PMPoint(1, 0, 1)); obj18.userData.points.push(new PMPoint(6.6, 0, 6.6)); obj18.userData.points.push(new PMPoint(6.6, 0, 4.6)); obj18.userData.points.push(new PMPoint(6.6, 1, 4.6)); obj18.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0]; <!-- Vertex style --> obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj18.userData.pointlabels = ["3", "22", "5", " ", " ", " "]; obj18.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5]; <!-- Edge style --> obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj18.userData.facets = [[1, 0, 5, 4], [2, 0, 1], [1, 4, 3, 2], [5, 0, 2, 3], [4, 5, 3]]; <!-- Facet style --> obj18.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj18); scene.add(obj18); var obj19 = new THREE.Object3D(); obj19.name = "_bounded"; obj19.userData.explodable = 1; obj19.userData.points = []; obj19.userData.points.push(new PMPoint(1, 3, 1)); obj19.userData.points.push(new PMPoint(2.2, 6.6, 2.2)); obj19.userData.points.push(new PMPoint(4.6, 6.6, 4.6)); obj19.userData.points.push(new PMPoint(4.6, 6.6, 1)); obj19.userData.pointradii = [0.02, 0, 0, 0]; <!-- Vertex style --> obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj19.userData.pointlabels = ["2", " ", " ", " "]; obj19.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj19.userData.facets = [[0, 2, 1], [3, 2, 0], [0, 1, 3], [1, 2, 3]]; <!-- Facet style --> obj19.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj19); scene.add(obj19); var obj20 = new THREE.Object3D(); obj20.name = "_bounded"; obj20.userData.explodable = 1; obj20.userData.points = []; obj20.userData.points.push(new PMPoint(3, 1, 1)); obj20.userData.points.push(new PMPoint(6.6, 2.2, 2.2)); obj20.userData.points.push(new PMPoint(6.6, 4.6, 4.6)); obj20.userData.points.push(new PMPoint(6.6, 4.6, 1)); obj20.userData.pointradii = [0.02, 0, 0, 0]; <!-- Vertex style --> obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj20.userData.pointlabels = ["3", " ", " ", " "]; obj20.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj20.userData.facets = [[0, 2, 3], [1, 2, 0], [0, 3, 1], [3, 2, 1]]; <!-- Facet style --> obj20.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj20); scene.add(obj20); var obj21 = new THREE.Object3D(); obj21.name = "_bounded"; obj21.userData.explodable = 1; obj21.userData.points = []; obj21.userData.points.push(new PMPoint(1, 3, 1)); obj21.userData.points.push(new PMPoint(1, 3, 0)); obj21.userData.points.push(new PMPoint(1, 1, 0)); obj21.userData.points.push(new PMPoint(6.6, 6.6, 0)); obj21.userData.points.push(new PMPoint(4.6, 6.6, 0)); obj21.userData.points.push(new PMPoint(4.6, 6.6, 1)); obj21.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0]; <!-- Vertex style --> obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj21.userData.pointlabels = ["2", "23", "6", " ", " ", " "]; obj21.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5]; <!-- Edge style --> obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj21.userData.facets = [[1, 0, 5, 4], [2, 0, 1], [5, 0, 2, 3], [1, 4, 3, 2], [4, 5, 3]]; <!-- Facet style --> obj21.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj21); scene.add(obj21); var obj22 = new THREE.Object3D(); obj22.name = "_bounded"; obj22.userData.explodable = 1; obj22.userData.points = []; obj22.userData.points.push(new PMPoint(3, 1, 1)); obj22.userData.points.push(new PMPoint(3, 1, 0)); obj22.userData.points.push(new PMPoint(1, 1, 0)); obj22.userData.points.push(new PMPoint(6.6, 6.6, 0)); obj22.userData.points.push(new PMPoint(6.6, 4.6, 0)); obj22.userData.points.push(new PMPoint(6.6, 4.6, 1)); obj22.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0]; <!-- Vertex style --> obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj22.userData.pointlabels = ["3", "24", "6", " ", " ", " "]; obj22.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5]; <!-- Edge style --> obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj22.userData.facets = [[0, 1, 4, 5], [2, 1, 0], [0, 5, 3, 2], [4, 1, 2, 3], [5, 4, 3]]; <!-- Facet style --> obj22.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj22); scene.add(obj22); var obj23 = new THREE.Object3D(); obj23.name = "unnamed__8"; obj23.userData.explodable = 1; obj23.userData.points = []; obj23.userData.points.push(new PMPoint(1, 3, 1)); obj23.userData.points.push(new PMPoint(0, 1, 1)); obj23.userData.points.push(new PMPoint(0, 1, 0)); obj23.userData.points.push(new PMPoint(0, 3, 1)); obj23.userData.pointradii = 0.02; <!-- Vertex style --> obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj23.userData.pointlabels = ["2", "4", "12", "17"]; obj23.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj23.userData.facets = [[3, 1, 0], [2, 1, 3], [0, 1, 2], [3, 0, 2]]; <!-- Facet style --> obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj23); scene.add(obj23); var obj24 = new THREE.Object3D(); obj24.name = "unnamed__9"; obj24.userData.explodable = 1; obj24.userData.points = []; obj24.userData.points.push(new PMPoint(0, 1, 1)); obj24.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333)); obj24.userData.points.push(new PMPoint(0, 1, 0)); obj24.userData.points.push(new PMPoint(0, 0.333333, 0.333333)); obj24.userData.pointradii = 0.02; <!-- Vertex style --> obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj24.userData.pointlabels = ["4", "7", "12", "19"]; obj24.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj24.userData.facets = [[2, 0, 1], [3, 0, 2], [1, 0, 3], [2, 1, 3]]; <!-- Facet style --> obj24.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj24); scene.add(obj24); var obj25 = new THREE.Object3D(); obj25.name = "unnamed__10"; obj25.userData.explodable = 1; obj25.userData.points = []; obj25.userData.points.push(new PMPoint(1, 3, 1)); obj25.userData.points.push(new PMPoint(1, 1, 0)); obj25.userData.points.push(new PMPoint(0, 1, 0)); obj25.userData.points.push(new PMPoint(1, 3, 0)); obj25.userData.pointradii = 0.02; <!-- Vertex style --> obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj25.userData.pointlabels = ["2", "6", "12", "23"]; obj25.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj25.userData.facets = [[3, 0, 1], [2, 0, 3], [1, 0, 2], [3, 1, 2]]; <!-- Facet style --> obj25.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj25); scene.add(obj25); var obj26 = new THREE.Object3D(); obj26.name = "unnamed__11"; obj26.userData.explodable = 1; obj26.userData.points = []; obj26.userData.points.push(new PMPoint(1, 1, 0)); obj26.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333)); obj26.userData.points.push(new PMPoint(0, 1, 0)); obj26.userData.points.push(new PMPoint(0.333333, 0.333333, 0)); obj26.userData.pointradii = 0.02; <!-- Vertex style --> obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj26.userData.pointlabels = ["6", "7", "12", "25"]; obj26.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj26.userData.facets = [[0, 1, 3], [2, 1, 0], [3, 1, 2], [0, 3, 2]]; <!-- Facet style --> obj26.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj26); scene.add(obj26); var obj27 = new THREE.Object3D(); obj27.name = "unnamed__12"; obj27.userData.explodable = 1; obj27.userData.points = []; obj27.userData.points.push(new PMPoint(1, 0, 1)); obj27.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333)); obj27.userData.points.push(new PMPoint(1, 0, 0)); obj27.userData.points.push(new PMPoint(0.333333, 0, 0.333333)); obj27.userData.pointradii = 0.02; <!-- Vertex style --> obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj27.userData.pointlabels = ["5", "7", "13", "20"]; obj27.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj27.userData.facets = [[1, 0, 2], [3, 0, 1], [2, 0, 3], [1, 2, 3]]; <!-- Facet style --> obj27.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj27); scene.add(obj27); var obj28 = new THREE.Object3D(); obj28.name = "unnamed__13"; obj28.userData.explodable = 1; obj28.userData.points = []; obj28.userData.points.push(new PMPoint(3, 1, 1)); obj28.userData.points.push(new PMPoint(1, 0, 1)); obj28.userData.points.push(new PMPoint(1, 0, 0)); obj28.userData.points.push(new PMPoint(3, 0, 1)); obj28.userData.pointradii = 0.02; <!-- Vertex style --> obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj28.userData.pointlabels = ["3", "5", "13", "22"]; obj28.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj28.userData.facets = [[0, 1, 3], [2, 1, 0], [3, 1, 2], [0, 3, 2]]; <!-- Facet style --> obj28.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj28); scene.add(obj28); var obj29 = new THREE.Object3D(); obj29.name = "unnamed__14"; obj29.userData.explodable = 1; obj29.userData.points = []; obj29.userData.points.push(new PMPoint(3, 1, 1)); obj29.userData.points.push(new PMPoint(1, 1, 0)); obj29.userData.points.push(new PMPoint(1, 0, 0)); obj29.userData.points.push(new PMPoint(3, 1, 0)); obj29.userData.pointradii = 0.02; <!-- Vertex style --> obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj29.userData.pointlabels = ["3", "6", "13", "24"]; obj29.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj29.userData.facets = [[1, 0, 3], [2, 0, 1], [3, 0, 2], [1, 3, 2]]; <!-- Facet style --> obj29.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj29); scene.add(obj29); var obj30 = new THREE.Object3D(); obj30.name = "unnamed__15"; obj30.userData.explodable = 1; obj30.userData.points = []; obj30.userData.points.push(new PMPoint(1, 1, 0)); obj30.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333)); obj30.userData.points.push(new PMPoint(1, 0, 0)); obj30.userData.points.push(new PMPoint(0.333333, 0.333333, 0)); obj30.userData.pointradii = 0.02; <!-- Vertex style --> obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj30.userData.pointlabels = ["6", "7", "13", "25"]; obj30.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3]; <!-- Edge style --> obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj30.userData.facets = [[0, 1, 2], [3, 1, 0], [2, 1, 3], [0, 2, 3]]; <!-- Facet style --> obj30.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj30); scene.add(obj30); var obj31 = new THREE.Object3D(); obj31.name = "_bounded"; obj31.userData.explodable = 1; obj31.userData.points = []; obj31.userData.points.push(new PMPoint(0, 1, 3)); obj31.userData.points.push(new PMPoint(1, 1, 3)); obj31.userData.points.push(new PMPoint(0, 4.6, 6.6)); obj31.userData.points.push(new PMPoint(1, 4.6, 6.6)); obj31.userData.points.push(new PMPoint(2.2, 2.2, 6.6)); obj31.userData.points.push(new PMPoint(0, 2.2, 6.6)); obj31.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0]; <!-- Vertex style --> obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj31.userData.pointlabels = ["14", "1", " ", " ", " ", " "]; obj31.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5]; <!-- Edge style --> obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj31.userData.facets = [[2, 0, 5], [4, 1, 3], [1, 0, 2, 3], [5, 0, 1, 4], [2, 5, 4, 3]]; <!-- Facet style --> obj31.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj31); scene.add(obj31); var obj32 = new THREE.Object3D(); obj32.name = "_bounded"; obj32.userData.explodable = 1; obj32.userData.points = []; obj32.userData.points.push(new PMPoint(0, 3, 1)); obj32.userData.points.push(new PMPoint(1, 3, 1)); obj32.userData.points.push(new PMPoint(0, 6.6, 4.6)); obj32.userData.points.push(new PMPoint(1, 6.6, 4.6)); obj32.userData.points.push(new PMPoint(2.2, 6.6, 2.2)); obj32.userData.points.push(new PMPoint(0, 6.6, 2.2)); obj32.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0]; <!-- Vertex style --> obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj32.userData.pointlabels = ["17", "2", " ", " ", " ", " "]; obj32.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5]; <!-- Edge style --> obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj32.userData.facets = [[0, 2, 5], [4, 3, 1], [3, 2, 0, 1], [0, 5, 4, 1], [5, 2, 3, 4]]; <!-- Facet style --> obj32.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj32); scene.add(obj32); var obj33 = new THREE.Object3D(); obj33.name = "unnamed__16"; obj33.userData.explodable = 1; obj33.userData.points = []; obj33.userData.points.push(new PMPoint(1, 1, 3)); obj33.userData.points.push(new PMPoint(0, 0, 1)); obj33.userData.points.push(new PMPoint(0, 1, 3)); obj33.userData.points.push(new PMPoint(1, 0, 3)); obj33.userData.points.push(new PMPoint(0, 0, 3)); obj33.userData.pointradii = 0.02; <!-- Vertex style --> obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj33.userData.pointlabels = ["1", "9", "14", "18", "28"]; obj33.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4]; <!-- Edge style --> obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj33.userData.facets = [[4, 1, 3], [4, 2, 1], [0, 1, 2], [3, 1, 0], [4, 3, 0, 2]]; <!-- Facet style --> obj33.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj33); scene.add(obj33); var obj34 = new THREE.Object3D(); obj34.name = "unnamed__17"; obj34.userData.explodable = 1; obj34.userData.points = []; obj34.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333)); obj34.userData.points.push(new PMPoint(0, 0, 1)); obj34.userData.points.push(new PMPoint(0, 0.333333, 0.333333)); obj34.userData.points.push(new PMPoint(0.333333, 0, 0.333333)); obj34.userData.points.push(new PMPoint(0, 0, 0.333333)); obj34.userData.pointradii = 0.02; <!-- Vertex style --> obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj34.userData.pointlabels = ["7", "9", "19", "20", "29"]; obj34.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4]; <!-- Edge style --> obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj34.userData.facets = [[1, 4, 3], [2, 4, 1], [0, 2, 1], [1, 3, 0], [3, 4, 2, 0]]; <!-- Facet style --> obj34.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj34); scene.add(obj34); var obj35 = new THREE.Object3D(); obj35.name = "_bounded"; obj35.userData.explodable = 1; obj35.userData.points = []; obj35.userData.points.push(new PMPoint(1, 0, 3)); obj35.userData.points.push(new PMPoint(1, 1, 3)); obj35.userData.points.push(new PMPoint(4.6, 0, 6.6)); obj35.userData.points.push(new PMPoint(4.6, 1, 6.6)); obj35.userData.points.push(new PMPoint(2.2, 2.2, 6.6)); obj35.userData.points.push(new PMPoint(2.2, 0, 6.6)); obj35.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0]; <!-- Vertex style --> obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj35.userData.pointlabels = ["18", "1", " ", " ", " ", " "]; obj35.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5]; <!-- Edge style --> obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj35.userData.facets = [[0, 2, 5], [4, 3, 1], [3, 2, 0, 1], [0, 5, 4, 1], [5, 2, 3, 4]]; <!-- Facet style --> obj35.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj35); scene.add(obj35); var obj36 = new THREE.Object3D(); obj36.name = "_bounded"; obj36.userData.explodable = 1; obj36.userData.points = []; obj36.userData.points.push(new PMPoint(3, 1, 1)); obj36.userData.points.push(new PMPoint(3, 0, 1)); obj36.userData.points.push(new PMPoint(6.6, 1, 4.6)); obj36.userData.points.push(new PMPoint(6.6, 0, 4.6)); obj36.userData.points.push(new PMPoint(6.6, 0, 2.2)); obj36.userData.points.push(new PMPoint(6.6, 2.2, 2.2)); obj36.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0]; <!-- Vertex style --> obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj36.userData.pointlabels = ["3", "22", " ", " ", " ", " "]; obj36.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5]; <!-- Edge style --> obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj36.userData.facets = [[3, 1, 4], [5, 0, 2], [0, 1, 3, 2], [4, 1, 0, 5], [3, 4, 5, 2]]; <!-- Facet style --> obj36.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj36); scene.add(obj36); var obj37 = new THREE.Object3D(); obj37.name = "_bounded"; obj37.userData.explodable = 1; obj37.userData.points = []; obj37.userData.points.push(new PMPoint(1, 3, 0)); obj37.userData.points.push(new PMPoint(1, 3, 1)); obj37.userData.points.push(new PMPoint(4.6, 6.6, 0)); obj37.userData.points.push(new PMPoint(4.6, 6.6, 1)); obj37.userData.points.push(new PMPoint(2.2, 6.6, 2.2)); obj37.userData.points.push(new PMPoint(2.2, 6.6, 0)); obj37.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0]; <!-- Vertex style --> obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj37.userData.pointlabels = ["23", "2", " ", " ", " ", " "]; obj37.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5]; <!-- Edge style --> obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj37.userData.facets = [[2, 0, 5], [4, 1, 3], [1, 0, 2, 3], [5, 0, 1, 4], [2, 5, 4, 3]]; <!-- Facet style --> obj37.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj37); scene.add(obj37); var obj38 = new THREE.Object3D(); obj38.name = "_bounded"; obj38.userData.explodable = 1; obj38.userData.points = []; obj38.userData.points.push(new PMPoint(3, 1, 0)); obj38.userData.points.push(new PMPoint(3, 1, 1)); obj38.userData.points.push(new PMPoint(6.6, 4.6, 0)); obj38.userData.points.push(new PMPoint(6.6, 4.6, 1)); obj38.userData.points.push(new PMPoint(6.6, 2.2, 2.2)); obj38.userData.points.push(new PMPoint(6.6, 2.2, 0)); obj38.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0]; <!-- Vertex style --> obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj38.userData.pointlabels = ["24", "3", " ", " ", " ", " "]; obj38.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5]; <!-- Edge style --> obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj38.userData.facets = [[0, 2, 5], [4, 3, 1], [3, 2, 0, 1], [0, 5, 4, 1], [5, 2, 3, 4]]; <!-- Facet style --> obj38.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj38); scene.add(obj38); var obj39 = new THREE.Object3D(); obj39.name = "unnamed__18"; obj39.userData.explodable = 1; obj39.userData.points = []; obj39.userData.points.push(new PMPoint(1, 3, 1)); obj39.userData.points.push(new PMPoint(0, 1, 0)); obj39.userData.points.push(new PMPoint(0, 3, 1)); obj39.userData.points.push(new PMPoint(1, 3, 0)); obj39.userData.points.push(new PMPoint(0, 3, 0)); obj39.userData.pointradii = 0.02; <!-- Vertex style --> obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj39.userData.pointlabels = ["2", "12", "17", "23", "34"]; obj39.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4]; <!-- Edge style --> obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj39.userData.facets = [[1, 4, 3], [2, 4, 1], [0, 2, 1], [1, 3, 0], [3, 4, 2, 0]]; <!-- Facet style --> obj39.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj39); scene.add(obj39); var obj40 = new THREE.Object3D(); obj40.name = "unnamed__19"; obj40.userData.explodable = 1; obj40.userData.points = []; obj40.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333)); obj40.userData.points.push(new PMPoint(0, 1, 0)); obj40.userData.points.push(new PMPoint(0, 0.333333, 0.333333)); obj40.userData.points.push(new PMPoint(0.333333, 0.333333, 0)); obj40.userData.points.push(new PMPoint(0, 0.333333, 0)); obj40.userData.pointradii = 0.02; <!-- Vertex style --> obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj40.userData.pointlabels = ["7", "12", "19", "25", "35"]; obj40.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4]; <!-- Edge style --> obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj40.userData.facets = [[4, 1, 3], [4, 2, 1], [0, 1, 2], [3, 1, 0], [4, 3, 0, 2]]; <!-- Facet style --> obj40.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj40); scene.add(obj40); var obj41 = new THREE.Object3D(); obj41.name = "unnamed__20"; obj41.userData.explodable = 1; obj41.userData.points = []; obj41.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333)); obj41.userData.points.push(new PMPoint(1, 0, 0)); obj41.userData.points.push(new PMPoint(0.333333, 0, 0.333333)); obj41.userData.points.push(new PMPoint(0.333333, 0.333333, 0)); obj41.userData.points.push(new PMPoint(0.333333, 0, 0)); obj41.userData.pointradii = 0.02; <!-- Vertex style --> obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj41.userData.pointlabels = ["7", "13", "20", "25", "36"]; obj41.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4]; <!-- Edge style --> obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj41.userData.facets = [[1, 4, 3], [2, 4, 1], [0, 2, 1], [1, 3, 0], [3, 4, 2, 0]]; <!-- Facet style --> obj41.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj41); scene.add(obj41); var obj42 = new THREE.Object3D(); obj42.name = "unnamed__21"; obj42.userData.explodable = 1; obj42.userData.points = []; obj42.userData.points.push(new PMPoint(3, 1, 1)); obj42.userData.points.push(new PMPoint(1, 0, 0)); obj42.userData.points.push(new PMPoint(3, 0, 1)); obj42.userData.points.push(new PMPoint(3, 1, 0)); obj42.userData.points.push(new PMPoint(3, 0, 0)); obj42.userData.pointradii = 0.02; <!-- Vertex style --> obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj42.userData.pointlabels = ["3", "13", "22", "24", "37"]; obj42.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4]; <!-- Edge style --> obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj42.userData.facets = [[4, 1, 3], [4, 2, 1], [0, 1, 2], [3, 1, 0], [4, 3, 0, 2]]; <!-- Facet style --> obj42.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj42); scene.add(obj42); var obj43 = new THREE.Object3D(); obj43.name = "_bounded"; obj43.userData.explodable = 1; obj43.userData.points = []; obj43.userData.points.push(new PMPoint(1, 1, 3)); obj43.userData.points.push(new PMPoint(1, 0, 3)); obj43.userData.points.push(new PMPoint(0, 0, 3)); obj43.userData.points.push(new PMPoint(0, 1, 3)); obj43.userData.points.push(new PMPoint(0, 2.2, 6.6)); obj43.userData.points.push(new PMPoint(0, 0, 6.6)); obj43.userData.points.push(new PMPoint(2.2, 2.2, 6.6)); obj43.userData.points.push(new PMPoint(2.2, 0, 6.6)); obj43.userData.pointradii = [0.02, 0.02, 0.02, 0.02, 0, 0, 0, 0]; <!-- Vertex style --> obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj43.userData.pointlabels = ["1", "18", "28", "14", " ", " ", " ", " "]; obj43.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 3, 4, 2, 5, 4, 5, 0, 6, 4, 6, 1, 7, 5, 7, 6, 7]; <!-- Edge style --> obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj43.userData.facets = [[5, 2, 1, 7], [3, 2, 5, 4], [0, 3, 4, 6], [7, 1, 0, 6], [1, 2, 3, 0], [5, 7, 6, 4]]; <!-- Facet style --> obj43.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj43); scene.add(obj43); var obj44 = new THREE.Object3D(); obj44.name = "_bounded"; obj44.userData.explodable = 1; obj44.userData.points = []; obj44.userData.points.push(new PMPoint(1, 3, 1)); obj44.userData.points.push(new PMPoint(1, 3, 0)); obj44.userData.points.push(new PMPoint(0, 3, 0)); obj44.userData.points.push(new PMPoint(0, 3, 1)); obj44.userData.points.push(new PMPoint(0, 6.6, 2.2)); obj44.userData.points.push(new PMPoint(0, 6.6, 0)); obj44.userData.points.push(new PMPoint(2.2, 6.6, 2.2)); obj44.userData.points.push(new PMPoint(2.2, 6.6, 0)); obj44.userData.pointradii = [0.02, 0.02, 0.02, 0.02, 0, 0, 0, 0]; <!-- Vertex style --> obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj44.userData.pointlabels = ["2", "23", "34", "17", " ", " ", " ", " "]; obj44.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 3, 4, 2, 5, 4, 5, 0, 6, 4, 6, 1, 7, 5, 7, 6, 7]; <!-- Edge style --> obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj44.userData.facets = [[2, 5, 7, 1], [4, 5, 2, 3], [6, 4, 3, 0], [1, 7, 6, 0], [2, 1, 0, 3], [7, 5, 4, 6]]; <!-- Facet style --> obj44.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj44); scene.add(obj44); var obj45 = new THREE.Object3D(); obj45.name = "unnamed__22"; obj45.userData.explodable = 1; obj45.userData.points = []; obj45.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333)); obj45.userData.points.push(new PMPoint(0, 0.333333, 0.333333)); obj45.userData.points.push(new PMPoint(0.333333, 0, 0.333333)); obj45.userData.points.push(new PMPoint(0.333333, 0.333333, 0)); obj45.userData.points.push(new PMPoint(0, 0, 0.333333)); obj45.userData.points.push(new PMPoint(0, 0.333333, 0)); obj45.userData.points.push(new PMPoint(0.333333, 0, 0)); obj45.userData.points.push(new PMPoint(0, 0, 0)); obj45.userData.pointradii = 0.02; <!-- Vertex style --> obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj45.userData.pointlabels = ["7", "19", "20", "25", "29", "35", "36", "40"]; obj45.userData.edgeindices = [0, 1, 0, 2, 0, 3, 1, 4, 2, 4, 1, 5, 3, 5, 2, 6, 3, 6, 4, 7, 5, 7, 6, 7]; <!-- Edge style --> obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj45.userData.facets = [[7, 5, 3, 6], [1, 5, 7, 4], [7, 6, 2, 4], [0, 1, 4, 2], [3, 5, 1, 0], [6, 3, 0, 2]]; <!-- Facet style --> obj45.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ); init_object(obj45); scene.add(obj45); var obj46 = new THREE.Object3D(); obj46.name = "_bounded"; obj46.userData.explodable = 1; obj46.userData.points = []; obj46.userData.points.push(new PMPoint(3, 1, 0)); obj46.userData.points.push(new PMPoint(3, 0, 0)); obj46.userData.points.push(new PMPoint(3, 0, 1)); obj46.userData.points.push(new PMPoint(3, 1, 1)); obj46.userData.points.push(new PMPoint(6.6, 2.2, 2.2)); obj46.userData.points.push(new PMPoint(6.6, 0, 2.2)); obj46.userData.points.push(new PMPoint(6.6, 2.2, 0)); obj46.userData.points.push(new PMPoint(6.6, 0, 0)); obj46.userData.pointradii = [0.02, 0.02, 0.02, 0.02, 0, 0, 0, 0]; <!-- Vertex style --> obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } ); obj46.userData.pointlabels = ["24", "37", "22", "3", " ", " ", " ", " "]; obj46.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 3, 4, 2, 5, 4, 5, 0, 6, 4, 6, 1, 7, 5, 7, 6, 7]; <!-- Edge style --> obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } ); obj46.userData.facets = [[7, 1, 0, 6], [2, 1, 7, 5], [3, 2, 5, 4], [6, 0, 3, 4], [0, 1, 2, 3], [7, 6, 4, 5]]; <!-- Facet style --> obj46.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ), new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )]; init_object(obj46); scene.add(obj46); // COMMON_CODE_BLOCK_BEGIN function textSpriteMaterial(message, parameters) { if ( parameters === undefined ) parameters = {}; var fontface = "Helvetica"; var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15; fontsize = fontsize*10; var lines = message.split('\\n'); var size = 512; for(var i = 0; i<lines.length; i++){ var tmp = lines[i].length; while(tmp*fontsize > size){ fontsize--; } } var canvas = document.createElement('canvas'); canvas.width = size; canvas.height = size; var context = canvas.getContext('2d'); context.fillStyle = "rgba(255, 255, 255, 0)"; context.fill(); context.font = fontsize + "px " + fontface; // text color context.fillStyle = "rgba(0, 0, 0, 1.0)"; for(var i = 0; i<lines.length; i++){ context.fillText(lines[i], size/2, size/2+i*fontsize); } // canvas contents will be used for a texture var texture = new THREE.Texture(canvas); texture.needsUpdate = true; var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 }); return spriteMaterial; } // ---------------------- INITIALIZING OBJECTS-------------------------------------- // --------------------------------------------------------------------------------- function init_object(obj) { if (obj.userData.hasOwnProperty("pointmaterial")) { init_points(obj); modelContains.points = true; } if (obj.userData.hasOwnProperty("pointlabels")) { init_pointlabels(obj); modelContains.pointlabels = true; } if (obj.userData.hasOwnProperty("edgematerial")) { init_lines(obj); modelContains.lines = true; } if (obj.userData.hasOwnProperty("edgelabels")) { init_edgelabels(obj); modelContains.edgelabels = true; } if (obj.userData.hasOwnProperty("arrowstyle")) { init_arrowheads(obj); modelContains.arrowheads = true; } if (obj.userData.hasOwnProperty("facetmaterial")) { init_faces(obj); modelContains.faces = true; } } function init_points(obj) { var pointgroup = new THREE.Group(); pointgroup.name = "points"; var points = obj.userData.points; var radii = obj.userData.pointradii; var materials = obj.userData.pointmaterial; var geometry,material; if (!Array.isArray(radii)) { geometry = new THREE.SphereBufferGeometry(radii); } if (!Array.isArray(materials)) { material = materials; } for (var i=0; i<points.length; i++) { var point = points[i]; if (Array.isArray(radii)) { if (radii[i] == 0) { continue; } geometry = new THREE.SphereBufferGeometry(radii[i]); } if (Array.isArray(materials)) { material = materials[i]; } var sphere = new THREE.Mesh(geometry, material); point.addSphere(sphere); pointgroup.add(sphere); } obj.add(pointgroup); } function init_pointlabels(obj) { var points = obj.userData.points; var labels = obj.userData.pointlabels; var pointlabels = new THREE.Group(); pointlabels.name = "pointlabels"; if (Array.isArray(labels)) { for (var i=0; i<points.length; i++) { var point = points[i]; var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<points.length; i++) { var point = points[i]; var sprite = new THREE.Sprite(spriteMaterial); point.addLabel(sprite); pointlabels.add(sprite); } } obj.add(pointlabels); } function init_lines(obj) { var edgeindices = obj.userData.edgeindices; var points = obj.userData.points; var materials = obj.userData.edgematerial; var geometry = new THREE.BufferGeometry(); var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 ); var geometry = new THREE.BufferGeometry(); geometry.setAttribute('position', bufattr); if (Array.isArray(materials)) { for (var i=0; i<materials.length; i++) { geometry.addGroup(2*i,2,i); } } var lines = new THREE.LineSegments(geometry, materials); lines.name = "lines"; obj.add(lines); updateEdgesPosition(obj); } function init_edgelabels(obj) { var points = obj.userData.points; var edgeindices = obj.userData.edgeindices; var labels = obj.userData.edgelabels; var edgelabels = new THREE.Group(); edgelabels.name = "edgelabels"; if (Array.isArray(labels)) { for (var i=0; i<edgeindices.length/2; i++) { var spriteMaterial = textSpriteMaterial( labels[i] ); var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } else { var spriteMaterial = textSpriteMaterial( labels ); for (var i=0; i<edgeindices.length/2; i++) { var sprite = new THREE.Sprite(spriteMaterial); sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5)); edgelabels.add(sprite); } } obj.add(edgelabels); } function init_arrowheads(obj) { var arrowheads = new THREE.Group(); arrowheads.name = "arrowheads"; var arrowstyle = obj.userData.arrowstyle; var edgeindices = obj.userData.edgeindices; var edgematerials = obj.userData.edgematerial; var points = obj.userData.points; var material; if (!Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials.color} ); } for (var i=0; i<edgeindices.length; i=i+2) { var start = points[edgeindices[i]]; var end = points[edgeindices[i+1]]; var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius(); if (dist <= 0) { continue; } var dir = new THREE.Vector3().subVectors(end.vector,start.vector); dir.normalize(); var axis = new THREE.Vector3().set(dir.z,0,-dir.x); axis.normalize(); var radians = Math.acos( dir.y ); var radius = dist/25; var height = dist/5; var geometry = new THREE.ConeBufferGeometry(radius,height); var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2)); if (Array.isArray(edgematerials)) { material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} ); } var cone = new THREE.Mesh( geometry, material ); cone.quaternion.setFromAxisAngle(axis,radians);; cone.position.copy(position);; arrowheads.add(cone); } obj.add(arrowheads); } function init_faces(obj) { var points = obj.userData.points; var facets = obj.userData.facets; obj.userData.triangleindices = []; for (var i=0; i<facets.length; i++) { facet = facets[i]; for (var t=0; t<facet.length-2; t++) { obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]); } } var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 ); var bufattr = new THREE.Float32BufferAttribute(bufarr,3); var materials = obj.userData.facetmaterial; var geometry = new THREE.BufferGeometry(); var frontmaterials = []; var backmaterials = []; geometry.setAttribute('position',bufattr); if (Array.isArray(materials)) { var tricount = 0; var facet; for (var i=0; i<facets.length; i++) { facet = facets[i]; geometry.addGroup(tricount,(facet.length-2)*3,i); tricount += (facet.length-2)*3; } for (var j=0; j<materials.length; j++) { var fmat = materials[j].clone() fmat.side = THREE.FrontSide; frontmaterials.push(fmat); var bmat = materials[j].clone() bmat.side = THREE.BackSide; backmaterials.push(bmat); obj.userData.facetmaterial = frontmaterials.concat(backmaterials); } } else if (materials instanceof THREE.Material) { frontmaterials = materials.clone() frontmaterials.side = THREE.FrontSide; backmaterials = materials.clone() backmaterials.side = THREE.BackSide; obj.userData.facetmaterial = [frontmaterials, backmaterials]; } // duplicating the object with front and back should avoid transparency issues var backmesh = new THREE.Mesh(geometry, backmaterials); // meshname is used to show/hide objects backmesh.name = "backfaces"; obj.add(backmesh); var frontmesh = new THREE.Mesh(geometry, frontmaterials); frontmesh.name = "frontfaces"; obj.add(frontmesh); updateFacesPosition(obj); } // //INITIALIZING function updateFacesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.triangleindices; var faces = obj.getObjectByName("frontfaces"); var ba = faces.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } faces.geometry.attributes.position.needsUpdate = true; } function updateEdgesPosition(obj) { var points = obj.userData.points; var indices = obj.userData.edgeindices; var lines = obj.getObjectByName("lines"); var ba = lines.geometry.getAttribute("position"); for (var i=0; i<indices.length; i++) { ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); } lines.geometry.attributes.position.needsUpdate = true; } function onWindowResize() { renderer.setSize( three.clientWidth, three.clientHeight ); svgRenderer.setSize( three.clientWidth, three.clientHeight ); updateCamera(); } function updateCamera() { var width = three.clientWidth; var height = three.clientHeight; var aspect = width / height; if (camera.type == "OrthographicCamera") { camera.left = frustumSize * aspect / - 2; camera.right = frustumSize * aspect / 2; camera.top = frustumSize / 2; camera.bottom = - frustumSize / 2; } else if (camera.type == "PerspectiveCamera") { camera.aspect = aspect; } camera.updateProjectionMatrix(); } function changeCamera(event) { var selindex = event.currentTarget.selectedIndex; camera = cameras[selindex]; control = controls[selindex]; control.enabled = true; for (var i=0; i<controls.length; i++) { if (i!=selindex) { controls[i].enabled = false; } } updateCamera(); } var camtypenode = document.getElementById('cameraType_9'); camtypenode.onchange = changeCamera; camtypenode.dispatchEvent(new Event('change')); onWindowResize(); window.addEventListener('resize', onWindowResize); var xRotationEnabled = false; var yRotationEnabled = false; var zRotationEnabled = false; var rotationSpeedFactor = 1; var settingsShown = false; var labelsShown = true; var intervals = []; var timeouts = []; var explodingSpeed = 0.05; var explodeScale = 0.000001; var XMLS = new XMLSerializer(); var svgElement; var renderId; var render = function () { renderId = requestAnimationFrame(render); // comment in for automatic explosion // explode(updateFactor()); var phi = 0.02 * rotationSpeedFactor; if (xRotationEnabled) { scene.rotation.x += phi; } if (yRotationEnabled) { scene.rotation.y += phi; } if (zRotationEnabled) { scene.rotation.z += phi; } control.update(); renderer.render(scene, camera); }; if ( THREE.WEBGL.isWebGLAvailable() ) { render(); } else { var warning = WEBGL.getWebGLErrorMessage(); three.appendChild( warning ); } function changeTransparency() { var opacity = 1-Number(event.currentTarget.value); for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].opacity = opacity; } } else { child.userData.facetmaterial.opacity = opacity; } } } } function toggleDepthWrite(event) { depthwrite = event.currentTarget.checked; for (var i=0; i<scene.children.length; i++) { child = scene.children[i]; if ( child.userData.hasOwnProperty("facetmaterial") ) { if (Array.isArray(child.userData.facetmaterial)) { for (var j=0; j<child.userData.facetmaterial.length; j++) { child.userData.facetmaterial[j].depthWrite = depthwrite; } } else { child.userData.facetmaterial.depthWrite = depthWrite; } } } } function changeRotationX(event){ xRotationEnabled = event.currentTarget.checked; } function changeRotationY(event){ yRotationEnabled = event.currentTarget.checked; } function changeRotationZ(event){ zRotationEnabled = event.currentTarget.checked; } function changeRotationSpeedFactor(event){ rotationSpeedFactor = Number(event.currentTarget.value); } function resetScene(){ scene.rotation.set(0,0,0); camera.position.set(0,0,5); camera.up.set(0,1,0); } function showSettings(event){ document.getElementById('settings_9').style.visibility = 'visible'; document.getElementById('showSettingsButton_9').style.visibility = 'hidden'; document.getElementById('hideSettingsButton_9').style.visibility = 'visible'; settingsShown = true; } function hideSettings(event){ document.getElementById('settings_9').style.visibility = 'hidden'; document.getElementById('showSettingsButton_9').style.visibility = 'visible'; document.getElementById('hideSettingsButton_9').style.visibility = 'hidden'; settingsShown = false; } var pos = 150* Math.PI; function updateFactor() { pos++; return Math.sin(.01*pos)+1; } // ------------------------ FOLDING ------------------------------------------------ // --------------------------------------------------------------------------------- // rotate point p around axis defined by points p1 and p2 by given angle function rotate(p, p1, p2, angle ){ angle = -angle; var x = p.x, y = p.y, z = p.z, a = p1.x, b = p1.y, c = p1.z, u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z; var result = []; var L = u*u + v*v + w*w; var sqrt = Math.sqrt; var cos = Math.cos; var sin = Math.sin; result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L; result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L; result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L; return result; } var fold = function(event){ var obj = foldables[Number(event.currentTarget.name)]; var foldvalue = Number(event.currentTarget.value); var scale = foldvalue - obj.userData.oldscale; for (var j=0; j<obj.userData.axes.length; j++) { rotateVertices(obj, j, scale); } update(obj); obj.userData.oldscale += scale; lookAtBarycenter(obj); } function lookAtBarycenter(obj){ control.target = barycenter(obj); } function barycenter(obj) { var center = new THREE.Vector3(0,0,0); var points = obj.userData.points; for (var i=0; i<points.length; i++){ center.add(points[i].vector); } center.divideScalar(points.length); return center; } function rotateVertices(obj, edge, scale) { var axes = obj.userData.axes; var subtrees = obj.userData.subtrees; var points = obj.userData.points; var angles = obj.userData.angles; if (edge < axes.length){ for (var j=0; j<subtrees[edge].length; j++){ var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge])); points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]); } } } function update(obj) { updateFacesPosition(obj); updateEdgesPosition(obj); } if (foldables.length) { var settings = document.getElementById('settings_9'); var foldDiv = document.createElement('div'); foldDiv.id = 'fold_9'; var title = document.createElement('strong'); title.innerHTML = 'Fold'; foldDiv.appendChild(title); foldDiv.className = 'group'; for (var i=0; i<foldables.length; i++) { var range = document.createElement('input'); range.type = 'range'; range.min = 0; range.max = 1; range.value = 0; range.step = 0.001; range.name = String(i); range.oninput = fold; foldDiv.appendChild(range); } lookAtBarycenter(foldables[0]); settings.insertBefore(foldDiv,settings.childNodes[0]); } // ---------------------- EXPLOSION ------------------------------------------------ // --------------------------------------------------------------------------------- if (explodableModel) { for (var i=0; i<scene.children.length; i++) { obj = scene.children[i]; if ( obj.userData.explodable ) { computeCentroid(obj); } } document.getElementById('explodeRange_9').oninput = triggerExplode; document.getElementById('explodeCheckbox_9').onchange = triggerAutomaticExplode; document.getElementById('explodingSpeedRange_9').oninput = setExplodingSpeed; explode(0.000001); } function computeCentroid(obj) { centroid = new THREE.Vector3(); obj.userData.points.forEach(function(pmpoint) { centroid.add(pmpoint.vector); }); centroid.divideScalar(obj.userData.points.length); obj.userData.centroid = centroid; } function explode(factor) { for (var i=0; i<scene.children.length; i++) { var obj = scene.children[i]; if (obj.userData.hasOwnProperty("centroid")) { var c = obj.userData.centroid; obj.position.set(c.x*factor, c.y*factor, c.z*factor); } } } function triggerExplode(event){ explodeScale = Number(event.currentTarget.value); explode(explodeScale); } function setExplodingSpeed(event){ explodingSpeed = Number(event.currentTarget.value); } function triggerAutomaticExplode(event){ if (event.currentTarget.checked){ startExploding(); } else { clearIntervals(); } } function startExploding(){ intervals.push(setInterval(explodingInterval, 25)); } function explodingInterval(){ explodeScale += explodingSpeed; if (explodeScale <= 6){ explode(explodeScale); } else{ explode(6); explodeScale = 6; clearIntervals(); timeouts.push(setTimeout(startUnexploding, 3000)); } document.getElementById('explodeRange_9').value = explodeScale; } function startUnexploding(){ intervals.push(setInterval(unexplodingInterval, 25)); } function unexplodingInterval(){ explodeScale -= explodingSpeed; if (explodeScale >= 0){ explode(explodeScale); } else { explode(0); explodeScale = 0; clearIntervals(); timeouts.push(setTimeout(startExploding, 3000)); } document.getElementById('explodeRange_9').value = explodeScale; } function clearIntervals(){ intervals.forEach(function(interval){ clearInterval(interval); }); intervals = []; timeouts.forEach(function(timeout){ clearTimeout(timeout); }); timeouts = []; } // ---------------------- DISPLAY -------------------------------------------------- // --------------------------------------------------------------------------------- const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" }; const objectTypeVisible = {}; Object.assign(objectTypeVisible,modelContains); const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort(); const shownObjectTypesList = document.getElementById('shownObjectTypesList_9'); function setVisibility(bool,objname) { for (var i=0; i<scene.children.length; i++){ var obj = scene.children[i].getObjectByName(objname); if (obj) { obj.visible = bool; } } } function toggleObjectTypeVisibility(event){ var name = event.currentTarget.name; var checked = event.currentTarget.checked; objectTypeVisible[name] = checked; if (name == "faces") { setVisibility(checked,"frontfaces"); setVisibility(checked,"backfaces"); } else { setVisibility(checked,name); } } for (var i=0; i<sortedObjectTypeKeys.length; i++){ var key = sortedObjectTypeKeys[i]; if (modelContains[key]) { var objTypeNode = document.createElement('span'); objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = key; checkbox.onchange = toggleObjectTypeVisibility; shownObjectTypesList.appendChild(checkbox); shownObjectTypesList.appendChild(objTypeNode); } } // ------------------------------------------------------ function toggleObjectVisibility(event){ var nr = Number(event.currentTarget.name); scene.children[nr].visible = event.currentTarget.checked; } // append checkboxes for displaying or hiding objects var shownObjectsList = document.getElementById('shownObjectsList_9'); for (var i=0; i<scene.children.length; i++){ obj = scene.children[i]; var objNode = document.createElement('span'); objNode.innerHTML = obj.name + '<br>'; var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = true; checkbox.name = String(i); checkbox.onchange = toggleObjectVisibility; shownObjectsList.appendChild(checkbox); shownObjectsList.appendChild(objNode); } // ---------------------- SVG ------------------------------------------------------ // --------------------------------------------------------------------------------- function takeSvgScreenshot() { if (objectTypeVisible["pointlabels"]) { setVisibility(false,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(false,"edgelabels"); } svgRenderer.render(scene,camera); svgElement = XMLS.serializeToString(svgRenderer.domElement); if (objectTypeVisible["pointlabels"]) { setVisibility(true,"pointlabels"); } if (objectTypeVisible["edgelabels"]) { setVisibility(true,"edgelabels"); } if (document.getElementById('tab_9').checked){ //show in new tab var myWindow = window.open("",""); myWindow.document.body.innerHTML = svgElement; } else{ // download svg file download("screenshot.svg", svgElement); } } function download(filename, text) { var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } document.getElementById('transparencyRange_9').oninput = changeTransparency; document.getElementById('depthWriteCheckbox_9').onchange = toggleDepthWrite; document.getElementById('changeRotationX_9').onchange = changeRotationX; document.getElementById('changeRotationY_9').onchange = changeRotationY; document.getElementById('changeRotationZ_9').onchange = changeRotationZ; document.getElementById('resetButton_9').onclick = resetScene; document.getElementById('rotationSpeedRange_9').oninput = changeRotationSpeedFactor; document.getElementById('takeScreenshot_9').onclick = takeSvgScreenshot; document.getElementById('showSettingsButton_9').onclick = showSettings; document.getElementById('hideSettingsButton_9').onclick = hideSettings; // ------------------ SHORTCUTS -------------------------------------------- // ------------------------------------------------------------------------- /** * http://www.openjs.com/scripts/events/keyboard_shortcuts/ * Version : 2.01.B * By Binny V A * License : BSD */ shortcut = { 'all_shortcuts':{},//All the shortcuts are stored in this array 'add': function(shortcut_combination,callback,opt) { //Provide a set of default options var default_options = { 'type':'keydown', 'propagate':false, 'disable_in_input':false, 'target':document, 'keycode':false } if(!opt) opt = default_options; else { for(var dfo in default_options) { if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo]; } } var ele = opt.target; if(typeof opt.target == 'string') ele = document.getElementById(opt.target); var ths = this; shortcut_combination = shortcut_combination.toLowerCase(); //The function to be called at keypress var func = function(e) { e = e || window.event; if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields var element; if(e.target) element=e.target; else if(e.srcElement) element=e.srcElement; if(element.nodeType==3) element=element.parentNode; if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return; } //Find Which key is pressed if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; var character = String.fromCharCode(code).toLowerCase(); if(code == 188) character=","; //If the user presses , when the type is onkeydown if(code == 190) character="."; //If the user presses , when the type is onkeydown var keys = shortcut_combination.split("+"); //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked var kp = 0; //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken var shift_nums = { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&", "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<", ".":">", "/":"?", "\\":"|" } //Special Keys - and their codes var special_keys = { 'esc':27, 'escape':27, 'tab':9, 'space':32, 'return':13, 'enter':13, 'backspace':8, 'scrolllock':145, 'scroll_lock':145, 'scroll':145, 'capslock':20, 'caps_lock':20, 'caps':20, 'numlock':144, 'num_lock':144, 'num':144, 'pause':19, 'break':19, 'insert':45, 'home':36, 'delete':46, 'end':35, 'pageup':33, 'page_up':33, 'pu':33, 'pagedown':34, 'page_down':34, 'pd':34, 'left':37, 'up':38, 'right':39, 'down':40, 'f1':112, 'f2':113, 'f3':114, 'f4':115, 'f5':116, 'f6':117, 'f7':118, 'f8':119, 'f9':120, 'f10':121, 'f11':122, 'f12':123 } var modifiers = { shift: { wanted:false, pressed:false}, ctrl : { wanted:false, pressed:false}, alt : { wanted:false, pressed:false}, meta : { wanted:false, pressed:false} //Meta is Mac specific }; if(e.ctrlKey) modifiers.ctrl.pressed = true; if(e.shiftKey) modifiers.shift.pressed = true; if(e.altKey) modifiers.alt.pressed = true; if(e.metaKey) modifiers.meta.pressed = true; for(var i=0; k=keys[i],i<keys.length; i++) { //Modifiers if(k == 'ctrl' || k == 'control') { kp++; modifiers.ctrl.wanted = true; } else if(k == 'shift') { kp++; modifiers.shift.wanted = true; } else if(k == 'alt') { kp++; modifiers.alt.wanted = true; } else if(k == 'meta') { kp++; modifiers.meta.wanted = true; } else if(k.length > 1) { //If it is a special key if(special_keys[k] == code) kp++; } else if(opt['keycode']) { if(opt['keycode'] == code) kp++; } else { //The special keys did not match if(character == k) kp++; else { if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase character = shift_nums[character]; if(character == k) kp++; } } } } if(kp == keys.length && modifiers.ctrl.pressed == modifiers.ctrl.wanted && modifiers.shift.pressed == modifiers.shift.wanted && modifiers.alt.pressed == modifiers.alt.wanted && modifiers.meta.pressed == modifiers.meta.wanted) { callback(e); if(!opt['propagate']) { //Stop the event //e.cancelBubble is supported by IE - this will kill the bubbling process. e.cancelBubble = true; e.returnValue = false; //e.stopPropagation works in Firefox. if (e.stopPropagation) { e.stopPropagation(); e.preventDefault(); } return false; } } } this.all_shortcuts[shortcut_combination] = { 'callback':func, 'target':ele, 'event': opt['type'] }; //Attach the function with the event if(ele.addEventListener) ele.addEventListener(opt['type'], func, false); else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func); else ele['on'+opt['type']] = func; }, //Remove the shortcut - just specify the shortcut and I will remove the binding 'remove':function(shortcut_combination) { shortcut_combination = shortcut_combination.toLowerCase(); var binding = this.all_shortcuts[shortcut_combination]; delete(this.all_shortcuts[shortcut_combination]) if(!binding) return; var type = binding['event']; var ele = binding['target']; var callback = binding['callback']; if(ele.detachEvent) ele.detachEvent('on'+type, callback); else if(ele.removeEventListener) ele.removeEventListener(type, callback, false); else ele['on'+type] = false; } } shortcut.add("Alt+Left",function() { var event = new Event('click'); if (settingsShown){ document.getElementById('hideSettingsButton_9').dispatchEvent(event); } else { document.getElementById('showSettingsButton_9').dispatchEvent(event); } }); // COMMON_CODE_BLOCK_END });}); </script> </body> </html> </HTML> user_guide/tutorials/release/4.11/hyperbolic_surface_tutorial.txt Last modified: 2023/11/06 10:57by 127.0.0.1