UNPKG

bytev-charts-beta

Version:

基于echarts和JavaScript及ES6封装的一个可以直接调用的图表组件库,内置主题设计,简单快捷,且支持用户自定义配置; npm 安装方式: npm install bytev-charts 若启动提示还需额外install插件,则运行 npm install @babel/runtime-corejs2 即可;

300 lines (245 loc) 9.47 kB
import "core-js/modules/es.array.concat.js"; console.warn("THREE.SubdivisionModifier: As part of the transition to ES6 Modules, the files in 'examples/js' were deprecated in May 2020 (r117) and will be deleted in December 2020 (r124). You can find more information about developing using ES6 Modules in https://threejs.org/docs/#manual/en/introduction/Installation."); /** * Subdivision Geometry Modifier * using Loop Subdivision Scheme * * References: * http://graphics.stanford.edu/~mdfisher/subdivision.html * http://www.holmes3d.net/graphics/subdivision/ * http://www.cs.rutgers.edu/~decarlo/readings/subdiv-sg00c.pdf * * Known Issues: * - currently doesn't handle "Sharp Edges" */ THREE.SubdivisionModifier = function (subdivisions) { this.subdivisions = subdivisions === undefined ? 1 : subdivisions; }; // Applies the "modify" pattern THREE.SubdivisionModifier.prototype.modify = function (geometry) { if (geometry.isBufferGeometry) { geometry = new THREE.Geometry().fromBufferGeometry(geometry); } else { geometry = geometry.clone(); } geometry.mergeVertices(); var repeats = this.subdivisions; while (repeats-- > 0) { this.smooth(geometry); } geometry.computeFaceNormals(); geometry.computeVertexNormals(); return geometry; }; (function () { // Some constants var ABC = ['a', 'b', 'c']; function getEdge(a, b, map) { var vertexIndexA = Math.min(a, b); var vertexIndexB = Math.max(a, b); var key = vertexIndexA + "_" + vertexIndexB; return map[key]; } function processEdge(a, b, vertices, map, face, metaVertices) { var vertexIndexA = Math.min(a, b); var vertexIndexB = Math.max(a, b); var key = vertexIndexA + "_" + vertexIndexB; var edge; if (key in map) { edge = map[key]; } else { var vertexA = vertices[vertexIndexA]; var vertexB = vertices[vertexIndexB]; edge = { a: vertexA, // pointer reference b: vertexB, newEdge: null, // aIndex: a, // numbered reference // bIndex: b, faces: [] // pointers to face }; map[key] = edge; } edge.faces.push(face); metaVertices[a].edges.push(edge); metaVertices[b].edges.push(edge); } function generateLookups(vertices, faces, metaVertices, edges) { var i, il, face; for (i = 0, il = vertices.length; i < il; i++) { metaVertices[i] = { edges: [] }; } for (i = 0, il = faces.length; i < il; i++) { face = faces[i]; processEdge(face.a, face.b, vertices, edges, face, metaVertices); processEdge(face.b, face.c, vertices, edges, face, metaVertices); processEdge(face.c, face.a, vertices, edges, face, metaVertices); } } function newFace(newFaces, a, b, c, materialIndex) { newFaces.push(new THREE.Face3(a, b, c, undefined, undefined, materialIndex)); } function midpoint(a, b) { return Math.abs(b - a) / 2 + Math.min(a, b); } function newUv(newUvs, a, b, c) { newUvs.push([a.clone(), b.clone(), c.clone()]); } ///////////////////////////// // Performs one iteration of Subdivision THREE.SubdivisionModifier.prototype.smooth = function (geometry) { var tmp = new THREE.Vector3(); var oldVertices, oldFaces, oldUvs; var newVertices, newFaces, newUVs = []; var n, i, il, j, k; var metaVertices, sourceEdges; // new stuff. var sourceEdges, newEdgeVertices, newSourceVertices; oldVertices = geometry.vertices; // { x, y, z} oldFaces = geometry.faces; // { a: oldVertex1, b: oldVertex2, c: oldVertex3 } oldUvs = geometry.faceVertexUvs; var hasUvs = oldUvs[0] !== undefined && oldUvs[0].length > 0; if (hasUvs) { for (var j = 0; j < oldUvs.length; j++) { newUVs.push([]); } } /****************************************************** * * Step 0: Preprocess Geometry to Generate edges Lookup * *******************************************************/ metaVertices = new Array(oldVertices.length); sourceEdges = {}; // Edge => { oldVertex1, oldVertex2, faces[] } generateLookups(oldVertices, oldFaces, metaVertices, sourceEdges); /****************************************************** * * Step 1. * For each edge, create a new Edge Vertex, * then position it. * *******************************************************/ newEdgeVertices = []; var other, currentEdge, newEdge, face; var edgeVertexWeight, adjacentVertexWeight, connectedFaces; for (i in sourceEdges) { currentEdge = sourceEdges[i]; newEdge = new THREE.Vector3(); edgeVertexWeight = 3 / 8; adjacentVertexWeight = 1 / 8; connectedFaces = currentEdge.faces.length; // check how many linked faces. 2 should be correct. if (connectedFaces != 2) { // if length is not 2, handle condition edgeVertexWeight = 0.5; adjacentVertexWeight = 0; if (connectedFaces != 1) {// console.warn( 'Subdivision Modifier: Number of connected faces != 2, is: ', connectedFaces, currentEdge ); } } newEdge.addVectors(currentEdge.a, currentEdge.b).multiplyScalar(edgeVertexWeight); tmp.set(0, 0, 0); for (j = 0; j < connectedFaces; j++) { face = currentEdge.faces[j]; for (k = 0; k < 3; k++) { other = oldVertices[face[ABC[k]]]; if (other !== currentEdge.a && other !== currentEdge.b) break; } tmp.add(other); } tmp.multiplyScalar(adjacentVertexWeight); newEdge.add(tmp); currentEdge.newEdge = newEdgeVertices.length; newEdgeVertices.push(newEdge); // console.log(currentEdge, newEdge); } /****************************************************** * * Step 2. * Reposition each source vertices. * *******************************************************/ var beta, sourceVertexWeight, connectingVertexWeight; var connectingEdge, connectingEdges, oldVertex, newSourceVertex; newSourceVertices = []; for (i = 0, il = oldVertices.length; i < il; i++) { oldVertex = oldVertices[i]; // find all connecting edges (using lookupTable) connectingEdges = metaVertices[i].edges; n = connectingEdges.length; if (n == 3) { beta = 3 / 16; } else if (n > 3) { beta = 3 / (8 * n); // Warren's modified formula } // Loop's original beta formula // beta = 1 / n * ( 5/8 - Math.pow( 3/8 + 1/4 * Math.cos( 2 * Math. PI / n ), 2) ); sourceVertexWeight = 1 - n * beta; connectingVertexWeight = beta; if (n <= 2) { // crease and boundary rules // console.warn('crease and boundary rules'); if (n == 2) { // console.warn( '2 connecting edges', connectingEdges ); sourceVertexWeight = 3 / 4; connectingVertexWeight = 1 / 8; // sourceVertexWeight = 1; // connectingVertexWeight = 0; } else if (n == 1) {// console.warn( 'only 1 connecting edge' ); } else if (n == 0) {// console.warn( '0 connecting edges' ); } } newSourceVertex = oldVertex.clone().multiplyScalar(sourceVertexWeight); tmp.set(0, 0, 0); for (j = 0; j < n; j++) { connectingEdge = connectingEdges[j]; other = connectingEdge.a !== oldVertex ? connectingEdge.a : connectingEdge.b; tmp.add(other); } tmp.multiplyScalar(connectingVertexWeight); newSourceVertex.add(tmp); newSourceVertices.push(newSourceVertex); } /****************************************************** * * Step 3. * Generate Faces between source vertices * and edge vertices. * *******************************************************/ newVertices = newSourceVertices.concat(newEdgeVertices); var sl = newSourceVertices.length, edge1, edge2, edge3; newFaces = []; var uv, x0, x1, x2; var x3 = new THREE.Vector2(); var x4 = new THREE.Vector2(); var x5 = new THREE.Vector2(); for (i = 0, il = oldFaces.length; i < il; i++) { face = oldFaces[i]; // find the 3 new edges vertex of each old face edge1 = getEdge(face.a, face.b, sourceEdges).newEdge + sl; edge2 = getEdge(face.b, face.c, sourceEdges).newEdge + sl; edge3 = getEdge(face.c, face.a, sourceEdges).newEdge + sl; // create 4 faces. newFace(newFaces, edge1, edge2, edge3, face.materialIndex); newFace(newFaces, face.a, edge1, edge3, face.materialIndex); newFace(newFaces, face.b, edge2, edge1, face.materialIndex); newFace(newFaces, face.c, edge3, edge2, face.materialIndex); // create 4 new uv's if (hasUvs) { for (var j = 0; j < oldUvs.length; j++) { uv = oldUvs[j][i]; x0 = uv[0]; x1 = uv[1]; x2 = uv[2]; x3.set(midpoint(x0.x, x1.x), midpoint(x0.y, x1.y)); x4.set(midpoint(x1.x, x2.x), midpoint(x1.y, x2.y)); x5.set(midpoint(x0.x, x2.x), midpoint(x0.y, x2.y)); newUv(newUVs[j], x3, x4, x5); newUv(newUVs[j], x0, x3, x5); newUv(newUVs[j], x1, x4, x3); newUv(newUVs[j], x2, x5, x4); } } } // Overwrite old arrays geometry.vertices = newVertices; geometry.faces = newFaces; if (hasUvs) geometry.faceVertexUvs = newUVs; // console.log('done'); }; })();