UNPKG

@ued_fpi/data-visual

Version:

<br /> <br /> <div style="text-align:center"> <b style="font-size:30px">@ued_fpi/data-visual</b> <p>基于Vite4+TypeScript的Vue3大屏组件库开发框架</p> <img style="display:inline" src="https://img.shields.io/npm/v/@ued_fpi/data-visual" />

224 lines (219 loc) 6.23 kB
'use strict'; Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); require('vue'); const getPie3D = (pieData, internalDiameterRatio, distance, alpha, pieHeight, opacity = 1) => { const series = []; let sumValue = 0; let startValue = 0; let endValue = 0; let legendData = []; let legendBfb = []; const k = 1 - internalDiameterRatio; pieData.sort((a, b) => { return b.value - a.value; }); for (let i = 0; i < pieData.length; i++) { sumValue += pieData[i].value; const seriesItem = { name: typeof pieData[i].name === "undefined" ? `series${i}` : pieData[i].name, type: "surface", parametric: true, wireframe: { show: false }, pieData: pieData[i], pieStatus: { selected: false, hovered: false, k }, center: ["10%", "50%"], color: pieData[i].itemStyle.color, itemStyle: {}, parametricEquation: {} }; if (typeof pieData[i].itemStyle !== "undefined") { const itemStyle = {}; itemStyle.color = typeof pieData[i].itemStyle.color !== "undefined" ? pieData[i].itemStyle.color : opacity; itemStyle.opacity = typeof pieData[i].itemStyle.opacity !== "undefined" ? pieData[i].itemStyle.opacity : opacity; seriesItem.itemStyle = itemStyle; } series.push(seriesItem); } legendData = []; legendBfb = []; for (let i = 0; i < series.length; i++) { endValue = startValue + series[i].pieData.value; series[i].pieData.startRatio = startValue / sumValue; series[i].pieData.endRatio = endValue / sumValue; series[i].parametricEquation = getParametricEquation( series[i].pieData.startRatio, series[i].pieData.endRatio, false, false, k, series[i].pieData.value ); startValue = endValue; const bfb = fomatFloat(series[i].pieData.value / sumValue, 4); legendData.push({ name: series[i].name, value: bfb }); legendBfb.push({ name: series[i].name, value: bfb }); } const boxHeight = getHeight3D(series, pieHeight); const option = { legend: { show: false, data: legendData, orient: "vertical", left: 10, top: 10, itemGap: 10, textStyle: { color: "#A1E2FF" }, icon: "circle", formatter(param) { const item = legendBfb.filter((item2) => item2.name === param)[0]; const bfs = `${fomatFloat(item.value * 100, 2)}%`; return `${item.name} ${bfs}`; } }, labelLine: { show: true, lineStyle: { color: "#fff" } }, label: { show: true, position: "outside", formatter: "{b} \n{c} {d}%" }, tooltip: { backgroundColor: "#033b77", borderColor: "#21f2c4", textStyle: { color: "#fff", fontSize: 13 }, formatter: (params) => { if (params.seriesName !== "mouseoutSeries" && params.seriesName !== "pie2d") { const bfb = ((option.series[params.seriesIndex].pieData.endRatio - option.series[params.seriesIndex].pieData.startRatio) * 100).toFixed(2); return `${params.seriesName}<br/><span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${params.color};"></span>${bfb}%`; } } }, xAxis3D: { min: -1, max: 1 }, yAxis3D: { min: -1, max: 1 }, zAxis3D: { min: -1, max: 1 }, grid3D: { show: false, boxHeight, // 圆环的高度 viewControl: { // 3d效果可以放大、旋转等,请自己去查看官方配置 alpha, // 角度 distance, // 调整视角到主体的距离,类似调整zoom rotateSensitivity: 0, // 设置为0无法旋转 zoomSensitivity: 0, // 设置为0无法缩放 panSensitivity: 0, // 设置为0无法平移 autoRotate: false // 自动旋转 } }, series }; return option; }; const getParametricEquation = (startRatio, endRatio, isSelected, isHovered, k, h) => { const midRatio = (startRatio + endRatio) / 2; const startRadian = startRatio * Math.PI * 2; const endRadian = endRatio * Math.PI * 2; const midRadian = midRatio * Math.PI * 2; if (startRatio === 0 && endRatio === 1) isSelected = false; k = typeof k !== "undefined" ? k : 1 / 3; const offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0; const offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0; const hoverRate = isHovered ? 1.05 : 1; return { u: { min: -Math.PI, max: Math.PI * 3, step: Math.PI / 32 }, v: { min: 0, max: Math.PI * 2, step: Math.PI / 20 }, x(u, v) { if (u < startRadian) { return offsetX + Math.cos(startRadian) * (1 + Math.cos(v) * k) * hoverRate; } if (u > endRadian) { return offsetX + Math.cos(endRadian) * (1 + Math.cos(v) * k) * hoverRate; } return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate; }, y(u, v) { if (u < startRadian) { return offsetY + Math.sin(startRadian) * (1 + Math.cos(v) * k) * hoverRate; } if (u > endRadian) { return offsetY + Math.sin(endRadian) * (1 + Math.cos(v) * k) * hoverRate; } return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate; }, z(u, v) { if (u < -Math.PI * 0.5) return Math.sin(u); if (u > Math.PI * 2.5) return Math.sin(u) * h * 0.1; return Math.sin(v) > 0 ? 1 * h * 0.1 : -1; } }; }; const getHeight3D = (series, height) => { series.sort((a, b) => { return b.pieData.value - a.pieData.value; }); return height * 25 / series[0].pieData.value; }; const fomatFloat = (num, n) => { let f = parseFloat(num); if (isNaN(f)) return false; f = Math.round(num * 10 ** n) / 10 ** n; let s = f.toString(); let rs = s.indexOf("."); if (rs < 0) { rs = s.length; s += "."; } while (s.length <= rs + n) s += "0"; return s; }; exports.getParametricEquation = getParametricEquation; exports.getPie3D = getPie3D;