UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

124 lines (123 loc) 4.09 kB
import "../../../../echarts/lib/echarts.mjs"; import glmatrix from "../../../../claygl/src/glmatrix/index.mjs"; var vec3 = glmatrix.vec3; var vec2 = glmatrix.vec2; var normalize = vec3.normalize; var cross = vec3.cross; var sub = vec3.sub; var add = vec3.add; var create = vec3.create; var normal = create(); var tangent = create(); var bitangent = create(); var halfVector = create(); var coord0 = []; var coord1 = []; function getCubicPointsOnGlobe(coords, coordSys) { vec2.copy(coord0, coords[0]); vec2.copy(coord1, coords[1]); var pts = []; var p0 = pts[0] = create(); var p1 = pts[1] = create(); var p2 = pts[2] = create(); var p3 = pts[3] = create(); coordSys.dataToPoint(coord0, p0); coordSys.dataToPoint(coord1, p3); normalize(normal, p0); sub(tangent, p3, p0); normalize(tangent, tangent); cross(bitangent, tangent, normal); normalize(bitangent, bitangent); cross(tangent, normal, bitangent); add(p1, normal, tangent); normalize(p1, p1); normalize(normal, p3); sub(tangent, p0, p3); normalize(tangent, tangent); cross(bitangent, tangent, normal); normalize(bitangent, bitangent); cross(tangent, normal, bitangent); add(p2, normal, tangent); normalize(p2, p2); add(halfVector, p0, p3); normalize(halfVector, halfVector); var projDist = vec3.dot(p0, halfVector); var cosTheta = vec3.dot(halfVector, p1); var len = (Math.max(vec3.len(p0), vec3.len(p3)) - projDist) / cosTheta * 2; vec3.scaleAndAdd(p1, p0, p1, len); vec3.scaleAndAdd(p2, p3, p2, len); return pts; } function getCubicPointsOnPlane(coords, coordSys, up) { var pts = []; var p0 = pts[0] = vec3.create(); var p1 = pts[1] = vec3.create(); var p2 = pts[2] = vec3.create(); var p3 = pts[3] = vec3.create(); coordSys.dataToPoint(coords[0], p0); coordSys.dataToPoint(coords[1], p3); var len = vec3.dist(p0, p3); vec3.lerp(p1, p0, p3, 0.3); vec3.lerp(p2, p0, p3, 0.3); vec3.scaleAndAdd(p1, p1, up, Math.min(len * 0.1, 10)); vec3.scaleAndAdd(p2, p2, up, Math.min(len * 0.1, 10)); return pts; } function getPolylinePoints(coords, coordSys) { var pts = new Float32Array(coords.length * 3); var off = 0; var pt = []; for (var i = 0; i < coords.length; i++) { coordSys.dataToPoint(coords[i], pt); pts[off++] = pt[0]; pts[off++] = pt[1]; pts[off++] = pt[2]; } return pts; } function prepareCoords(data) { var coordsList = []; data.each(function(idx) { var itemModel = data.getItemModel(idx); var coords = itemModel.option instanceof Array ? itemModel.option : itemModel.getShallow("coords", true); coordsList.push(coords); }); return { coordsList }; } function layoutGlobe(seriesModel, coordSys) { var data = seriesModel.getData(); var isPolyline = seriesModel.get("polyline"); data.setLayout("lineType", isPolyline ? "polyline" : "cubicBezier"); var res = prepareCoords(data); data.each(function(idx) { var coords = res.coordsList[idx]; var getPointsMethod = isPolyline ? getPolylinePoints : getCubicPointsOnGlobe; data.setItemLayout(idx, getPointsMethod(coords, coordSys)); }); } function layoutOnPlane(seriesModel, coordSys, normal2) { var data = seriesModel.getData(); var isPolyline = seriesModel.get("polyline"); var res = prepareCoords(data); data.setLayout("lineType", isPolyline ? "polyline" : "cubicBezier"); data.each(function(idx) { var coords = res.coordsList[idx]; var pts = isPolyline ? getPolylinePoints(coords, coordSys) : getCubicPointsOnPlane(coords, coordSys, normal2); data.setItemLayout(idx, pts); }); } function lines3DLayout(ecModel, api) { ecModel.eachSeriesByType("lines3D", function(seriesModel) { var coordSys = seriesModel.coordinateSystem; if (coordSys.type === "globe") { layoutGlobe(seriesModel, coordSys); } else if (coordSys.type === "geo3D") { layoutOnPlane(seriesModel, coordSys, [0, 1, 0]); } else if (coordSys.type === "mapbox3D" || coordSys.type === "maptalks3D") { layoutOnPlane(seriesModel, coordSys, [0, 0, 1]); } }); } export { lines3DLayout as default };