cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
124 lines (123 loc) • 4.09 kB
JavaScript
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 };