@syhr/dga-charts 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/dist/index.cjs +31 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1187 -1112
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +31 -23
- package/dist/index.umd.js.map +1 -1
- package/package.json +7 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils.js","../src/zones.js","../src/pentagon.js","../src/triangle.js","../src/three-ratio.js","../src/etra.js"],"sourcesContent":["/**\r\n * 通用事件总线\r\n */\r\nexport class EventBus {\r\n constructor() {\r\n this._h = Object.create(null);\r\n }\r\n on(ev, fn) {\r\n (this._h[ev] || (this._h[ev] = [])).push(fn);\r\n return this;\r\n }\r\n off(ev, fn) {\r\n if (!fn) {\r\n delete this._h[ev];\r\n return this;\r\n }\r\n if (this._h[ev]) this._h[ev] = this._h[ev].filter((f) => f !== fn);\r\n return this;\r\n }\r\n emit(ev, d) {\r\n (this._h[ev] || []).slice().forEach((fn) => fn(d));\r\n return this;\r\n }\r\n dispose() {\r\n this._h = Object.create(null);\r\n }\r\n}\r\n\r\n/**\r\n * 通用缩放和平移控制器\r\n */\r\nexport class ZoomController {\r\n constructor(cfg = {}) {\r\n this.zoom = 1;\r\n this.panX = 0;\r\n this.panY = 0;\r\n this._min = cfg.min ?? 0.3;\r\n this._max = cfg.max ?? 6;\r\n this._step = cfg.step ?? 0.12;\r\n this._dragging = false;\r\n this._dragStart = null;\r\n this._panStart = null;\r\n }\r\n onWheel(deltaY, ax, ay) {\r\n const dir = deltaY < 0 ? 1 : -1;\r\n const nz = Math.min(this._max, Math.max(this._min, this.zoom * (1 + dir * this._step)));\r\n const rat = nz / this.zoom;\r\n this.panX = ax - rat * (ax - this.panX);\r\n this.panY = ay - rat * (ay - this.panY);\r\n this.zoom = nz;\r\n return this;\r\n }\r\n startDrag(cx, cy) {\r\n this._dragging = true;\r\n this._dragStart = { x: cx, y: cy };\r\n this._panStart = { x: this.panX, y: this.panY };\r\n }\r\n moveDrag(cx, cy, scale) {\r\n if (!this._dragging) return false;\r\n this.panX = this._panStart.x + (cx - this._dragStart.x) * scale;\r\n this.panY = this._panStart.y + (cy - this._dragStart.y) * scale;\r\n return true;\r\n }\r\n endDrag() {\r\n const was = this._dragging;\r\n this._dragging = false;\r\n return was;\r\n }\r\n reset() {\r\n this.zoom = 1;\r\n this.panX = 0;\r\n this.panY = 0;\r\n return this;\r\n }\r\n get isDragging() {\r\n return this._dragging;\r\n }\r\n get state() {\r\n return { zoom: this.zoom, panX: this.panX, panY: this.panY };\r\n }\r\n applyTransform(ctx) {\r\n ctx.translate(this.panX, this.panY);\r\n ctx.scale(this.zoom, this.zoom);\r\n }\r\n}\r\n\r\n/**\r\n * 将 hex 颜色转换为 rgba\r\n * @param {string} hex \r\n * @param {number} alpha \r\n * @returns {string}\r\n */\r\nexport function hexToRgba(hex, alpha) {\r\n const h = hex.replace('#', '');\r\n const r = parseInt(h.slice(0, 2), 16);\r\n const g = parseInt(h.slice(2, 4), 16);\r\n const b = parseInt(h.slice(4, 6), 16);\r\n return `rgba(${r},${g},${b},${alpha})`;\r\n}\r\n\r\n/**\r\n * 深度合并对象\r\n * @param {object} target \r\n * @param {object} source \r\n * @returns {object}\r\n */\r\nexport function deepMerge(target, source) {\r\n for (const k of Object.keys(source)) {\r\n const sv = source[k];\r\n if (sv !== null && typeof sv === 'object' && !Array.isArray(sv)) {\r\n target[k] = target[k] && typeof target[k] === 'object' ? target[k] : {};\r\n deepMerge(target[k], sv);\r\n } else {\r\n target[k] = sv;\r\n }\r\n }\r\n return target;\r\n}\r\n\r\n/**\r\n * 射线法判断点是否在多边形内\r\n * @param {number} px \r\n * @param {number} py \r\n * @param {number[][]} poly \r\n * @returns {boolean}\r\n */\r\nexport function inPoly(px, py, poly) {\r\n let inside = false;\r\n for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\r\n const [xi, yi] = poly[i],\r\n [xj, yj] = poly[j];\r\n if (yi > py !== yj > py && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi) inside = !inside;\r\n }\r\n return inside;\r\n}\r\n\r\n/**\r\n * 通用 DOM 悬浮提示框\r\n */\r\nexport class DOMTooltip {\r\n constructor(container, theme) {\r\n this.container = container;\r\n this.el = document.createElement('div');\r\n this.el.style.position = 'absolute';\r\n this.el.style.pointerEvents = 'none';\r\n this.el.style.display = 'none';\r\n this.el.style.zIndex = '9999';\r\n this.el.style.transition = 'left 0.1s, top 0.1s';\r\n \r\n // 确保容器至少有 relative 定位\r\n const compStyle = window.getComputedStyle(container);\r\n if (compStyle.position === 'static') {\r\n container.style.position = 'relative';\r\n }\r\n \r\n container.appendChild(this.el);\r\n this.updateTheme(theme);\r\n }\r\n\r\n updateTheme(theme) {\r\n if (!theme) return;\r\n const tt = theme.tooltip || {};\r\n const textStyle = tt.textStyle || {};\r\n this.el.style.backgroundColor = tt.backgroundColor || theme.tooltipBg || 'rgba(6,13,31,0.93)';\r\n this.el.style.color = textStyle.color || theme.tooltipTextColor || '#c8ddf0';\r\n\r\n let padding = tt.padding !== undefined ? tt.padding : (theme.tooltipPadding || 10);\r\n if (typeof padding === 'number') {\r\n this.el.style.padding = `${padding}px`;\r\n } else if (Array.isArray(padding)) {\r\n this.el.style.padding = padding.map(p => `${p}px`).join(' ');\r\n } else {\r\n this.el.style.padding = padding + 'px';\r\n }\r\n\r\n this.el.style.borderRadius = '5px';\r\n this.el.style.border = `1px solid ${theme.zoneBorderColor || 'rgba(255,255,255,0.25)'}`;\r\n this.el.style.boxShadow = '0 0 10px rgba(0,0,0,0.45)';\r\n this.el.style.fontFamily = theme.fontFamily || 'Rajdhani, sans-serif';\r\n this.el.style.fontSize = textStyle.fontSize !== undefined ? (typeof textStyle.fontSize === 'number' ? `${textStyle.fontSize}px` : textStyle.fontSize) : '12px';\r\n }\r\n\r\n show(html, x, y, tooltipOpt = {}, theme = {}, zone = null) {\r\n this.el.innerHTML = html;\r\n this.el.style.display = 'block';\r\n\r\n // 1. 背景色\r\n this.el.style.backgroundColor = tooltipOpt.backgroundColor || theme.tooltipBg || 'rgba(6,13,31,0.93)';\r\n\r\n // 2. 边框\r\n const bw = tooltipOpt.borderWidth !== undefined ? (typeof tooltipOpt.borderWidth === 'number' ? `${tooltipOpt.borderWidth}px` : tooltipOpt.borderWidth) : '1px';\r\n const bc = tooltipOpt.borderColor || (zone ? zone.borderColor || theme.zoneBorderColor || zone.color : 'rgba(255,255,255,0.25)');\r\n this.el.style.border = `${bw} solid ${bc}`;\r\n\r\n // 3. 内边距\r\n if (tooltipOpt.padding !== undefined) {\r\n if (typeof tooltipOpt.padding === 'number') {\r\n this.el.style.padding = `${tooltipOpt.padding}px`;\r\n } else if (Array.isArray(tooltipOpt.padding)) {\r\n this.el.style.padding = tooltipOpt.padding.map(p => `${p}px`).join(' ');\r\n } else {\r\n this.el.style.padding = tooltipOpt.padding;\r\n }\r\n } else {\r\n this.el.style.padding = (theme.tooltipPadding || 10) + 'px';\r\n }\r\n\r\n // 4. 文字样式\r\n const textStyle = tooltipOpt.textStyle || {};\r\n this.el.style.color = textStyle.color || theme.tooltipTextColor || '#c8ddf0';\r\n this.el.style.fontStyle = textStyle.fontStyle || '';\r\n this.el.style.fontWeight = textStyle.fontWeight || textStyle.fontStyle || '';\r\n this.el.style.fontSize = textStyle.fontSize !== undefined ? (typeof textStyle.fontSize === 'number' ? `${textStyle.fontSize}px` : textStyle.fontSize) : '12px';\r\n this.el.style.fontFamily = theme.fontFamily || 'Rajdhani, sans-serif';\r\n\r\n // 简单边缘检测\r\n const rect = this.container.getBoundingClientRect();\r\n const tw = this.el.offsetWidth;\r\n const th = this.el.offsetHeight;\r\n\r\n let left = x + 15;\r\n let top = y - th / 2;\r\n\r\n if (left + tw > rect.width) {\r\n left = x - tw - 15;\r\n }\r\n if (top < 0) top = 0;\r\n if (top + th > rect.height) top = rect.height - th;\r\n\r\n this.el.style.left = left + 'px';\r\n this.el.style.top = top + 'px';\r\n }\r\n\r\n hide() {\r\n this.el.style.display = 'none';\r\n }\r\n\r\n dispose() {\r\n if (this.el && this.el.parentNode) {\r\n this.el.parentNode.removeChild(this.el);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 解析 ECharts 风格的 grid 边距模型\r\n * 支持数值 (像素) 和字符串百分比 (如 '10%')\r\n */\r\nexport function parseGridBox(W, H, grid = {}, defaultPadding = 45) {\r\n const parse = (val, max, def) => {\r\n if (val === undefined || val === null) return def;\r\n if (typeof val === 'string' && val.endsWith('%')) return (parseFloat(val) / 100) * max;\r\n return parseFloat(val) || 0;\r\n };\r\n\r\n const left = parse(grid.left, W, defaultPadding);\r\n const right = parse(grid.right, W, defaultPadding);\r\n const top = parse(grid.top, H, defaultPadding);\r\n const bottom = parse(grid.bottom, H, defaultPadding);\r\n\r\n const availW = Math.max(0, W - left - right);\r\n const availH = Math.max(0, H - top - bottom);\r\n const cx = left + availW / 2;\r\n const cy = top + availH / 2;\r\n\r\n return { left, right, top, bottom, availW, availH, cx, cy };\r\n}\r\n\r\n/**\r\n * 绘制各种形状的数据点路径\r\n * 支持: circle, ring, star, triangle, diamond, square, rect\r\n */\r\nexport function drawShapePath(ctx, px, py, shape, size, scale = 1, offset = 0) {\r\n const radius = (size + offset) * scale;\r\n\r\n if (shape === 'circle' || shape === 'ring') {\r\n ctx.arc(px, py, radius, 0, Math.PI * 2);\r\n } else if (shape === 'star') {\r\n const inn = radius * 0.42;\r\n for (let k = 0; k < 10; k++) {\r\n const a = (k * Math.PI) / 5 - Math.PI / 2;\r\n const r = k % 2 === 0 ? radius : inn;\r\n k === 0\r\n ? ctx.moveTo(px + r * Math.cos(a), py + r * Math.sin(a))\r\n : ctx.lineTo(px + r * Math.cos(a), py + r * Math.sin(a));\r\n }\r\n ctx.closePath();\r\n } else if (shape === 'triangle') {\r\n for (let i = 0; i < 3; i++) {\r\n const a = -Math.PI / 2 + (i * 2 * Math.PI) / 3;\r\n const x = px + radius * Math.cos(a);\r\n const y = py + radius * Math.sin(a);\r\n i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\r\n }\r\n ctx.closePath();\r\n } else if (shape === 'diamond') {\r\n ctx.moveTo(px, py - radius);\r\n ctx.lineTo(px + radius, py);\r\n ctx.lineTo(px, py + radius);\r\n ctx.lineTo(px - radius, py);\r\n ctx.closePath();\r\n } else if (shape === 'square' || shape === 'rect') {\r\n const side = (size + offset) * 2 * scale;\r\n const rx = px - side / 2;\r\n const ry = py - side / 2;\r\n ctx.rect(rx, ry, side, side);\r\n } else {\r\n ctx.arc(px, py, radius, 0, Math.PI * 2);\r\n }\r\n}\r\n","export const TRIANGLE_ZONES_1 = [\n {\n id: 'PD', name: 'PD', desc: '局部放电', color: '#A0DC99', labelColor: '#1a4a1a',\n points: [[1, 0, 0], [0.95, 0.05, 0], [0.95, 0, 0.05]]\n },\n {\n id: 'D1', name: 'D1', desc: '低能放电', color: '#77A3FC', labelColor: '#ffffff',\n points: [[0.85, 0.15, 0], [0, 1, 0], [0, 0.75, 0.25], [0.6, 0.15, 0.25]]\n },\n {\n id: 'D2', name: 'D2', desc: '高能放电', color: '#E3F2FF', labelColor: '#1a3a6c',\n points: [[0, 0.75, 0.25], [0, 0.28, 0.72], [0.32, 0.28, 0.40], [0.45, 0.15, 0.40], [0.6, 0.15, 0.25]]\n },\n {\n id: 'T1', name: 'T1', desc: '热故障 < 300°C', color: '#CBE4FD', labelColor: '#1a2a6c',\n points: [[0.95, 0.05, 0], [0.85, 0.05, 0.1], [0.9, 0, 0.1], [0.95, 0, 0.05]]\n },\n {\n id: 'T2', name: 'T2', desc: '热故障 300 ~ 700°C', color: '#56AD4A', labelColor: '#e8ffe0',\n points: [[0.85, 0.05, 0.1], [0.45, 0.05, 0.50], [0.5, 0, 0.5], [0.9, 0, 0.1]]\n },\n {\n id: 'T3', name: 'T3', desc: '热故障 > 700°C', color: '#5490FF', labelColor: '#e0eeff',\n points: [[0.5, 0, 0.5], [0.35, 0.15, 0.50], [0, 0.15, 0.85], [0, 0, 1]]\n },\n {\n id: 'DT', name: 'DT', desc: '混合故障(放电+热)', color: '#313CFF', labelColor: '#c8d8ff',\n points: [[0.95, 0.05, 0], [0.85, 0.15, 0], [0.45, 0.15, 0.40], [0.32, 0.28, 0.40], [0, 0.28, 0.72], [0, 0.15, 0.85], [0.35, 0.15, 0.50], [0.45, 0.05, 0.50]]\n },\n];\n\nexport const TRIANGLE_ZONES_4 = [\n {\n id: 'PD', name: 'PD', desc: '电晕型局部放电', color: '#A0DC99', labelColor: '#1a4a1a',\n points: [[0.975, 0, 0.025], [0.955, 0.02, 0.025], [0.83, 0.02, 0.15], [0.85, 0, 0.15]]\n },\n {\n id: 'S', name: 'S', desc: '温度<200℃时的杂散气体', color: '#313CFF', labelColor: '#c8d8ff',\n points: [[1, 0, 0], [0.45, 0.55, 0], [0.08, 0.52, 0.40], [0.08, 0.30, 0.62], [0.15, 0.30, 0.55], [0.15, 0.25, 0.60], [0.4, 0.25, 0.35], [0.65, 0, 0.35], [0.85, 0, 0.15], [0.83, 0.02, 0.15], [0.955, 0.02, 0.025], [0.975, 0, 0.025]]\n },\n {\n id: 'C', name: 'C', desc: '绝缘纸可能碳化', color: '#3587FF', labelColor: '#ffffff',\n points: [[0.65, 0, 0.35], [0.4, 0.25, 0.35], [0.15, 0.25, 0.60], [0.15, 0.30, 0.55], [0, 0.3, 0.7], [0, 0, 1]]\n },\n {\n id: 'O', name: 'O', desc: '过热温度<250℃,绝缘纸不碳化', color: '#6AA4FF', labelColor: '#c8d8ff',\n points: [[0.08, 0.92, 0], [0, 1, 0], [0, 0.3, 0.7], [0.08, 0.3, 0.62]]\n },\n {\n id: 'ND', name: 'ND', desc: '未确定', color: '#BEE1FD', labelColor: '#1a2a6c',\n points: [[0.45, 0.55, 0], [0.08, 0.92, 0], [0.08, 0.52, 0.40],]\n },\n];\n\nexport const TRIANGLE_ZONES_5 = [\n {\n id: 'PD', name: 'PD', desc: '电晕型局部放电', color: '#A0DC99', labelColor: '#1a4a1a',\n points: [[0.85, 0.15, 0], [0.83, 0.15, 0.02], [0.96, 0.02, 0.02], [0.98, 0.02, 0]]\n },\n {\n id: 'T2', name: 'T2', desc: '中温过热 (300~700℃)', color: '#56AD4A', labelColor: '#1a4a1a',\n points: [[0.9, 0, 0.1], [0.65, 0, 0.35], [0.525, 0.125, 0.35], [0.775, 0.125, 0.1]]\n },\n\n {\n id: 'S', name: 'S', desc: '温度<200℃时的杂散气体', color: '#313CFF', labelColor: '#c8d8ff',\n points: [[0.85, 0.15, 0], [0.35, 0.65, 0], [0.25, 0.65, 0.1], [0.75, 0.15, 0.1],]\n },\n {\n id: 'C', name: 'C', desc: '绝缘纸可能碳化', color: '#3587FF', labelColor: '#ffffff',\n points: [[0.6, 0.3, 0.1], [0, 0.3, 0.7], [0.15, 0.15, 0.7], [0.35, 0.15, 0.5], [0.375, 0.125, 0.5], [0.775, 0.125, 0.1]]\n },\n {\n id: 'O', name: 'O', desc: '过热', color: '#6AA4FF', labelColor: '#1a3a6c',\n points: [[1, 0, 0], [0.98, 0.02, 0], [0.96, 0.02, 0.02], [0.83, 0.15, 0.02], [0.85, 0.15, 0], [0, 1, 0], [0, 0.9, 0.1], [0.35, 0.55, 0.1], [0.45, 0.55, 0], [0.85, 0.15, 0], [0.75, 0.15, 0.1], [0.9, 0, 0.1]]\n },\n {\n id: 'T3-H', name: 'T3-H', desc: '仅矿物油过热', color: '#77A3FC', labelColor: '#ffffff',\n points: [[0.35, 0.3, 0.35], [0, 0.65, 0.35], [0, 0, 1], [0.65, 0, 0.35], [0.525, 0.125, 0.35], [0.375, 0.125, 0.5], [0.35, 0.15, 0.5], [0.15, 0.15, 0.7], [0, 0.3, 0.7]],\n labelAt: [0.1, 0.42, 0.48]\n },\n {\n id: 'ND', name: 'ND', desc: '未确定', color: '#E3F2FF', labelColor: '#1a3a6c',\n points: [[0.6, 0.3, 0.1], [0, 0.9, 0.1], [0, 0.65, 0.35], [0.35, 0.3, 0.35]]\n },\n];\n\nexport const PENTAGON_ZONES_1 = [\n {\n name: 'PD',\n title: '电晕型局部放电',\n color: '#A0DC99',\n desc: '电晕型局部放电',\n poly: [\n [0, 33],\n [-1, 33],\n [-1, 24.5],\n [0, 24.5],\n ],\n },\n {\n name: 'D1',\n title: '低能量放电或火花型局部放电',\n color: '#81ADFF',\n desc: '低能量放电或火花型局部放电',\n poly: [\n [0, 40],\n [38, 12],\n [32, -6.1],\n [4, 16],\n [0, 1.5],\n ],\n },\n {\n name: 'D2',\n title: '高能量放电',\n color: '#E3F2FF',\n desc: '高能量放电',\n poly: [\n [4, 16],\n [32, -6.1],\n [24.3, -30],\n [0, -3],\n [0, 1.5],\n ],\n },\n {\n name: 'T3',\n title: '过热故障,t>700℃',\n color: '#5490FF',\n desc: '过热故障,t>700℃',\n poly: [\n [0, -3],\n [24.3, -30],\n [23.5, -32.4],\n [1, -32.4],\n [-6, -4],\n ],\n },\n {\n name: 'T2',\n title: '过热故障,300℃<t<700℃',\n color: '#56AD4A',\n desc: '中温热故障,铁心或铜导体局部过热,C₂H₄+CH₄ 均较高',\n poly: [\n [-6, -4],\n [1, -32.4],\n [-22.5, -32.4],\n ],\n },\n {\n name: 'T1',\n title: '过热故障,t<300℃',\n color: '#CBE4FD',\n desc: '低温热故障(<300°C),CH₄+C₂H₆ 为主要特征气体',\n poly: [\n [-6, -4],\n [-22.5, -32.4],\n [-23.5, -32.4],\n [-35, 3],\n [0, 1.5],\n [0, -3],\n ],\n },\n {\n name: 'S',\n title: '温度<200℃时的杂散气体',\n color: '#2735FF',\n desc: '温度<200℃时的杂散气体',\n poly: [\n [0, 1.5],\n [-35, 3.1],\n [-38, 12.4],\n [0, 40],\n [0, 33],\n [-1, 33],\n [-1, 24.5],\n [0, 24.5],\n ],\n },\n];\n\nexport const PENTAGON_ZONES_2 = [\n {\n \"name\": \"PD\",\n \"title\": \"电晕型局部放电\",\n \"color\": \"#A0DC99\",\n \"desc\": \"内部局部放电,H₂ 占比 >93%\",\n \"poly\": [\n [0, 33],\n [-1, 33],\n [-1, 24.5],\n [0, 24.5]\n ]\n },\n {\n \"name\": \"D1\",\n \"title\": \"低能量放电或火花型局部放电\",\n \"color\": \"#81ADFF\",\n \"desc\": \"低能量火花放电,绕组匝间短路早期,H₂+C₂H₂ 较高\",\n \"poly\": [\n [0, 40],\n [38, 12],\n [32, -6.1],\n [4, 16],\n [0, 1.5]\n ]\n },\n {\n \"name\": \"D2\",\n \"title\": \"高能量放电\",\n \"color\": \"#E3F2FF\",\n \"desc\": \"高能量电弧放电,严重绝缘故障,C₂H₂ 占比高\",\n \"poly\": [\n [4, 16],\n [32, -6.1],\n [24.3, -30],\n [0, -3],\n [0, 1.5]\n ]\n },\n {\n \"name\": \"S\",\n \"title\": \"温度<200℃时的杂散气体\",\n \"color\": \"#2735FF\",\n \"desc\": \"温度<200℃时的杂散气体\",\n \"poly\": [\n [0, 1.5],\n [-35, 3.1],\n [-38, 12.4],\n [0, 40],\n [0, 33],\n [-1, 33],\n [-1, 24.5],\n [0, 24.5]\n ]\n },\n {\n \"name\": \"T3-H\",\n \"title\": \"——仅矿物油过热\",\n \"color\": \"#25A53D\",\n \"desc\": \"700℃以上高温过热,C₂H₄ 占比高,总烃快速增长\",\n \"poly\": [\n [0, -3],\n [24.3, -30],\n [23.5, -32.4],\n [2.5, -32.4],\n [-3.5, -3]\n ]\n },\n {\n \"name\": \"C\",\n \"title\": \"绝缘纸可能碳化\",\n \"color\": \"#3587FF\",\n \"desc\": \"绝缘纸可能碳化\",\n \"poly\": [\n [-3.5, -3],\n [2.5, -32.4],\n [-21.5, -32.4],\n [-11, -8]\n ]\n },\n {\n \"name\": \"O\",\n \"title\": \"过热温度<250℃,绝缘纸不碳化\",\n \"color\": \"#6AA4FF\",\n \"desc\": \"过热温度<250℃,绝缘纸不碳化\",\n \"poly\": [\n [-3.5, -3],\n [-11, -8],\n [-21.5, -32.4],\n [-23.5, -32.4],\n [-35, 3.1],\n [0, 1.5],\n [0, -3]\n ]\n }\n];\n\nexport const ETRA_ZONES_A = [\n {\n name: 'D1/PD', title: '局部放电',\n color: 'rgba(56,139,253,0.22)',\n labelColor: 'rgba(56,139,253,0.9)',\n poly: [[-2, 3], [3, 3], [3, 0], [-2, 0]] // Y >= 1 (logY >= 0), full X\n },\n {\n name: 'T3/DT', title: '高温热故障/放电+热',\n color: 'rgba(63,185,80,0.18)',\n labelColor: 'rgba(63,185,80,0.9)',\n poly: [[-2, 0], [3, 0], [3, -2], [-2, -2]] // -2 <= logY <= 0, full X\n },\n {\n name: 'T1', title: '过热故障,t<300℃',\n color: 'rgba(250,199,75,0.22)',\n labelColor: 'rgba(250,199,75,0.9)',\n poly: [[-2, -2], [0, -2], [0, -3], [-2, -3]]\n },\n {\n name: 'T2', title: '过热故障,300℃<t<700℃',\n color: 'rgba(240,120,60,0.25)',\n labelColor: 'rgba(240,120,60,0.9)',\n poly: [[0, -2], [0.4, -2], [0.4, -3], [0, -3]]\n },\n {\n name: 'T3', title: '过热故障,t>700℃',\n color: 'rgba(46,160,67,0.22)',\n labelColor: 'rgba(46,160,67,0.9)',\n poly: [[0.4, -2], [3, -2], [3, -3], [0.4, -3]]\n }\n];\n\nexport const ETRA_ZONES_B = [\n {\n name: 'D2', title: '高能放电',\n color: 'rgba(56,139,253,0.28)',\n labelColor: 'rgba(100,180,255,0.95)',\n // Y >= 10 AND X >= 10 → logY>=1, logX>=1\n poly: [[-2, 3], [3, 3], [3, 0], [1, 0], [1, 1], [-2, 1]]\n },\n {\n name: 'D1', title: '低能放电',\n color: 'rgba(56,139,253,0.15)',\n labelColor: 'rgba(130,190,255,0.85)',\n // L-shape: Y>=1 AND X<10\n // = (logY in [0,3], logX in [-2,1])\n poly: [[-2, 1], [1, 1], [1, 0], [-2, 0]]\n },\n {\n name: 'PD', title: '局部放电',\n color: 'rgba(63,185,80,0.18)',\n labelColor: 'rgba(63,185,80,0.9)',\n poly: [[-2, 0], [0, 0], [0, -2], [-2, -2]]\n },\n {\n name: 'T3/DT', title: '高温热/放电+热',\n color: 'rgba(250,199,75,0.18)',\n labelColor: 'rgba(250,199,75,0.9)',\n poly: [[0, 0], [3, 0], [3, -2], [0, -2]]\n },\n {\n name: 'T1', title: '过热故障,t<300℃',\n color: 'rgba(250,199,75,0.22)',\n labelColor: 'rgba(250,199,75,0.9)',\n poly: [[-2, -2], [0, -2], [0, -3], [-2, -3]]\n },\n {\n name: 'T2', title: '过热故障,300℃<t<700℃',\n color: 'rgba(240,120,60,0.25)',\n labelColor: 'rgba(240,120,60,0.9)',\n poly: [[0, -2], [0.4, -2], [0.4, -3], [0, -3]]\n },\n {\n name: 'T3', title: '过热故障,t>700℃',\n color: 'rgba(46,160,67,0.22)',\n labelColor: 'rgba(46,160,67,0.9)',\n poly: [[0.4, -2], [3, -2], [3, -3], [0.4, -3]]\n }\n];\nexport const THREE_RADIO_ZONES = [\n {\n name: 'PD', title: '电晕型局部放电',\n fill: '#09FAFF', edgeColor: '#09FAFF',\n p1: [0, 0, 0], // 开始坐标点\n p2: [0.2, 0.1, 0.01], // 结束坐标点\n },\n {\n name: 'T1', title: '过热故障,t<300℃',\n fill: '#EC9B9A', edgeColor: '#EC9B9A',\n p1: [0, 1, 0],\n p2: [1, 10, 0.01],\n },\n {\n name: 'T2', title: '过热故障,300℃<t<700℃',\n fill: '#A0C9F5', edgeColor: '#A0C9F5',\n p1: [1, 1, 0],\n p2: [4, 10, 0.1],\n },\n {\n name: 'T3', title: '过热故障,t>700℃',\n fill: '#CA677B', edgeColor: '#CA677B',\n p1: [4, 1, 0],\n p2: [10, 10, 0.2],\n },\n {\n name: 'D1', title: '低能量放电火花型局部放电',\n fill: '#FF7B16', edgeColor: '#FF7B16',\n p1: [1, 0.1, 1],\n p2: [10, 0.5, 10],\n },\n {\n name: 'D2', title: '高能量放电',\n fill: '#48FF16', edgeColor: '#48FF16',\n p1: [2, 0.1, 0.6],\n p2: [10, 1, 2.5],\n },\n];\nexport function computedPercent(values) {\n if (!Array.isArray(values)) return [];\n const nums = values.map(v => Math.max(Number(v) || 0, 0));\n const total = nums.reduce((sum, n) => sum + n, 0);\n if (total === 0) return nums.map(() => 0);\n return nums.map(n => {\n const pct = (n / total) * 100;\n return Math.round(pct * 100) / 100;\n });\n}\n\nfunction _pentagonRatioToDoc(H2, C2H2, C2H4, CH4, C2H6) {\n const vals = [H2, C2H2, C2H4, CH4, C2H6].map(v => Math.max(0, Number(v) || 0));\n const total = vals.reduce((s, v) => s + v, 0);\n if (total <= 0) return null;\n const ratio = vals.map(v => v / total);\n const R = 40;\n const angles = [90, 18, -54, -126, 162];\n let x = 0, y = 0;\n for (let i = 0; i < 5; i++) {\n const a = angles[i] * Math.PI / 180;\n x += ratio[i] * R * Math.cos(a);\n y += ratio[i] * R * Math.sin(a);\n }\n return { x, y, ratio };\n}\n\nfunction _inPentagonPoly(px, py, poly) {\n let inside = false;\n for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n const [xi, yi] = poly[i], [xj, yj] = poly[j];\n if ((yi > py) !== (yj > py) && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi) {\n inside = !inside;\n }\n }\n return inside;\n}\n\nexport const DiagnosticTools = {\n duvalTriangle1: (CH4, C2H4, C2H2) => {\n const total = CH4 + C2H4 + C2H2;\n if (total <= 0) return { code: \"INVALID\", label: \"无效输入\" };\n const [ch4, c2h4, c2h2] = computedPercent([CH4, C2H4, C2H2]);\n if (ch4 >= 98) return { code: \"PD\", label: \"局部放电\" };\n if (c2h4 >= 23 && c2h2 <= 13) return { code: \"D1\", label: \"低能放电\" };\n if (c2h4 >= 23 && c2h4 <= 40 && c2h2 >= 13 && c2h2 <= 29) return { code: \"D2\", label: \"高能放电\" };\n if (c2h2 <= 4 && c2h4 <= 20) return { code: \"T1\", label: \"热故障(t < 300℃)\" };\n if (c2h2 <= 4 && c2h4 > 20 && c2h4 <= 50) return { code: \"T2\", label: \"热故障(300℃ < t < 700℃)\" };\n if (c2h2 <= 15 && c2h4 >= 50) return { code: \"T3\", label: \"热故障(t > 700℃)\" };\n return { code: \"ND\", label: \"区域未定义\" };\n },\n duvalTriangle4: (H2, C2H6, CH4) => {\n const total = H2 + C2H6 + CH4;\n if (total <= 0) return { code: \"INVALID\", label: \"无效输入\" };\n const [h2, c2h6, ch4] = computedPercent([H2, C2H6, CH4]);\n if (c2h6 >= 1 && ch4 >= 2 && ch4 <= 15) return { code: \"PD\", label: \"电晕型局部放电\" };\n if (h2 <= 9 && c2h6 >= 24 && c2h6 <= 46 && ch4 <= 36) return { code: \"S\", label: '温度<200℃时的杂散气体' };\n if (h2 <= 9 && c2h6 <= 30) return { code: \"O\", label: \"过热温度<250℃,绝缘纸不碳化\" };\n if (c2h6 >= 24 && c2h6 <= 30 && ch4 >= 36) return { code: \"C\", label: \"绝缘纸可能碳化\" };\n return { code: \"ND\", label: \"区域未定义\" };\n },\n duvalTriangle5: (CH4, C2H4, C2H6) => {\n const total = CH4 + C2H4 + C2H6;\n if (total <= 0) return { code: \"INVALID\", label: \"无效输入\" };\n const [ch4, c2h4, c2h6] = computedPercent([CH4, C2H4, C2H6]);\n if (ch4 >= 85 && ch4 <= 100 && c2h6 >= 0 && c2h6 <= 15) return { code: \"PD\", label: \"电晕型局部放电\" };\n if ((c2h4 >= 35 && c2h4 <= 100 && c2h6 >= 0 && c2h6 <= 14) ||\n (c2h4 >= 35 && c2h4 <= 70 && c2h6 >= 30 && c2h6 <= 75)) return { code: \"T3\", label: \"高温过热故障(t > 700℃)\" };\n if (c2h4 >= 10 && c2h4 <= 35 && c2h6 >= 0 && c2h6 <= 12) return { code: \"T2\", label: \"中温过热故障(t > 300℃)\" };\n if (c2h4 >= 10 && c2h4 <= 70 && c2h6 >= 12 && c2h6 <= 30) return { code: \"C\", label: \"绝缘纸碳化故障\" };\n if (c2h4 <= 10 && c2h6 >= 15 && c2h6 <= 54) return { code: \"S\", label: \"矿物油杂散气体(低温过热 90℃~200℃)\" };\n if (c2h4 <= 10 && (c2h6 <= 15 || c2h6 >= 54)) return { code: \"O\", label: \"过热故障\" };\n return { code: \"ND\", label: \"区域未定义\" };\n },\n duvalPentagon1: (H2, CH4, C2H2, C2H4, C2H6) => {\n const pt = _pentagonRatioToDoc(H2, C2H2, C2H4, CH4, C2H6);\n if (!pt) return { code: 'INVALID', label: '无效输入', desc: '', color: '' };\n const { x, y } = pt;\n for (let i = 0; i < PENTAGON_ZONES_1.length - 1; i++) {\n const zone = PENTAGON_ZONES_1[i];\n if (_inPentagonPoly(x, y, zone.poly)) {\n return { code: zone.name, label: zone.title, desc: zone.desc, color: zone.color };\n }\n }\n const last = PENTAGON_ZONES_1[PENTAGON_ZONES_1.length - 1];\n return { code: last.name, label: last.title, desc: last.desc, color: last.color };\n },\n duvalPentagon2: (H2, CH4, C2H2, C2H4, C2H6) => {\n const pt = _pentagonRatioToDoc(H2, C2H2, C2H4, CH4, C2H6);\n if (!pt) return { code: 'INVALID', label: '无效输入', desc: '', color: '' };\n const { x, y } = pt;\n for (let i = 0; i < PENTAGON_ZONES_2.length - 1; i++) {\n const zone = PENTAGON_ZONES_2[i];\n if (_inPentagonPoly(x, y, zone.poly)) {\n return { code: zone.name, label: zone.title, desc: zone.desc, color: zone.color };\n }\n }\n const last = PENTAGON_ZONES_2[PENTAGON_ZONES_2.length - 1];\n return { code: last.name, label: last.title, desc: last.desc, color: last.color };\n },\n};\n","/**\r\n * DuvalPentagon.js\r\n * 变压器溶解气体分析\r\n */\r\nimport { inPoly, hexToRgba, deepMerge, EventBus, ZoomController, DOMTooltip, parseGridBox, drawShapePath } from './utils.js';\r\n\r\nfunction colorToRgba(color, alpha) {\r\n if (!color) return `rgba(0,0,0,${alpha})`;\r\n if (color.startsWith('#')) {\r\n return hexToRgba(color, alpha);\r\n }\r\n if (color.startsWith('rgb')) {\r\n return color.replace(/rgb(a)?\\(([^)]+)\\)/, (m, a, content) => {\r\n const parts = content.split(',');\r\n const r = parts[0].trim();\r\n const g = parts[1].trim();\r\n const b = parts[2].trim();\r\n return `rgba(${r},${g},${b},${alpha})`;\r\n });\r\n }\r\n return color;\r\n}\r\n\r\n/**\r\n * PentagonCoord — 坐标系核心\r\n * 提供 doc 坐标(文献原始)、ratio 向量(归一化比例)和 canvas 坐标(渲染内部)之间的转换\r\n *\r\n * * 两种坐标系:\r\n *\r\n * ① \"doc 坐标\"(文献原始)\r\n * R = 40,数学坐标(Y 向上),中心 (0, 0)\r\n * H2 顶点 = (0, 40),C2H2 = (38.04, 12.36) ...\r\n * 优点:与 Duval 2002 论文完全一致,直接可读\r\n *\r\n * ② \"ratio 向量\"(归一化比例)\r\n * [H2%, C2H2%, C2H4%, CH4%, C2H6%],合计 = 1\r\n * 优点:坐标系无关,可自定义 gasOrder/R/cx/cy\r\n *\r\n * ③ \"canvas 坐标\"(渲染内部,外部不感知)\r\n * R = S*0.385,canvas 坐标(Y 向下),中心 (cx, cy)\r\n * 仅在 draw 函数内部使用,外部 API 不暴露\r\n *\r\n * 关系:\r\n * doc → ratio → canvas\r\n * doc ← ratio ← canvas\r\n *\r\n * poly 字段支持两种格式(通过元素长度自动识别):\r\n * 长度 2 → doc 坐标 [x, y] 例:[24.3, -30]\r\n * 长度 5 → ratio 向量 [r0,r1,r2,r3,r4] 例:[0,0.05,0.95,0,0]\r\n *\r\n * series.data 支持两种格式:\r\n * 对象格式(气体浓度):{ H2: 120, C2H2: 5, ... }\r\n * doc 坐标格式: { x: 24.3, y: -30 }\r\n */\r\nexport class PentagonCoord {\r\n // doc 坐标系参数(固定)\r\n static DOC_R = 40;\r\n // 顶点角度(数学坐标,顺时针,H2 在顶部=90°)\r\n static DOC_ANGLES = [90, 18, -54, -126, 162]; // 度\r\n\r\n /**\r\n * 将 doc 坐标(R=40,Y向上)转换为归一化 ratio 向量\r\n * @param {number} x - doc 坐标系 x\r\n * @param {number} y - doc 坐标系 y\r\n * @returns {number[]|null} - 长度为5的 ratio 向量,或 null(如果在五边形外)\r\n */\r\n static docToRatio(x, y) {\r\n const R = PentagonCoord.DOC_R;\r\n const ang = PentagonCoord.DOC_ANGLES;\r\n const verts = ang.map((d) => {\r\n const a = (d * Math.PI) / 180;\r\n return [R * Math.cos(a), R * Math.sin(a)];\r\n });\r\n\r\n // 顶点精确匹配\r\n for (let i = 0; i < 5; i++) {\r\n if (Math.hypot(x - verts[i][0], y - verts[i][1]) < 0.5) {\r\n const r = [0, 0, 0, 0, 0];\r\n r[i] = 1;\r\n return r;\r\n }\r\n }\r\n\r\n // 边上精确插值\r\n for (let i = 0; i < 5; i++) {\r\n const j = (i + 1) % 5;\r\n const [ax, ay] = verts[i],\r\n [bx, by] = verts[j];\r\n const dx = bx - ax,\r\n dy = by - ay;\r\n const len2 = dx * dx + dy * dy;\r\n if (len2 < 1e-10) continue;\r\n const t = ((x - ax) * dx + (y - ay) * dy) / len2;\r\n if (t >= -1e-6 && t <= 1 + 1e-6) {\r\n const dist = Math.abs((y - ay) * dx - (x - ax) * dy) / Math.sqrt(len2);\r\n if (dist < 0.15) {\r\n const t2 = Math.max(0, Math.min(1, t));\r\n const r = [0, 0, 0, 0, 0];\r\n r[i] = 1 - t2;\r\n r[j] = t2;\r\n return r;\r\n }\r\n }\r\n }\r\n\r\n // 内部点:三角扇重心坐标(放宽 eps)\r\n for (let i = 0; i < 5; i++) {\r\n const v0 = [0, 0],\r\n v1 = verts[i],\r\n v2 = verts[(i + 1) % 5];\r\n const denom = (v1[1] - v2[1]) * (v0[0] - v2[0]) + (v2[0] - v1[0]) * (v0[1] - v2[1]);\r\n if (Math.abs(denom) < 1e-10) continue;\r\n const l0 = ((v1[1] - v2[1]) * (x - v2[0]) + (v2[0] - v1[0]) * (y - v2[1])) / denom;\r\n const l1 = ((v2[1] - v0[1]) * (x - v2[0]) + (v0[0] - v2[0]) * (y - v2[1])) / denom;\r\n const l2 = 1 - l0 - l1;\r\n if (l0 >= -0.01 && l1 >= -0.01 && l2 >= -0.01) {\r\n const r = new Array(5).fill(l0 / 5);\r\n r[i] += l1;\r\n r[(i + 1) % 5] += l2;\r\n const tot = r.reduce((s, v) => s + Math.max(0, v), 0);\r\n return r.map((v) => Math.max(0, v) / tot);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * 将归一化 ratio 向量转换为 doc 坐标\r\n * @param {number[]} ratio - 长度为5的 ratio 向量\r\n * @returns {number[]} - [x, y] doc 坐标\r\n */\r\n static ratioToDoc(ratio) {\r\n const R = PentagonCoord.DOC_R;\r\n const ang = PentagonCoord.DOC_ANGLES;\r\n let x = 0,\r\n y = 0;\r\n for (let i = 0; i < 5; i++) {\r\n const a = (ang[i] * Math.PI) / 180;\r\n x += ratio[i] * R * Math.cos(a);\r\n y += ratio[i] * R * Math.sin(a);\r\n }\r\n return [x, y];\r\n }\r\n\r\n /**\r\n * 将 canvas 像素坐标转换为归一化 ratio 向量\r\n * @param {number} px - canvas 像素坐标 x\r\n * @param {number} py - canvas 像素坐标 y\r\n * @param {number} cx - 五边形中心 x\r\n * @param {number} cy - 五边形中心 y\r\n * @param {number} R - 五边形半径\r\n * @returns {number[]|null} - ratio 向量或 null\r\n */\r\n static canvasToRatio(px, py, cx, cy, R) {\r\n const verts = Array.from({ length: 5 }, (_, i) => PentagonCoord.canvasVertex(i, cx, cy, R));\r\n if (!inPoly(px, py, verts)) return null;\r\n\r\n for (let i = 0; i < 5; i++) {\r\n const v0 = [cx, cy],\r\n v1 = verts[i],\r\n v2 = verts[(i + 1) % 5];\r\n const denom = (v1[1] - v2[1]) * (v0[0] - v2[0]) + (v2[0] - v1[0]) * (v0[1] - v2[1]);\r\n if (Math.abs(denom) < 1e-10) continue;\r\n const l0 = ((v1[1] - v2[1]) * (px - v2[0]) + (v2[0] - v1[0]) * (py - v2[1])) / denom;\r\n const l1 = ((v2[1] - v0[1]) * (px - v2[0]) + (v0[0] - v2[0]) * (py - v2[1])) / denom;\r\n const l2 = 1 - l0 - l1;\r\n if (l0 >= -1e-9 && l1 >= -1e-9 && l2 >= -1e-9) {\r\n const r = new Array(5).fill(l0 / 5);\r\n r[i] += l1;\r\n r[(i + 1) % 5] += l2;\r\n const tot = r.reduce((s, v) => s + Math.max(0, v), 0);\r\n return r.map((v) => Math.max(0, v) / tot);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // canvas 顶点坐标(Y 向下,从顶部 12 点顺时针)\r\n static canvasVertex(i, cx, cy, R) {\r\n const a = -Math.PI / 2 + (i * 2 * Math.PI) / 5;\r\n return [cx + R * Math.cos(a), cy + R * Math.sin(a)];\r\n }\r\n\r\n // doc 坐标 → canvas 坐标(直接线性映射)\r\n static docToCanvas(x, y, cx, cy, R) {\r\n return [\r\n cx + (x / PentagonCoord.DOC_R) * R,\r\n cy - (y / PentagonCoord.DOC_R) * R, // Y 轴反转\r\n ];\r\n }\r\n\r\n // poly 统一解析 → canvas 点数组\r\n static polyToCanvas(polyPoint, cx, cy, R) {\r\n if (polyPoint.length === 2) {\r\n return PentagonCoord.docToCanvas(polyPoint[0], polyPoint[1], cx, cy, R);\r\n }\r\n let x = 0,\r\n y = 0;\r\n for (let i = 0; i < 5; i++) {\r\n const [vx, vy] = PentagonCoord.canvasVertex(i, cx, cy, R);\r\n x += polyPoint[i] * vx;\r\n y += polyPoint[i] * vy;\r\n }\r\n return [x, y];\r\n }\r\n /**\r\n * 将任意格式的 series.data 解析为归一化 ratio 向量\r\n * @param {object|number[]} data - 待解析的数据\r\n * @param {string[]} gasOrder - 气体顺序\r\n * @returns {number[]|null} - ratio 向量或 null\r\n */\r\n static resolveData(data, gasOrder) {\r\n if (!data) return null;\r\n\r\n if (Array.isArray(data)) {\r\n const isObj = data.length > 0 && data[0] && typeof data[0] === 'object';\r\n let vals;\r\n if (isObj && gasOrder) {\r\n vals = gasOrder.map(k => {\r\n const item = data.find(d => d.name === k);\r\n return Math.max(0, (item ? item.value : 0) || 0);\r\n });\r\n } else {\r\n vals = data.map((v) => Math.max(0, v || 0));\r\n }\r\n const total = vals.reduce((s, v) => s + v, 0);\r\n if (total <= 1e-9) return null;\r\n return vals.map((v) => v / total);\r\n }\r\n\r\n if ('x' in data && 'y' in data) {\r\n return PentagonCoord.docToRatio(data.x, data.y);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n // ratio → doc 坐标字符串(调试/显示用)\r\n static ratioToDocStr(ratio, decimals = 1) {\r\n const [x, y] = PentagonCoord.ratioToDoc(ratio);\r\n return `(${x.toFixed(decimals)}, ${y.toFixed(decimals)})`;\r\n }\r\n}\r\n\r\n/**\r\n * ThemeManager — 主题管理系统\r\n * 内置 DARK/LIGHT 主题,并支持用户通过 setOption 覆盖任意字段\r\n */\r\nexport class ThemeManager {\r\n static DARK = {\r\n backgroundColor: 'transparent', // 画布背景色\r\n pointStyle: {\r\n itemStyle: {\r\n shape: 'circle',\r\n radius: 3,\r\n color: '#00e5ff',\r\n borderColor: '#ffffff',\r\n borderWidth: 0.5,\r\n },\r\n textStyle: {\r\n show: false,\r\n fontSize: 11,\r\n color: '#00e5ff',\r\n position: 'top',\r\n }\r\n },\r\n vertex: {\r\n show: true,\r\n labelStyle: {\r\n color: '#01FFE1',\r\n fontStyle: 'normal',\r\n fontWeight: 'bold',\r\n fontSize: 14,\r\n }\r\n },\r\n grid: {\r\n show: false,\r\n lineStyle: {\r\n lineType: 'solid',\r\n lineWidth: 1.0,\r\n lineColor: 'rgba(0, 229, 255, 0.15)',\r\n }\r\n },\r\n zone: {\r\n labelStyle: {\r\n show: true,\r\n color: '#ffffff',\r\n fontStyle: 'bold',\r\n fontSize: 12,\r\n letterSpacing: 0,\r\n textShadow: 'rgba(0,0,0,0.85)',\r\n padding: [4, 8],\r\n borderRadius: 4,\r\n backgroundColor: 'transparent'\r\n },\r\n borderStyle: {\r\n show: true,\r\n stroke: 1.0,\r\n type: 'solid',\r\n color: 'rgba(255, 255, 255, 0.25)'\r\n }\r\n },\r\n tooltip: {\r\n show: true,\r\n showDiagnostic: false,\r\n showPoint: true,\r\n backgroundColor: 'rgba(6, 13, 31, 0.93)',\r\n textStyle: {\r\n color: '#c8ddf0',\r\n fontStyle: '',\r\n fontWeight: '',\r\n fontSize: 12,\r\n },\r\n padding: 10\r\n },\r\n fontFamily: 'Rajdhani, sans-serif', // 全局字体\r\n };\r\n\r\n static LIGHT = {\r\n backgroundColor: 'transparent', // 画布背景色\r\n pointStyle: {\r\n itemStyle: {\r\n shape: 'circle',\r\n radius: 3,\r\n color: '#1d4ed8',\r\n borderColor: '#ffffff',\r\n borderWidth: 0.5,\r\n },\r\n textStyle: {\r\n show: false,\r\n fontSize: 11,\r\n color: '#1d4ed8',\r\n position: 'top',\r\n }\r\n },\r\n vertex: {\r\n show: true,\r\n labelStyle: {\r\n color: '#1d4ed8',\r\n fontStyle: 'normal',\r\n fontWeight: 'bold',\r\n fontSize: 14,\r\n }\r\n },\r\n grid: {\r\n show: false,\r\n lineStyle: {\r\n lineType: 'solid',\r\n lineWidth: 1.0,\r\n lineColor: 'rgba(29, 78, 216, 0.15)',\r\n }\r\n },\r\n zone: {\r\n labelStyle: {\r\n show: true,\r\n color: '#1e293b',\r\n fontStyle: 'bold',\r\n fontSize: 11,\r\n letterSpacing: 0,\r\n textShadow: 'rgba(255,255,255,0.8)',\r\n padding: [4, 8],\r\n borderRadius: 4,\r\n backgroundColor: 'transparent'\r\n },\r\n borderStyle: {\r\n show: true,\r\n stroke: 1.0,\r\n type: 'solid',\r\n color: 'rgba(0, 0, 0, 0.25)'\r\n }\r\n },\r\n tooltip: {\r\n show: true,\r\n showDiagnostic: false,\r\n showPoint: true,\r\n backgroundColor: 'rgba(240, 244, 248, 0.96)',\r\n textStyle: {\r\n color: '#334155',\r\n fontStyle: '',\r\n fontWeight: '',\r\n fontSize: 12,\r\n },\r\n padding: 10\r\n },\r\n fontFamily: 'Rajdhani, sans-serif', // 全局字体\r\n };\r\n\r\n static resolve(theme) {\r\n if (!theme || theme === 'dark') return { ...ThemeManager.DARK };\r\n if (theme === 'light') return { ...ThemeManager.LIGHT };\r\n return deepMerge({ ...ThemeManager.DARK }, theme);\r\n }\r\n}\r\n\r\n/**\r\n * ZoneRenderer — 故障区域渲染器\r\n * 绘制五边形背景区域和标识文字,并根据坐标判定当前所在的诊断区域\r\n */\r\nexport class ZoneRenderer {\r\n /**\r\n * 根据 ratio 向量诊断所在故障区域\r\n * @param {number[]} ratio - 待诊断的 ratio 向量\r\n * @param {object} zoneOpt - 区域配置对象\r\n * @param {number} cx - 中心点 x\r\n * @param {number} cy - 中心点 y\r\n * @param {number} R - 半径\r\n * @returns {object} - 匹配的区域对象\r\n */\r\n static diagnose(ratio, zoneOpt, cx, cy, R) {\r\n const data = (zoneOpt && Array.isArray(zoneOpt.data)) ? zoneOpt.data : (Array.isArray(zoneOpt) ? zoneOpt : []);\r\n if (!data.length) return null;\r\n const [px, py] = PentagonCoord.polyToCanvas(ratio, cx, cy, R);\r\n for (let i = 0; i < data.length - 1; i++) {\r\n const poly = data[i].poly.map((p) => PentagonCoord.polyToCanvas(p, cx, cy, R));\r\n if (inPoly(px, py, poly)) return data[i];\r\n }\r\n return data[data.length - 1];\r\n }\r\n\r\n /**\r\n * 绘制所有故障区域\r\n * @param {CanvasRenderingContext2D} ctx - Canvas 2D 上下文\r\n * @param {object} zoneOpt - 区域配置对象\r\n * @param {object} theme - 主题配置\r\n * @param {number} cx - 中心点 x\r\n * @param {number} cy - 中心点 y\r\n * @param {number} R - 半径\r\n * @param {number} S - 容器尺寸\r\n */\r\n static draw(ctx, zoneOpt, theme, cx, cy, R, S) {\r\n const data = (zoneOpt && Array.isArray(zoneOpt.data)) ? zoneOpt.data : (Array.isArray(zoneOpt) ? zoneOpt : []);\r\n const gLabel = zoneOpt.labelStyle || {};\r\n const gBorder = zoneOpt.borderStyle || {};\r\n\r\n // 1. 绘制背景区域\r\n for (const z of data) {\r\n if (!z.poly || !z.poly.length) continue;\r\n const pts = z.poly.map((p) => PentagonCoord.polyToCanvas(p, cx, cy, R));\r\n ctx.beginPath();\r\n pts.forEach(([x, y], i) => (i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\r\n ctx.closePath();\r\n ctx.fillStyle = z.color || 'transparent';\r\n ctx.fill();\r\n }\r\n\r\n // 2. 绘制边框\r\n for (const z of data) {\r\n const bStyle = { ...gBorder, ...(z.borderStyle || {}) };\r\n if (bStyle.show === false || !z.poly || !z.poly.length) continue;\r\n\r\n const pts = z.poly.map((p) => PentagonCoord.polyToCanvas(p, cx, cy, R));\r\n ctx.beginPath();\r\n pts.forEach(([x, y], i) => (i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\r\n ctx.closePath();\r\n\r\n ctx.strokeStyle = bStyle.color || z.borderColor || theme.zoneBorderColor || 'rgba(255,255,255,0.5)';\r\n ctx.lineWidth = (bStyle.stroke ?? z.borderWidth ?? theme.zoneBorderWidth ?? 1.0) * (1);\r\n\r\n if (bStyle.type === 'dashed') {\r\n ctx.setLineDash([4, 4]);\r\n } else if (bStyle.type === 'dotted') {\r\n ctx.setLineDash([2, 4]);\r\n } else {\r\n ctx.setLineDash([]);\r\n }\r\n ctx.stroke();\r\n }\r\n ctx.setLineDash([]); // 重置虚线\r\n\r\n // 3. 绘制文字标签\r\n const ff = theme.fontFamily || 'Rajdhani, sans-serif';\r\n\r\n for (const z of data) {\r\n const lStyle = { ...gLabel, ...(z.labelStyle || {}) };\r\n if (lStyle.show === false || !z.name) continue;\r\n\r\n const pts = z.poly ? z.poly.map((p) => PentagonCoord.polyToCanvas(p, cx, cy, R)) : [];\r\n let lx, ly;\r\n if (z.labelAt && Array.isArray(z.labelAt)) {\r\n [lx, ly] = PentagonCoord.polyToCanvas(z.labelAt, cx, cy, R);\r\n } else if (pts.length > 0) {\r\n lx = pts.reduce((s, p) => s + p[0], 0) / pts.length;\r\n ly = pts.reduce((s, p) => s + p[1], 0) / pts.length;\r\n } else {\r\n continue;\r\n }\r\n\r\n const fs = Math.round((lStyle.fontSize || theme.zoneLabelSize || 12) * (1));\r\n const fontStyle = lStyle.fontStyle || 'bold';\r\n ctx.font = `${fontStyle} ${fs}px ${ff}`;\r\n\r\n if (lStyle.letterSpacing !== undefined && 'letterSpacing' in ctx) {\r\n ctx.letterSpacing = `${lStyle.letterSpacing}px`;\r\n }\r\n\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n const text = z.name;\r\n const tw = ctx.measureText(text).width;\r\n const th = fs;\r\n\r\n // 绘制带圆角、内边距的背景\r\n if (lStyle.backgroundColor && lStyle.backgroundColor !== 'transparent') {\r\n let padX = 4, padY = 4;\r\n if (Array.isArray(lStyle.padding)) {\r\n padY = lStyle.padding[0];\r\n padX = lStyle.padding[1] !== undefined ? lStyle.padding[1] : padY;\r\n } else if (typeof lstyle.padding === 'number') {\r\n padX = padY = lstyle.padding;\r\n }\r\n padX *= (1);\r\n padY *= (1);\r\n\r\n const radius = (lStyle.borderRadius || 0) * (1);\r\n const bw = tw + padX * 2;\r\n const bh = th + padY * 2;\r\n const bx = lx - bw / 2;\r\n const by = ly - bh / 2;\r\n\r\n ctx.fillStyle = lStyle.backgroundColor;\r\n ctx.beginPath();\r\n if (ctx.roundRect) {\r\n ctx.roundRect(bx, by, bw, bh, radius);\r\n } else {\r\n ctx.rect(bx, by, bw, bh);\r\n }\r\n ctx.fill();\r\n }\r\n\r\n // 文本阴影\r\n if (lStyle.textShadow && lStyle.textShadow !== 'none') {\r\n ctx.shadowColor = lStyle.textShadow;\r\n ctx.shadowBlur = 4;\r\n } else {\r\n ctx.shadowColor = 'transparent';\r\n ctx.shadowBlur = 0;\r\n }\r\n\r\n ctx.fillStyle = lStyle.color || theme.zoneLabelColor || '#fff';\r\n ctx.fillText(text, lx, ly);\r\n\r\n // 恢复默认状态\r\n ctx.shadowBlur = 0;\r\n ctx.shadowColor = 'transparent';\r\n if ('letterSpacing' in ctx) ctx.letterSpacing = '0px';\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * GridRenderer — 网格渲染器\r\n * 绘制五边形背景网格、五个顶点的气体标签、刻度线以及放射状轴线\r\n */\r\nexport class GridRenderer {\r\n static draw(ctx, vertexOpt, theme, cx, cy, R, S, gridOpt) {\r\n const scale = 1;\r\n const ff = theme.fontFamily || 'Rajdhani, sans-serif';\r\n\r\n if (gridOpt && gridOpt.show !== false) {\r\n const lineStyle = gridOpt.lineStyle || {};\r\n const lw = (lineStyle.lineWidth ?? 1) * scale;\r\n const lc = lineStyle.lineColor || '#e5e7eb';\r\n const lt = lineStyle.lineType || 'solid';\r\n\r\n ctx.strokeStyle = lc;\r\n ctx.lineWidth = lw;\r\n\r\n if (lt === 'dashed') {\r\n ctx.setLineDash([4, 4]);\r\n } else if (lt === 'dotted') {\r\n ctx.setLineDash([2, 4]);\r\n } else {\r\n ctx.setLineDash([]);\r\n }\r\n\r\n for (const f of [0.2, 0.4, 0.6, 0.8, 1.0]) {\r\n ctx.beginPath();\r\n for (let i = 0; i < 5; i++) {\r\n const [x, y] = PentagonCoord.canvasVertex(i, cx, cy, R * f);\r\n i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\r\n }\r\n ctx.closePath();\r\n ctx.stroke();\r\n }\r\n for (let i = 0; i < 5; i++) {\r\n const [x, y] = PentagonCoord.canvasVertex(i, cx, cy, R);\r\n ctx.beginPath();\r\n ctx.moveTo(cx, cy);\r\n ctx.lineTo(x, y);\r\n ctx.stroke();\r\n }\r\n ctx.setLineDash([]); // 重置虚线\r\n }\r\n if (!vertexOpt || vertexOpt.show === false) return;\r\n const globalDist = vertexOpt.labelStyle?.distance !== undefined ? vertexOpt.labelStyle.distance : 27.2;\r\n\r\n vertexOpt.data.forEach((item, i) => {\r\n const style = item.labelStyle || {};\r\n const dist = style.distance !== undefined ? style.distance : globalDist;\r\n const distOffset = (typeof dist === 'string' && dist.endsWith('%'))\r\n ? (parseFloat(dist) / 100) * R\r\n : (parseFloat(dist) * scale);\r\n\r\n const [x, y] = PentagonCoord.canvasVertex(i, cx, cy, R + distOffset);\r\n const fontStyle = style.fontStyle || 'normal';\r\n const fontWeight = style.fontWeight || 'bold';\r\n const fontSize = Math.round((style.fontSize || theme.gasLabelSize || 14) * scale);\r\n ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${ff}`;\r\n ctx.fillStyle = style.color || theme.gasLabelColor || '#fff';\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n ctx.shadowColor = theme.gasLabelShadow;\r\n ctx.shadowBlur = 7;\r\n ctx.fillText(item.name, x, y);\r\n ctx.shadowBlur = 0;\r\n });\r\n }\r\n}\r\n\r\nfunction parseRgba(color) {\r\n const cleaned = color.trim().toLowerCase();\r\n if (cleaned.startsWith('#')) {\r\n let hex = cleaned.slice(1);\r\n if (hex.length === 3) {\r\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\r\n }\r\n const r = parseInt(hex.substring(0, 2), 16);\r\n const g = parseInt(hex.substring(2, 4), 16);\r\n const b = parseInt(hex.substring(4, 6), 16);\r\n const a = hex.length === 8 ? parseInt(hex.substring(6, 8), 16) / 255 : 1;\r\n return [r, g, b, a];\r\n }\r\n const m = cleaned.match(/rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\)/);\r\n if (m) {\r\n return [\r\n parseInt(m[1], 10),\r\n parseInt(m[2], 10),\r\n parseInt(m[3], 10),\r\n m[4] !== undefined ? parseFloat(m[4]) : 1\r\n ];\r\n }\r\n if (cleaned === 'transparent') return [0, 0, 0, 0];\r\n return [255, 255, 255, 1];\r\n}\r\n\r\nfunction interpolateColor(c1, c2, factor) {\r\n const [r1, g1, b1, a1] = parseRgba(c1);\r\n const [r2, g2, b2, a2] = parseRgba(c2);\r\n const r = Math.round(r1 + (r2 - r1) * factor);\r\n const g = Math.round(g1 + (g2 - g1) * factor);\r\n const b = Math.round(b1 + (b2 - b1) * factor);\r\n const a = a1 + (a2 - a1) * factor;\r\n return `rgba(${r},${g},${b},${a})`;\r\n}\r\n\r\n\r\n\r\n/**\r\n * PointRenderer — 数据点渲染器\r\n * 绘制圆、圆环、星形、三角形、正方形等形状的数据点,并支持辉光效果和名称标签\r\n */\r\nexport class PointRenderer {\r\n /**\r\n * 绘制数据点及其辉光、标签\r\n */\r\n static draw(ctx, series, theme, cx, cy, R, S, gasOrder, zoneOpt, hoverPoint) {\r\n if (!series || !series.data || !Array.isArray(series.data)) return [];\r\n\r\n const scale = 1;\r\n const ff = theme.fontFamily || 'Rajdhani, sans-serif';\r\n const results = [];\r\n\r\n const pt = series.data;\r\n if (!pt || pt.length === 0) return [];\r\n\r\n const ratio = PentagonCoord.resolveData(pt, gasOrder);\r\n if (!ratio) return [];\r\n\r\n const ptName = series.name;\r\n const shape = series.shape || 'circle';\r\n const color = series.color || '#409eff';\r\n let size = series.size !== undefined ? series.size : 5;\r\n\r\n const [px, py] = PentagonCoord.polyToCanvas(ratio, cx, cy, R);\r\n const zone = ZoneRenderer.diagnose(ratio, zoneOpt, cx, cy, R);\r\n const [docX, docY] = PentagonCoord.ratioToDoc(ratio);\r\n\r\n const isHov = hoverPoint && hoverPoint.series === series;\r\n if (isHov) size *= 1.5;\r\n\r\n const globalItemStyle = series.itemStyle || {};\r\n const borderColor = globalItemStyle.borderColor || '#fff';\r\n const borderWidth = globalItemStyle.borderWidth !== undefined ? globalItemStyle.borderWidth : 1;\r\n const opacity = globalItemStyle.opacity !== undefined ? globalItemStyle.opacity : 1;\r\n\r\n const globalTextStyle = series.textStyle || {};\r\n const textShow = globalTextStyle.show !== undefined ? globalTextStyle.show : true;\r\n const textColor = globalTextStyle.color || color;\r\n const textFontSize = globalTextStyle.fontSize !== undefined ? globalTextStyle.fontSize : 12;\r\n const textFontWeight = globalTextStyle.fontWeight || 'normal';\r\n const textPosition = globalTextStyle.position || 'top';\r\n const textOffset = globalTextStyle.offset || [0, 0];\r\n\r\n const globalGlowStyle = series.glowStyle || {};\r\n const glowShow = globalGlowStyle.show !== undefined ? globalGlowStyle.show : false;\r\n const glowColorsOpt = globalGlowStyle.colors;\r\n const glowBlur = globalGlowStyle.blur !== undefined ? globalGlowStyle.blur : 15;\r\n const glowStartColor = globalGlowStyle.startColor || color;\r\n const glowEndColor = globalGlowStyle.endColor || 'transparent';\r\n const glowCount = globalGlowStyle.count !== undefined ? globalGlowStyle.count : 3;\r\n const glowDistance = globalGlowStyle.glowDistance !== undefined ? globalGlowStyle.glowDistance : 2;\r\n\r\n ctx.save();\r\n ctx.globalAlpha = opacity;\r\n\r\n // Glow Style Rendering\r\n if (glowShow) {\r\n ctx.shadowColor = glowColorsOpt ? glowColorsOpt[0] : glowStartColor;\r\n ctx.shadowBlur = glowBlur;\r\n\r\n let glowColors = [];\r\n let layers = glowCount;\r\n\r\n if (Array.isArray(glowColorsOpt) && glowColorsOpt.length > 0) {\r\n glowColors = glowColorsOpt;\r\n layers = glowColors.length;\r\n } else {\r\n for (let i = 0; i < layers; i++) {\r\n const factor = layers > 1 ? i / (layers - 1) : 0;\r\n glowColors.push(interpolateColor(glowStartColor, glowEndColor, factor));\r\n }\r\n }\r\n\r\n for (let i = layers - 1; i >= 0; i--) {\r\n const glowColor = glowColors[i];\r\n ctx.save();\r\n ctx.fillStyle = glowColor;\r\n ctx.beginPath();\r\n drawShapePath(ctx, px, py, shape, size, scale, (i + 1) * glowDistance);\r\n ctx.fill();\r\n ctx.restore();\r\n }\r\n }\r\n\r\n // Point Shape Rendering\r\n ctx.beginPath();\r\n drawShapePath(ctx, px, py, shape, size, scale, 0);\r\n\r\n if (shape === 'ring') {\r\n ctx.strokeStyle = color;\r\n ctx.lineWidth = borderWidth * scale;\r\n ctx.stroke();\r\n } else {\r\n ctx.fillStyle = color;\r\n ctx.fill();\r\n if (borderWidth > 0) {\r\n ctx.strokeStyle = borderColor;\r\n ctx.lineWidth = borderWidth * scale;\r\n ctx.stroke();\r\n }\r\n }\r\n ctx.restore();\r\n\r\n // Text/Label Rendering\r\n if (textShow && ptName) {\r\n ctx.save();\r\n ctx.globalAlpha = opacity;\r\n ctx.font = `${textFontWeight} ${Math.round(textFontSize * scale)}px ${ff}`;\r\n ctx.fillStyle = textColor;\r\n\r\n let textAlign = 'center';\r\n let textBaseline = 'middle';\r\n let tx = px + textOffset[0] * scale;\r\n let ty = py + textOffset[1] * scale;\r\n\r\n let offsetVal = 6 * scale;\r\n if (shape === 'circle' || shape === 'ring' || shape === 'star' || shape === 'triangle') {\r\n offsetVal += size * scale;\r\n } else if (shape === 'square') {\r\n offsetVal += size * scale / 2;\r\n }\r\n\r\n if (textPosition === 'top') {\r\n textAlign = 'center';\r\n textBaseline = 'bottom';\r\n ty -= offsetVal;\r\n } else if (textPosition === 'bottom') {\r\n textAlign = 'center';\r\n textBaseline = 'top';\r\n ty += offsetVal;\r\n } else if (textPosition === 'left') {\r\n textAlign = 'right';\r\n textBaseline = 'middle';\r\n tx -= offsetVal;\r\n } else if (textPosition === 'right') {\r\n textAlign = 'left';\r\n textBaseline = 'middle';\r\n tx += offsetVal;\r\n } else if (textPosition === 'center') {\r\n textAlign = 'center';\r\n textBaseline = 'middle';\r\n }\r\n\r\n ctx.textAlign = textAlign;\r\n ctx.textBaseline = textBaseline;\r\n\r\n ctx.fillText(ptName, tx, ty);\r\n ctx.restore();\r\n }\r\n\r\n results.push({\r\n ratio,\r\n zone,\r\n docX,\r\n docY,\r\n rawData: pt,\r\n name: ptName,\r\n series: series\r\n });\r\n\r\n\r\n return results;\r\n }\r\n}\r\n\r\n/**\r\n * HoverLayer — 悬浮交互层\r\n * 负责渲染悬浮交互相关的辅助 UI 元素(目前主要包含图表缩放状态徽章)。\r\n */\r\nexport class HoverLayer {\r\n\r\n /**\r\n * 绘制缩放状态徽章 (Zoom Badge)\r\n * 当图表处于放大状态时,在右下角显示当前的缩放比例及“双击重置”的提示\r\n * @param {CanvasRenderingContext2D} ctx - Canvas 2D 上下文\r\n * @param {number} zoom - 当前的缩放倍数\r\n * @param {number} S - 容器尺寸 (宽和高中的较小值),用于做自适应缩放计算\r\n * @param {object} theme - 主题配置对象,包含徽章背景、字体颜色等信息\r\n */\r\n static drawZoomBadge(ctx, zoom, S, theme) {\r\n if (zoom === 1) return;\r\n const scale = 1;\r\n const text = `${zoom.toFixed(2)}×`;\r\n const hint = ' 双击重置';\r\n const fs = Math.round(11 * scale);\r\n const pad = 6 * scale;\r\n const ff = theme.fontFamily || 'Rajdhani, sans-serif';\r\n ctx.font = `600 ${fs}px ${ff}`;\r\n const tw = ctx.measureText(text + hint).width;\r\n const bw = tw + pad * 2,\r\n bh = fs + pad * 1.8;\r\n const bx = S - bw - 8,\r\n by = S - bh - 8;\r\n ctx.fillStyle = theme.badgeBg;\r\n ctx.strokeStyle = theme.badgeBorderColor;\r\n ctx.lineWidth = 1;\r\n ctx.beginPath();\r\n ctx.roundRect(bx, by, bw, bh, 4);\r\n ctx.fill();\r\n ctx.stroke();\r\n ctx.textAlign = 'left';\r\n ctx.textBaseline = 'middle';\r\n ctx.fillStyle = theme.badgeTextColor;\r\n ctx.fillText(text, bx + pad, by + bh / 2);\r\n ctx.fillStyle = theme.badgeHintColor || 'rgba(200,221,240,0.4)';\r\n ctx.fillText(hint, bx + pad + ctx.measureText(text).width, by + bh / 2);\r\n }\r\n}\r\n\r\nimport { PENTAGON_ZONES_1 } from './zones.js';\r\n\r\n/**\r\n * DuvalPentagon — 杜瓦五边形图表主类\r\n * 组合数学计算、渲染器和交互控制,对外提供 setOption、setSeries 等 API\r\n */\r\nexport class DuvalPentagon {\r\n static DEFAULT_ZONES = PENTAGON_ZONES_1;\r\n\r\n static DEFAULTS = {\r\n theme: 'dark',\r\n vertex: {\r\n show: true,\r\n data: ['H2', 'C2H2', 'C2H4', 'CH4', 'C2H6']\r\n },\r\n zone: null,\r\n series: [],\r\n grid: {\r\n show: false\r\n },\r\n zoom: { min: 0.3, max: 6, step: 0.12 },\r\n tooltip: {\r\n show: true,\r\n showDiagnostic: false,\r\n showPoint: true\r\n }\r\n };\r\n\r\n constructor(container, option = {}) {\r\n this._el = typeof container === 'string' ? document.getElementById(container) : container;\r\n if (!this._el) throw new Error(`DuvalPentagon: container not found — \"${container}\"`);\r\n\r\n this._theme = ThemeManager.resolve(option.theme || DuvalPentagon.DEFAULTS.theme);\r\n this._opt = deepMerge(deepMerge(deepMerge({}, DuvalPentagon.DEFAULTS), this._theme), option);\r\n this._normalizeOptions();\r\n\r\n this._bus = new EventBus();\r\n this._zoom = new ZoomController(this._opt.zoom);\r\n\r\n this._canvas = document.createElement('canvas');\r\n this._ctx = this._canvas.getContext('2d');\r\n Object.assign(this._canvas.style, { display: 'block', width: '100%', height: '100%' });\r\n this._el.appendChild(this._canvas);\r\n\r\n this._tooltipRenderer = new DOMTooltip(this._el, this._theme);\r\n\r\n this._hoverRatio = null;\r\n this._hoverZone = null;\r\n this._hoverPoint = null;\r\n\r\n this._bindEvents();\r\n this._observeResize();\r\n this._syncCanvas();\r\n this._renderFull();\r\n }\r\n\r\n _normalizeOptions() {\r\n if (this._opt.showTooltip !== undefined) {\r\n if (!this._opt.tooltip) this._opt.tooltip = {};\r\n this._opt.tooltip.show = this._opt.showTooltip;\r\n }\r\n if (this._opt.tooltipTrigger !== undefined) {\r\n if (!this._opt.tooltip) this._opt.tooltip = {};\r\n if (this._opt.tooltipTrigger === 'point') {\r\n this._opt.tooltip.showDiagnostic = false;\r\n this._opt.tooltip.showPoint = true;\r\n } else if (this._opt.tooltipTrigger === 'zone') {\r\n this._opt.tooltip.showDiagnostic = true;\r\n this._opt.tooltip.showPoint = true;\r\n }\r\n }\r\n\r\n // 标准化 vertex.data 并进行校验\r\n if (!this._opt.vertex.data) {\r\n this._opt.vertex.data = ['H2', 'C2H2', 'C2H4', 'CH4', 'C2H6'];\r\n }\r\n if (!Array.isArray(this._opt.vertex.data) || this._opt.vertex.data.length !== 5) {\r\n throw new Error(\"DuvalPentagon: vertex.data must be an array of exactly 5 elements.\");\r\n }\r\n const defaultLabelStyle = this._opt.vertex.labelStyle || {};\r\n this._opt.vertex.data = this._opt.vertex.data.map(item => {\r\n if (typeof item === 'string') {\r\n return {\r\n name: item,\r\n labelStyle: { ...defaultLabelStyle }\r\n };\r\n } else if (item && typeof item === 'object') {\r\n if (!item.name) {\r\n throw new Error(\"DuvalPentagon: each vertex object in vertex.data must have a 'name' property.\");\r\n }\r\n return {\r\n name: item.name,\r\n labelStyle: deepMerge({ ...defaultLabelStyle }, item.labelStyle || {})\r\n };\r\n } else {\r\n throw new Error(\"DuvalPentagon: vertex.data elements must be either strings or objects with a 'name' property.\");\r\n }\r\n });\r\n\r\n // 衍生出内部的 gasOrder 数组\r\n this._opt.gasOrder = this._opt.vertex.data.map(v => v.name);\r\n\r\n // 处理 zone 默认数据和数组/对象格式\r\n if (!this._opt.zone) {\r\n this._opt.zone = { data: DuvalPentagon.DEFAULT_ZONES };\r\n } else if (Array.isArray(this._opt.zone)) {\r\n this._opt.zone = { data: this._opt.zone };\r\n } else if (typeof this._opt.zone === 'object' && !this._opt.zone.data) {\r\n this._opt.zone.data = DuvalPentagon.DEFAULT_ZONES;\r\n }\r\n\r\n\r\n }\r\n\r\n /* 公开 API ─ */\r\n\r\n /**\r\n * 深度合并配置并重绘图表\r\n * @param {object} opt - 需要合并的配置项\r\n * @returns {DuvalPentagon} - 当前实例,支持链式调用\r\n */\r\n setOption(opt) {\r\n if (opt.theme !== undefined) {\r\n this._theme = ThemeManager.resolve(opt.theme);\r\n this._tooltipRenderer.updateTheme(this._theme);\r\n // 将新主题默认值与已有的完整配置进行深度合并,防止自定义配置丢失\r\n this._opt = deepMerge(deepMerge(deepMerge({}, DuvalPentagon.DEFAULTS), this._theme), this._opt);\r\n }\r\n deepMerge(this._opt, opt);\r\n this._normalizeOptions();\r\n this._syncCanvas();\r\n this._render();\r\n return this;\r\n }\r\n\r\n /**\r\n * 替换全部数据点并重绘\r\n * @param {object|object[]} series - 单个或多个数据点系列\r\n * @returns {DuvalPentagon} - 当前实例,支持链式调用\r\n */\r\n setSeries(series) {\r\n this._opt.series = Array.isArray(series) ? series : [series];\r\n this._renderFull();\r\n return this;\r\n }\r\n\r\n zoomReset() {\r\n this._zoom.reset();\r\n this._renderFull();\r\n return this;\r\n }\r\n\r\n on(ev, fn) {\r\n this._bus.on(ev, fn);\r\n return this;\r\n }\r\n off(ev, fn) {\r\n this._bus.off(ev, fn);\r\n return this;\r\n }\r\n\r\n dispose() {\r\n this._ro?.disconnect();\r\n this._tooltipRenderer.dispose();\r\n const c = this._canvas;\r\n if (c) {\r\n c.removeEventListener('wheel', this._onWheel);\r\n c.removeEventListener('mousedown', this._onDown);\r\n c.removeEventListener('mousemove', this._onMove);\r\n c.removeEventListener('mouseleave', this._onLeave);\r\n c.removeEventListener('dblclick', this._onDbl);\r\n c.parentNode?.removeChild(c);\r\n }\r\n window.removeEventListener('mouseup', this._onUp);\r\n this._bus.dispose();\r\n }\r\n\r\n /* 内部:事件绑定 */\r\n\r\n _bindEvents() {\r\n const c = this._canvas;\r\n\r\n this._onWheel = (e) => {\r\n e.preventDefault();\r\n const rect = c.getBoundingClientRect();\r\n const ax = (e.clientX - rect.left) * (this._cssW / rect.width);\r\n const ay = (e.clientY - rect.top) * (this._cssH / rect.height);\r\n this._zoom.onWheel(e.deltaY, ax, ay);\r\n this._bus.emit('zoom', this._zoom.state);\r\n this._renderFull();\r\n };\r\n\r\n this._onDown = (e) => {\r\n if (e.button !== 0) return;\r\n this._zoom.startDrag(e.clientX, e.clientY);\r\n c.style.cursor = 'grabbing';\r\n };\r\n\r\n this._onMove = (e) => {\r\n const rect = c.getBoundingClientRect();\r\n const scale = this._cssW / rect.width;\r\n if (this._zoom.moveDrag(e.clientX, e.clientY, scale)) {\r\n this._renderFull();\r\n return;\r\n }\r\n const lx = ((e.clientX - rect.left) * scale - this._zoom.panX) / this._zoom.zoom;\r\n const ly = ((e.clientY - rect.top) * scale - this._zoom.panY) / this._zoom.zoom;\r\n const { cx, cy, R, S } = this._dims();\r\n\r\n let hoveredPoint = null;\r\n let minDistance = Infinity;\r\n\r\n if (this._drawnResults) {\r\n for (const r of this._drawnResults) {\r\n const [px, py] = PentagonCoord.polyToCanvas(r.ratio, cx, cy, R);\r\n const pr = r.series.size || Math.max(5, S * 0.013);\r\n const dist = Math.hypot(px - lx, py - ly);\r\n if (dist < Math.max(pr * 1.5, 12) && dist < minDistance) {\r\n minDistance = dist;\r\n hoveredPoint = r;\r\n }\r\n }\r\n }\r\n\r\n const tooltipOpt = this._opt.tooltip || {};\r\n const showTooltip = tooltipOpt.show !== false;\r\n\r\n if (hoveredPoint && showTooltip && tooltipOpt.showPoint !== false) {\r\n c.style.cursor = 'pointer';\r\n this._hoverPoint = hoveredPoint;\r\n this._hoverRatio = hoveredPoint.ratio;\r\n this._hoverZone = hoveredPoint.zone;\r\n this._bus.emit('hover', {\r\n ratio: hoveredPoint.ratio,\r\n zone: hoveredPoint.zone,\r\n docX: hoveredPoint.docX,\r\n docY: hoveredPoint.docY,\r\n point: hoveredPoint.series,\r\n });\r\n } else {\r\n c.style.cursor = 'default';\r\n this._hoverPoint = null;\r\n const hr = PentagonCoord.canvasToRatio(lx, ly, cx, cy, R);\r\n if (hr && showTooltip && tooltipOpt.showDiagnostic !== false) {\r\n this._hoverRatio = hr;\r\n this._hoverZone = ZoneRenderer.diagnose(hr, this._opt.zone, cx, cy, R);\r\n const [dx, dy] = PentagonCoord.ratioToDoc(hr);\r\n this._bus.emit('hover', { ratio: hr, zone: this._hoverZone, docX: dx, docY: dy });\r\n } else {\r\n this._hoverRatio = null;\r\n this._hoverZone = null;\r\n this._bus.emit('hover', null);\r\n }\r\n }\r\n this._renderFull();\r\n };\r\n\r\n this._onUp = () => {\r\n if (!this._zoom.endDrag()) return;\r\n c.style.cursor = this._hoverPoint ? 'pointer' : 'default';\r\n this._bus.emit('zoom', this._zoom.state);\r\n };\r\n\r\n this._onLeave = () => {\r\n this._hoverRatio = null;\r\n this._hoverZone = null;\r\n this._hoverPoint = null;\r\n this._bus.emit('hover', null);\r\n this._renderFull();\r\n };\r\n\r\n this._onDbl = () => {\r\n this.zoomReset();\r\n this._bus.emit('zoom', this._zoom.state);\r\n };\r\n\r\n c.addEventListener('wheel', this._onWheel, { passive: false });\r\n c.addEventListener('mousedown', this._onDown);\r\n c.addEventListener('mousemove', this._onMove);\r\n c.addEventListener('mouseleave', this._onLeave);\r\n c.addEventListener('dblclick', this._onDbl);\r\n window.addEventListener('mouseup', this._onUp);\r\n c.style.cursor = 'default';\r\n }\r\n\r\n _observeResize() {\r\n if (typeof ResizeObserver === 'undefined') return;\r\n this._ro = new ResizeObserver(() => {\r\n this._syncCanvas();\r\n this._renderFull();\r\n });\r\n this._ro.observe(this._el);\r\n }\r\n\r\n _syncCanvas() {\r\n const dpr = window.devicePixelRatio || 1;\r\n const w = this._el.clientWidth || 300;\r\n const h = this._el.clientHeight || 300;\r\n this._cssW = w;\r\n this._cssH = h;\r\n this._canvas.width = Math.round(w * dpr);\r\n this._canvas.height = Math.round(h * dpr);\r\n }\r\n\r\n _dims() {\r\n const W = this._cssW,\r\n H = this._cssH;\r\n const grid = this._opt?.grid || {};\r\n // If no grid left/top/right/bottom is set, fallback to original 0.385 * min(W,H)\r\n const hasGridMargin = grid.left !== undefined || grid.right !== undefined || grid.top !== undefined || grid.bottom !== undefined;\r\n\r\n if (!hasGridMargin) {\r\n const S = Math.min(W, H);\r\n return { W, H, S, cx: W / 2, cy: H / 2, R: S * 0.385 };\r\n }\r\n\r\n const box = parseGridBox(W, H, grid, 0); // Default to 0 padding if not specified but margins are used\r\n const availS = Math.min(box.availW, box.availH);\r\n const R = availS / 2;\r\n // Set S backward compatibly (R = S * 0.385 => S = R / 0.385)\r\n const S = R / 0.385;\r\n\r\n return { W, H, S, cx: box.cx, cy: box.cy, R };\r\n }\r\n\r\n _render() {\r\n this._hoverRatio = null;\r\n this._hoverZone = null;\r\n this._hoverPoint = null;\r\n this._renderFull();\r\n }\r\n\r\n /**\r\n * 核心渲染方法,绘制所有可见元素\r\n * @private\r\n */\r\n _renderFull() {\r\n const ctx = this._ctx;\r\n if (!ctx) return;\r\n const dpr = window.devicePixelRatio || 1;\r\n const { W, H, S, cx, cy, R } = this._dims();\r\n const th = this._theme;\r\n const gas = this._opt.gasOrder;\r\n const zoneOpt = this._opt.zone;\r\n const vertexOpt = this._opt.vertex;\r\n\r\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\r\n ctx.clearRect(0, 0, W, H);\r\n\r\n const bgColor = this._opt.backgroundColor || th.backgroundColor || 'transparent';\r\n if (bgColor && bgColor !== 'transparent') {\r\n ctx.fillStyle = bgColor;\r\n ctx.fillRect(0, 0, W, H);\r\n }\r\n\r\n ctx.save();\r\n this._zoom.applyTransform(ctx);\r\n\r\n ZoneRenderer.draw(ctx, zoneOpt, th, cx, cy, R, S);\r\n GridRenderer.draw(ctx, vertexOpt, th, cx, cy, R, S, this._opt.grid);\r\n\r\n const results = [];\r\n for (const s of this._opt.series || []) {\r\n const resList = PointRenderer.draw(ctx, s, th, cx, cy, R, S, gas, zoneOpt, this._hoverPoint);\r\n if (Array.isArray(resList)) {\r\n resList.forEach(res => {\r\n results.push({ series: s, ...res });\r\n });\r\n }\r\n }\r\n this._drawnResults = results;\r\n\r\n const tooltipOpt = this._opt.tooltip || {};\r\n const showTooltip = tooltipOpt.show !== false;\r\n\r\n if (showTooltip && this._hoverRatio) {\r\n let hx = 0, hy = 0;\r\n if (this._hoverPoint || tooltipOpt.showDiagnostic !== false) {\r\n [hx, hy] = PentagonCoord.polyToCanvas(this._hoverRatio, cx, cy, R);\r\n }\r\n\r\n const px = hx * this._zoom.zoom + this._zoom.panX;\r\n const py = hy * this._zoom.zoom + this._zoom.panY;\r\n\r\n let html = '';\r\n if (typeof tooltipOpt.formatter === 'function') {\r\n html = tooltipOpt.formatter({\r\n ratio: this._hoverRatio,\r\n zone: this._hoverZone,\r\n point: this._hoverPoint?.series,\r\n gasOrder: gas\r\n });\r\n } else {\r\n html = this._defaultTooltipHTML(this._hoverRatio, this._hoverZone, th, gas, this._hoverPoint);\r\n }\r\n this._tooltipRenderer.show(html, px, py, tooltipOpt, th, this._hoverZone);\r\n } else {\r\n this._tooltipRenderer.hide();\r\n }\r\n\r\n ctx.restore();\r\n // HoverLayer.drawZoomBadge(ctx, this._zoom.zoom, S, th);\r\n\r\n if (results.length > 0) this._bus.emit('diagnose', results);\r\n }\r\n\r\n _defaultTooltipHTML(ratio, zone, theme, gasOrder, hoverPoint) {\r\n const vertexData = this._opt.vertex?.data || [];\r\n const rawData = hoverPoint?.rawData;\r\n\r\n let pointNameStr = '';\r\n if (hoverPoint && hoverPoint.name) {\r\n pointNameStr = `<div style=\"font-size:14px; font-weight:bold; margin-bottom:4px; color:#fff;\">${hoverPoint.name}</div>`;\r\n }\r\n\r\n const zoneStr = zone ? `${zone.name} ${zone.title}` : 'Outside';\r\n const zoneColor = zone ? zone.color : '#fff';\r\n\r\n let html = `\r\n ${pointNameStr}\r\n <div style=\"color:${zoneColor}; font-size:13px; font-weight:bold; padding-bottom:8px; margin-bottom:8px; border-bottom:1px solid rgba(255,255,255,0.07);\">\r\n ${zoneStr}\r\n </div>\r\n `;\r\n\r\n gasOrder.forEach((key, i) => {\r\n const col = vertexData[i]?.labelStyle?.color || theme.vertex?.labelStyle?.color || '#fff';\r\n\r\n let rawValStr = '-';\r\n if (rawData) {\r\n if (Array.isArray(rawData)) {\r\n const item = rawData[i];\r\n if (item && typeof item === 'object') {\r\n const found = rawData.find(d => d.name === key);\r\n rawValStr = found && found.value !== undefined ? found.value : '-';\r\n } else {\r\n rawValStr = rawData[i] !== undefined ? rawData[i] : '-';\r\n }\r\n } else if (typeof rawData === 'object') {\r\n rawValStr = rawData[key] !== undefined ? rawData[key] : '-';\r\n }\r\n }\r\n\r\n html += `\r\n <div style=\"display:flex; align-items:center; margin-bottom:6px; font-size:13px;\">\r\n <span style=\"display:inline-block; width:8px; height:8px; border-radius:50%; background-color:${col}; margin-right:8px;\"></span>\r\n <span style=\"color:#cbd5e1; flex-grow:1;\">${key}</span>\r\n <span style=\"color:#fff; font-weight:bold; margin-left:20px;\">${rawValStr}</span>\r\n </div>\r\n `;\r\n });\r\n\r\n return html;\r\n }\r\n}\r\n","/**\r\n * DGA Duval 三角形类 (Triangle Chart)\r\n * 包含: TriangleConfig 配置, TriangleMath 数学逻辑, TriangleRenderer 渲染器, DuvalTriangle 组件类\r\n */\r\nimport { DOMTooltip, deepMerge, ZoomController, parseGridBox, drawShapePath } from './utils.js';\r\n\r\n/**\r\n * TriangleConfig: 核心配置中心\r\n * 包含默认样式、网格、坐标轴及交互参数\r\n */\r\n\r\nimport { TRIANGLE_ZONES_1 } from './zones.js';\r\n\r\n/**\r\n * TriangleConfig: 图表的全局默认配置选项\r\n * 所有未传入的属性将自动回退到这里的定义\r\n */\r\nexport const TriangleConfig = Object.freeze({\r\n zone: { data: TRIANGLE_ZONES_1 },\r\n backgroundColor: '#050d1a',\r\n triFill: 'rgba(8,20,50,0)',\r\n grid: {\r\n show: true,\r\n steps: 10,\r\n majorEvery: 2,\r\n lineStyle: {\r\n color: 'rgba(255,255,255,0)',\r\n width: 1,\r\n type: 'solid'\r\n },\r\n majorLineStyle: {\r\n color: 'rgba(255,255,255,0)',\r\n width: 1,\r\n type: 'solid'\r\n },\r\n labelStyle: {\r\n color: 'rgba(200,220,255,0.8)',\r\n fontSize: 12,\r\n fontWeight: 'normal'\r\n },\r\n },\r\n side: {\r\n show: true,\r\n data: ['CH4', 'C2H2', 'C2H4'],\r\n labelStyle: {\r\n color: '#00e5ff',\r\n fontSize: 14,\r\n fontWeight: 'bold',\r\n offset: 40\r\n },\r\n tickStyle: {\r\n show: true,\r\n color: 'rgba(200,220,255)',\r\n fontSize: 14,\r\n offset: 15,\r\n length: 6,\r\n lineColor: 'rgba(0,0,0,0.2)'\r\n },\r\n lineStyle: {\r\n color: 'rgba(180,210,255,0.1)',\r\n width: 1.5,\r\n type: 'solid'\r\n }\r\n },\r\n tooltip: {\r\n show: true,\r\n backgroundColor: 'rgba(5,13,26,0.95)',\r\n borderColor: '#00e5ff',\r\n padding: 10,\r\n textStyle: {\r\n color: '#c8d8e8',\r\n fontSize: 12\r\n }\r\n },\r\n pointStyle: {\r\n itemStyle: {\r\n shape: 'circle',\r\n radius: 6,\r\n color: '#ff4081',\r\n borderWidth: 1.5,\r\n borderColor: 'rgba(255,255,255,0.7)',\r\n },\r\n textStyle: {\r\n show: true,\r\n fontSize: 12,\r\n color: '#00e5ff',\r\n position: 'top',\r\n }\r\n },\r\n});\r\n\r\n/**\r\n * TriangleMath: 封装所有三元坐标系相关的几何计算\r\n * 职责:坐标转换 (Triangle <-> Cartesian)、面积计算、质心计算\r\n */\r\nexport class TriangleMath {\r\n /** 计算等边三角形在给定视口下的顶点 */\r\n static computeTri(box) {\r\n const { availW, availH, cx, cy } = box;\r\n \r\n // 计算最大允许的等边三角形边长 (高 = 边长 * sin(60度))\r\n const S = Math.max(0, Math.min(availW, availH / Math.sin(Math.PI / 3)));\r\n const triH = S * Math.sin(Math.PI / 3);\r\n \r\n const startX = cx - S / 2;\r\n const startY = cy - triH / 2; // 上下居中 Bounding Box\r\n \r\n return {\r\n top: { x: cx, y: startY },\r\n left: { x: startX, y: startY + triH },\r\n right: { x: startX + S, y: startY + triH },\r\n };\r\n }\r\n\r\n /** 三元坐标(a,b,c)转笛卡尔坐标(x,y) */\r\n static t2c(a, b, c, tri) {\r\n const { top: T, left: L, right: R } = tri;\r\n return {\r\n x: a * T.x + b * L.x + c * R.x,\r\n y: a * T.y + b * L.y + c * R.y,\r\n };\r\n }\r\n\r\n /** 笛卡尔坐标(x,y)转三元坐标(a,b,c) */\r\n static c2t(px, py, tri) {\r\n const { top: T, left: L, right: R } = tri;\r\n const denom = (L.y - R.y) * (T.x - R.x) + (R.x - L.x) * (T.y - R.y);\r\n const a = ((L.y - R.y) * (px - R.x) + (R.x - L.x) * (py - R.y)) / denom;\r\n const b = ((R.y - T.y) * (px - R.x) + (T.x - R.x) * (py - R.y)) / denom;\r\n return { a, b, c: 1 - a - b };\r\n }\r\n\r\n /** 计算多边形像素面积 */\r\n static polyArea(pts) {\r\n let a = 0;\r\n for (let i = 0, n = pts.length; i < n; i++) {\r\n const j = (i + 1) % n;\r\n a += pts[i].x * pts[j].y - pts[j].x * pts[i].y;\r\n }\r\n return Math.abs(a) / 2;\r\n }\r\n\r\n /** 计算多边形质心 */\r\n static polyCentroid(pts) {\r\n const n = pts.length;\r\n let A = 0,\r\n cx = 0,\r\n cy = 0;\r\n for (let i = 0; i < n; i++) {\r\n const j = (i + 1) % n;\r\n const cross = pts[i].x * pts[j].y - pts[j].x * pts[i].y;\r\n A += cross;\r\n cx += (pts[i].x + pts[j].x) * cross;\r\n cy += (pts[i].y + pts[j].y) * cross;\r\n }\r\n A /= 2;\r\n return { x: cx / (6 * A), y: cy / (6 * A) };\r\n }\r\n\r\n /**\r\n * 解析并归一化数据点 (支持对象数组或原始数值数组)\r\n * 返回 [a, b, c] 比例数组,保证 a+b+c = 1\r\n */\r\n static resolveData(pt, sideOrder) {\r\n let raw = null;\r\n if (Array.isArray(pt)) {\r\n if (pt.length >= 3) {\r\n if (typeof pt[0] === 'object' && pt[0] !== null) {\r\n if (sideOrder) {\r\n raw = sideOrder.map(k => {\r\n const item = pt.find(d => d && d.name === k);\r\n return item ? item.value : 0;\r\n });\r\n } else {\r\n raw = [pt[0].value, pt[1].value, pt[2].value];\r\n }\r\n } else {\r\n raw = [pt[0], pt[1], pt[2]];\r\n }\r\n }\r\n } else if (pt && pt.value && Array.isArray(pt.value) && pt.value.length >= 3) {\r\n raw = [pt.value[0], pt.value[1], pt.value[2]];\r\n }\r\n\r\n if (!raw || raw.some((v) => typeof v !== 'number' || isNaN(v))) return null;\r\n\r\n const [v1, v2, v3] = raw.map(v => Math.max(0, v || 0));\r\n const sum = v1 + v2 + v3;\r\n if (sum <= 1e-9) return [0.3333, 0.3333, 0.3333];\r\n\r\n return [v1 / sum, v2 / sum, v3 / sum];\r\n }\r\n}\r\n\r\n/**\r\n * TriangleRenderer: Canvas 2D 绘图引擎\r\n * 职责:负责渲染逻辑,不存储业务状态,仅根据传入的渲染状态(State)进行绘制\r\n */\r\nexport class TriangleRenderer {\r\n constructor(ctx) {\r\n this.ctx = ctx;\r\n }\r\n\r\n /** 全量渲染入口 */\r\n render(state) {\r\n const ctx = this.ctx;\r\n const { W, H, dpr, scale, tx, ty, option, tri, zones, hoveredPoint } = state;\r\n\r\n ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n ctx.clearRect(0, 0, W * dpr, H * dpr);\r\n ctx.fillStyle = option.backgroundColor;\r\n ctx.fillRect(0, 0, W * dpr, H * dpr);\r\n\r\n // 应用 变换矩阵:DPR * (Zoom/Pan)\r\n ctx.setTransform(scale * dpr, 0, 0, scale * dpr, tx * dpr, ty * dpr);\r\n\r\n this.drawTriFill(tri);\r\n this.drawZones(zones, tri, option);\r\n this.drawGrid(option, tri);\r\n this.drawBorder(option, tri);\r\n this.drawSideLabels(option, tri);\r\n this.drawSeries(option, tri, hoveredPoint);\r\n\r\n ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n }\r\n\r\n drawTriFill(tri) {\r\n const ctx = this.ctx,\r\n { top, left, right } = tri;\r\n ctx.beginPath();\r\n ctx.moveTo(top.x, top.y);\r\n ctx.lineTo(left.x, left.y);\r\n ctx.lineTo(right.x, right.y);\r\n ctx.closePath();\r\n ctx.fillStyle = TriangleConfig.triFill;\r\n ctx.fill();\r\n }\r\n\r\n drawZones(zones, tri, option) {\r\n const ctx = this.ctx;\r\n const scale = this.ctx.getTransform().a / (window.devicePixelRatio || 1);\r\n\r\n // 1. Draw Backgrounds\r\n zones.forEach((zone) => {\r\n if (!zone.points || !zone.points.length) return;\r\n ctx.beginPath();\r\n zone.points.forEach(([a, b, c], i) => {\r\n const pt = TriangleMath.t2c(a, b, c, tri);\r\n i === 0 ? ctx.moveTo(pt.x, pt.y) : ctx.lineTo(pt.x, pt.y);\r\n });\r\n ctx.closePath();\r\n ctx.fillStyle = zone.color || 'transparent';\r\n ctx.fill();\r\n });\r\n\r\n // 2. Draw Borders\r\n const globalBorderStyle = option.zone?.borderStyle || {};\r\n zones.forEach((zone) => {\r\n const bStyle = deepMerge(deepMerge({}, globalBorderStyle), zone.borderStyle || {});\r\n if (bStyle.show === false || !zone.points || !zone.points.length) return;\r\n\r\n ctx.beginPath();\r\n zone.points.forEach(([a, b, c], i) => {\r\n const pt = TriangleMath.t2c(a, b, c, tri);\r\n i === 0 ? ctx.moveTo(pt.x, pt.y) : ctx.lineTo(pt.x, pt.y);\r\n });\r\n ctx.closePath();\r\n\r\n ctx.strokeStyle = bStyle.color || zone.borderColor || 'rgba(255,255,255,0.2)';\r\n ctx.lineWidth = (bStyle.width ?? bStyle.stroke ?? zone.borderWidth ?? 1.0) * scale;\r\n\r\n if (bStyle.type === 'dashed') {\r\n ctx.setLineDash([4, 4]);\r\n } else if (bStyle.type === 'dotted') {\r\n ctx.setLineDash([2, 4]);\r\n } else {\r\n ctx.setLineDash([]);\r\n }\r\n ctx.stroke();\r\n });\r\n ctx.setLineDash([]);\r\n\r\n // 3. Draw Labels\r\n const showLabel = option.showZoneLabel !== false;\r\n if (!showLabel) return;\r\n\r\n const ff = option.grid?.labelStyle?.fontFamily || 'Microsoft YaHei UI, monospace';\r\n\r\n const globalLabelStyle = option.zone?.labelStyle || {};\r\n zones.forEach((zone) => {\r\n const lStyle = deepMerge(deepMerge({}, globalLabelStyle), zone.labelStyle || {});\r\n if (lStyle.show === false || !zone.id) return;\r\n\r\n const lab = zone.labelPos;\r\n if (!lab) return;\r\n const centPx = TriangleMath.t2c(lab.a, lab.b, lab.c, tri);\r\n\r\n const fs = Math.round((lStyle.fontSize || 11) * scale);\r\n const fontStyle = lStyle.fontStyle || 'bold';\r\n ctx.font = `${fontStyle} ${fs}px ${ff}`;\r\n\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n const text = zone.id;\r\n const tw = ctx.measureText(text).width;\r\n const th = fs;\r\n\r\n let lx = centPx.x;\r\n let ly = centPx.y;\r\n\r\n if (lStyle.backgroundColor && lStyle.backgroundColor !== 'transparent') {\r\n let padX = 4, padY = 4;\r\n if (Array.isArray(lStyle.padding)) {\r\n padY = lStyle.padding[0];\r\n padX = lStyle.padding[1] !== undefined ? lStyle.padding[1] : padY;\r\n } else if (typeof lStyle.padding === 'number') {\r\n padX = padY = lStyle.padding;\r\n }\r\n padX *= scale;\r\n padY *= scale;\r\n\r\n const radius = (lStyle.borderRadius || 3) * scale;\r\n const bw = tw + padX * 2;\r\n const bh = th + padY * 2;\r\n const bx = lx - bw / 2;\r\n const by = ly - bh / 2;\r\n\r\n ctx.fillStyle = lStyle.backgroundColor;\r\n ctx.beginPath();\r\n if (ctx.roundRect) {\r\n ctx.roundRect(bx, by, bw, bh, radius);\r\n } else {\r\n ctx.rect(bx, by, bw, bh);\r\n }\r\n ctx.fill();\r\n }\r\n\r\n if (lStyle.textShadow && lStyle.textShadow !== 'none') {\r\n ctx.shadowColor = lStyle.textShadow;\r\n ctx.shadowBlur = 4;\r\n } else {\r\n ctx.shadowColor = 'transparent';\r\n ctx.shadowBlur = 0;\r\n }\r\n\r\n ctx.fillStyle = lStyle.color || zone.labelColor || '#fff';\r\n ctx.fillText(text, lx, ly);\r\n\r\n ctx.shadowBlur = 0;\r\n ctx.shadowColor = 'transparent';\r\n });\r\n ctx.textBaseline = 'alphabetic';\r\n }\r\n\r\n drawBadge(cx, cy, tw, textColor, bgColor) {\r\n const ctx = this.ctx,\r\n { badgePadding: pad, badgeHeight: h, badgeRadius: r } = TriangleConfig.ZONE_VIS;\r\n const w = tw + pad * 2,\r\n x = cx - w / 2,\r\n y = cy - h / 2;\r\n ctx.beginPath();\r\n if (ctx.roundRect) ctx.roundRect(x, y, w, h, r);\r\n else ctx.rect(x, y, w, h);\r\n ctx.fillStyle = bgColor;\r\n ctx.fill();\r\n }\r\n\r\n drawArrow(fx, fy, tx, ty, color) {\r\n const ctx = this.ctx,\r\n dx = tx - fx,\r\n dy = ty - fy,\r\n len = Math.hypot(dx, dy);\r\n if (len < 1) return;\r\n const ux = dx / len,\r\n uy = dy / len,\r\n sz = 7;\r\n ctx.beginPath();\r\n ctx.moveTo(tx, ty);\r\n ctx.lineTo(tx - ux * sz + uy * sz * 0.5, ty - uy * sz - ux * sz * 0.5);\r\n ctx.lineTo(tx - ux * sz - uy * sz * 0.5, ty - uy * sz + ux * sz * 0.5);\r\n ctx.closePath();\r\n ctx.fillStyle = color;\r\n ctx.fill();\r\n }\r\n\r\n drawGrid(option, tri) {\r\n if (!option.grid || !option.grid.show) return;\r\n const ctx = this.ctx;\r\n const grid = option.grid;\r\n const steps = grid.steps || 10;\r\n const majorEvery = grid.majorEvery || 2;\r\n const lineStyle = grid.lineStyle || { color: 'rgba(255,255,255,0.1)', width: 1, type: 'solid' };\r\n const majorLineStyle = grid.majorLineStyle || { color: 'rgba(255,255,255,0.2)', width: 1, type: 'solid' };\r\n\r\n const scale = this.ctx.getTransform().a / (window.devicePixelRatio || 1);\r\n\r\n const getNormal = (p1, p2, inwardPt) => {\r\n let dx = p2.x - p1.x, dy = p2.y - p1.y;\r\n const len = Math.hypot(dx, dy);\r\n dx /= len; dy /= len;\r\n const n1 = { x: -dy, y: dx }, n2 = { x: dy, y: -dx };\r\n return ((inwardPt.x - p1.x) * n1.x + (inwardPt.y - p1.y) * n1.y > 0) ? n1 : n2;\r\n };\r\n const { top, left, right } = tri;\r\n const normals = {\r\n bottom: getNormal(left, right, top),\r\n left: getNormal(left, top, right),\r\n right: getNormal(right, top, left)\r\n };\r\n\r\n for (let i = 1; i < steps; i++) {\r\n const t = i / steps,\r\n isMajor = i % majorEvery === 0;\r\n const currentStyle = isMajor ? majorLineStyle : lineStyle;\r\n\r\n ctx.strokeStyle = currentStyle.color || 'transparent';\r\n ctx.lineWidth = (currentStyle.width ?? 1) * scale;\r\n\r\n if (currentStyle.type === 'dashed') {\r\n ctx.setLineDash([4, 4]);\r\n } else if (currentStyle.type === 'dotted') {\r\n ctx.setLineDash([2, 4]);\r\n } else {\r\n ctx.setLineDash([]);\r\n }\r\n const ln = (p1, p2) => {\r\n ctx.beginPath();\r\n ctx.moveTo(p1.x, p1.y);\r\n ctx.lineTo(p2.x, p2.y);\r\n ctx.stroke();\r\n };\r\n ln(TriangleMath.t2c(t, 1 - t, 0, tri), TriangleMath.t2c(t, 0, 1 - t, tri));\r\n ln(TriangleMath.t2c(1 - t, t, 0, tri), TriangleMath.t2c(0, t, 1 - t, tri));\r\n ln(TriangleMath.t2c(1 - t, 0, t, tri), TriangleMath.t2c(0, 1 - t, t, tri));\r\n this.drawSideTick(i, steps, t, option, tri, isMajor, normals);\r\n }\r\n }\r\n\r\n drawSideTick(i, steps, t, option, tri, isMajor, normals) {\r\n const sOpt = option.side || {};\r\n const tStyle = sOpt.tickStyle || {};\r\n if (tStyle.show === false) return;\r\n\r\n const ctx = this.ctx,\r\n val = Math.round((i * 100) / steps);\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n\r\n const tickLen = tStyle.length || 6;\r\n const tickLineColor = tStyle.lineColor || 'rgba(0,0,0,0.2)';\r\n const tickColor = tStyle.color || 'rgba(200,220,255)';\r\n const offset = tStyle.offset !== undefined ? tStyle.offset : 15;\r\n const ff = tStyle.fontFamily || 'Microsoft YaHei UI, sans-serif';\r\n const fs = tStyle.fontSize || 14;\r\n const fw = tStyle.fontWeight || 'normal';\r\n const font = `${fw} ${fs}px ${ff}`;\r\n\r\n const drawLine = (p, nx, ny) => {\r\n ctx.beginPath();\r\n ctx.moveTo(p.x, p.y);\r\n ctx.lineTo(p.x + nx * tickLen, p.y + ny * tickLen);\r\n ctx.strokeStyle = tickLineColor;\r\n ctx.lineWidth = 1.5;\r\n ctx.stroke();\r\n };\r\n\r\n const p0 = TriangleMath.t2c(t, 1 - t, 0, tri);\r\n drawLine(p0, normals.left.x, normals.left.y);\r\n if (isMajor) {\r\n ctx.fillStyle = tickColor;\r\n ctx.font = font;\r\n ctx.save();\r\n ctx.translate(p0.x - offset, p0.y - 8);\r\n ctx.rotate(-Math.PI / 3);\r\n ctx.fillText(val + '', 0, 0);\r\n ctx.restore();\r\n }\r\n\r\n const p2 = TriangleMath.t2c(1 - t, 0, t, tri);\r\n drawLine(p2, normals.right.x, normals.right.y);\r\n if (isMajor) {\r\n ctx.fillStyle = tickColor;\r\n ctx.font = font;\r\n ctx.save();\r\n ctx.translate(p2.x + offset, p2.y - 8);\r\n ctx.rotate(Math.PI / 3);\r\n ctx.fillText(val + '', 0, 0);\r\n ctx.restore();\r\n }\r\n\r\n const p1 = TriangleMath.t2c(0, t, 1 - t, tri);\r\n drawLine(p1, normals.bottom.x, normals.bottom.y);\r\n if (isMajor) {\r\n ctx.fillStyle = tickColor;\r\n ctx.font = font;\r\n ctx.fillText(val + '', p1.x, p1.y + offset);\r\n }\r\n }\r\n\r\n drawBorder(option, tri) {\r\n const ctx = this.ctx,\r\n { top, left, right } = tri,\r\n sOpt = option.side || {};\r\n const lStyle = sOpt.lineStyle || { color: 'rgba(180,210,255,0.1)', width: 1.5, type: 'solid' };\r\n const edges = [\r\n { f: top, t: left },\r\n { f: top, t: right },\r\n { f: left, t: right },\r\n ];\r\n edges.forEach(({ f, t }) => {\r\n ctx.beginPath();\r\n ctx.moveTo(f.x, f.y);\r\n ctx.lineTo(t.x, t.y);\r\n ctx.strokeStyle = lStyle.color || 'transparent';\r\n ctx.lineWidth = lStyle.width || 1;\r\n if (lStyle.type === 'dashed') ctx.setLineDash([4, 4]);\r\n else if (lStyle.type === 'dotted') ctx.setLineDash([2, 4]);\r\n else ctx.setLineDash([]);\r\n ctx.stroke();\r\n });\r\n ctx.setLineDash([]);\r\n }\r\n\r\n drawSideLabels(option, tri) {\r\n if (option.side?.show === false) return;\r\n const ctx = this.ctx,\r\n { top, left, right } = tri,\r\n sOpt = option.side || {};\r\n\r\n const names = sOpt.data || ['A', 'B', 'C'];\r\n const lStyle = sOpt.labelStyle || {};\r\n const ff = lStyle.fontFamily || 'Microsoft YaHei UI, sans-serif';\r\n const fs = lStyle.fontSize || 14;\r\n const fw = lStyle.fontWeight || 'bold';\r\n const color = lStyle.color || '#00e5ff';\r\n const offset = lStyle.offset !== undefined ? lStyle.offset : 40;\r\n\r\n ctx.textBaseline = 'middle';\r\n ctx.textAlign = 'center';\r\n ctx.fillStyle = color;\r\n ctx.font = `${fw} ${fs}px ${ff}`;\r\n\r\n const lMid = { x: (top.x + left.x) / 2, y: (top.y + left.y) / 2 },\r\n lDx = left.x - top.x,\r\n lDy = left.y - top.y,\r\n lLen = Math.hypot(lDx, lDy);\r\n ctx.save();\r\n ctx.translate(lMid.x + (-lDy / lLen) * offset, lMid.y + (lDx / lLen) * offset);\r\n ctx.rotate(Math.atan2(lDy, lDx) + Math.PI);\r\n ctx.fillText((names[1] || 'B') + ' (%)', 0, 0);\r\n ctx.restore();\r\n\r\n const rMid = { x: (top.x + right.x) / 2, y: (top.y + right.y) / 2 },\r\n rDx = right.x - top.x,\r\n rDy = right.y - top.y,\r\n rLen = Math.hypot(rDx, rDy);\r\n ctx.save();\r\n ctx.translate(rMid.x + (rDy / rLen) * offset, rMid.y + (-rDx / rLen) * offset);\r\n ctx.rotate(Math.atan2(rDy, rDx));\r\n ctx.fillText((names[2] || 'C') + ' (%)', 0, 0);\r\n ctx.restore();\r\n\r\n ctx.save();\r\n ctx.translate((left.x + right.x) / 2, (left.y + right.y) / 2 + offset);\r\n ctx.fillText((names[0] || 'A') + ' (%)', 0, 0);\r\n ctx.restore();\r\n }\r\n\r\n drawSeries(option, tri, hoveredPoint) {\r\n const ctx = this.ctx;\r\n const scale = this.ctx.getTransform().a / (window.devicePixelRatio || 1);\r\n const ff = 'Microsoft YaHei UI, sans-serif';\r\n const sideOrder = option.side?.data;\r\n\r\n (option.series || []).forEach((s) => {\r\n const pt = s.data;\r\n if (!pt || pt.length === 0) return;\r\n\r\n const ptName = s.name;\r\n const ratio = TriangleMath.resolveData(pt, sideOrder);\r\n if (!ratio) return;\r\n\r\n const canvasPt = TriangleMath.t2c(ratio[0], ratio[1], ratio[2], tri);\r\n const px = canvasPt.x;\r\n const py = canvasPt.y;\r\n\r\n const isHov = hoveredPoint && hoveredPoint.series === s;\r\n\r\n const shape = s.shape || 'circle';\r\n const color = s.color || '#409eff';\r\n let size = s.size !== undefined ? s.size : 5;\r\n if (isHov) size *= 1.5;\r\n\r\n const globalItemStyle = s.itemStyle || {};\r\n const borderColor = globalItemStyle.borderColor || '#fff';\r\n const borderWidth = globalItemStyle.borderWidth !== undefined ? globalItemStyle.borderWidth : 1;\r\n const opacity = globalItemStyle.opacity !== undefined ? globalItemStyle.opacity : 1;\r\n\r\n const globalTextStyle = s.textStyle || {};\r\n const textShow = globalTextStyle.show !== undefined ? globalTextStyle.show : true;\r\n const textColor = globalTextStyle.color || color;\r\n const textFontSize = globalTextStyle.fontSize !== undefined ? globalTextStyle.fontSize : 12;\r\n const textFontWeight = globalTextStyle.fontWeight || 'normal';\r\n const textPosition = globalTextStyle.position || 'top';\r\n const textOffset = globalTextStyle.offset || [0, 0];\r\n\r\n const globalGlowStyle = s.glowStyle || {};\r\n const glowShow = globalGlowStyle.show !== undefined ? globalGlowStyle.show : false;\r\n const glowColorsOpt = globalGlowStyle.colors;\r\n const glowBlur = globalGlowStyle.blur !== undefined ? globalGlowStyle.blur : 15;\r\n const glowStartColor = globalGlowStyle.startColor || color;\r\n const glowEndColor = globalGlowStyle.endColor || 'transparent';\r\n const glowCount = globalGlowStyle.count !== undefined ? globalGlowStyle.count : 3;\r\n const glowDistance = globalGlowStyle.glowDistance !== undefined ? globalGlowStyle.glowDistance : 2;\r\n\r\n ctx.save();\r\n ctx.globalAlpha = opacity;\r\n\r\n // Glow Style Rendering\r\n if (glowShow) {\r\n ctx.shadowColor = glowColorsOpt ? glowColorsOpt[0] : glowStartColor;\r\n ctx.shadowBlur = glowBlur;\r\n\r\n let glowColors = [];\r\n let layers = glowCount;\r\n\r\n if (Array.isArray(glowColorsOpt) && glowColorsOpt.length > 0) {\r\n glowColors = glowColorsOpt;\r\n layers = glowColors.length;\r\n } else {\r\n for (let i = 0; i < layers; i++) {\r\n const factor = layers > 1 ? i / (layers - 1) : 0;\r\n glowColors.push(interpolateColor(glowStartColor, glowEndColor, factor));\r\n }\r\n }\r\n\r\n for (let i = layers - 1; i >= 0; i--) {\r\n const glowColor = glowColors[i];\r\n ctx.save();\r\n ctx.fillStyle = glowColor;\r\n ctx.beginPath();\r\n drawShapePath(ctx, px, py, shape, size, scale, (i + 1) * glowDistance);\r\n ctx.fill();\r\n ctx.restore();\r\n }\r\n }\r\n\r\n // Point Shape Rendering\r\n ctx.beginPath();\r\n drawShapePath(ctx, px, py, shape, size, scale, 0);\r\n\r\n if (shape === 'ring') {\r\n ctx.strokeStyle = color;\r\n ctx.lineWidth = borderWidth * scale;\r\n ctx.stroke();\r\n } else {\r\n ctx.fillStyle = color;\r\n ctx.fill();\r\n if (borderWidth > 0) {\r\n ctx.strokeStyle = borderColor;\r\n ctx.lineWidth = borderWidth * scale;\r\n ctx.stroke();\r\n }\r\n }\r\n ctx.restore();\r\n\r\n // Text/Label Rendering\r\n if (textShow && ptName) {\r\n ctx.save();\r\n ctx.globalAlpha = opacity;\r\n ctx.font = `${textFontWeight} ${Math.round(textFontSize * scale)}px ${ff}`;\r\n ctx.fillStyle = textColor;\r\n\r\n let textAlign = 'center';\r\n let textBaseline = 'middle';\r\n let tx = px + textOffset[0] * scale;\r\n let ty = py + textOffset[1] * scale;\r\n\r\n let offsetVal = 6 * scale;\r\n if (shape === 'circle' || shape === 'ring' || shape === 'star' || shape === 'triangle') {\r\n offsetVal += size * scale;\r\n } else if (shape === 'square') {\r\n offsetVal += size * scale / 2;\r\n }\r\n\r\n if (textPosition === 'top') {\r\n textAlign = 'center';\r\n textBaseline = 'bottom';\r\n ty -= offsetVal;\r\n } else if (textPosition === 'bottom') {\r\n textAlign = 'center';\r\n textBaseline = 'top';\r\n ty += offsetVal;\r\n } else if (textPosition === 'left') {\r\n textAlign = 'right';\r\n textBaseline = 'middle';\r\n tx -= offsetVal;\r\n } else if (textPosition === 'right') {\r\n textAlign = 'left';\r\n textBaseline = 'middle';\r\n tx += offsetVal;\r\n } else if (textPosition === 'center') {\r\n textAlign = 'center';\r\n textBaseline = 'middle';\r\n }\r\n\r\n ctx.textAlign = textAlign;\r\n ctx.textBaseline = textBaseline;\r\n ctx.fillText(ptName, tx, ty);\r\n ctx.restore();\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * DuvalTriangle: 顶层管理类\r\n * 职责:负责 DOM 初始化、Tooltip 管理、状态维护(Zoom/Pan)、响应式 Resize 及事件分发\r\n */\r\nexport class DuvalTriangle {\r\n constructor(containerIdOrEl, option = {}) {\r\n this.initDOM(containerIdOrEl);\r\n this.renderer = new TriangleRenderer(this.ctx);\r\n\r\n this.state = {\r\n W: 0,\r\n H: 0,\r\n dpr: 1,\r\n scale: 1,\r\n tx: 0,\r\n ty: 0,\r\n option: {},\r\n tri: {},\r\n zones: [],\r\n hoveredPoint: null,\r\n };\r\n \r\n this._zoom = new ZoomController(option.zoom);\r\n\r\n this.events = { click: null, viewChange: null, hover: null };\r\n\r\n this._initTooltip();\r\n this.bindEvents();\r\n\r\n this.ro = new ResizeObserver(() => this.fitCanvas());\r\n this.ro.observe(this.container);\r\n\r\n this.fitCanvas();\r\n if (Object.keys(option).length) this.setOption(option);\r\n }\r\n\r\n initDOM(containerIdOrEl) {\r\n let el = typeof containerIdOrEl === 'string' ? document.getElementById(containerIdOrEl) : containerIdOrEl;\r\n if (!el) throw new Error('DuvalTriangle: container not found');\r\n this.container = el.tagName.toLowerCase() === 'canvas' ? el.parentElement || el : el;\r\n this.canvas = el.tagName.toLowerCase() === 'canvas' ? el : document.createElement('canvas');\r\n if (el.tagName.toLowerCase() !== 'canvas') {\r\n this.container.style.position = this.container.style.position || 'relative';\r\n this.canvas.style.cssText = 'display:block;width:100%;height:100%;cursor:default;';\r\n this.container.appendChild(this.canvas);\r\n }\r\n this.ctx = this.canvas.getContext('2d');\r\n }\r\n\r\n _initTooltip() {\r\n const tooltipCfg = this.state.option.tooltip || TriangleConfig.tooltip;\r\n this._tooltip = new DOMTooltip(this.container, {\r\n tooltipBg: tooltipCfg.backgroundColor || 'rgba(5,13,26,0.95)',\r\n tooltipTextColor: tooltipCfg.textStyle?.color || '#c8d8e8',\r\n tooltipPadding: tooltipCfg.padding || 10,\r\n zoneBorderColor: tooltipCfg.borderColor || '#00e5ff',\r\n fontFamily: 'monospace',\r\n });\r\n this._tooltip.el.style.whiteSpace = 'nowrap';\r\n this._tooltip.el.style.lineHeight = '1.6';\r\n }\r\n\r\n setOption(option) {\r\n if (!this.state.option || !Object.keys(this.state.option).length) {\r\n this.state.option = deepMerge(deepMerge({}, TriangleConfig), option);\r\n } else {\r\n deepMerge(this.state.option, option);\r\n }\r\n this._normalizeOptions();\r\n this.computeGeometry();\r\n this.buildZonePaths();\r\n this.render();\r\n }\r\n\r\n _normalizeOptions() {\r\n const opt = this.state.option;\r\n\r\n // Backward compatibility for `vertex` -> `side`\r\n if (opt.vertex && !opt.side) {\r\n opt.side = opt.vertex;\r\n delete opt.vertex;\r\n }\r\n\r\n // Backward compatibility for `axes` -> `side.data`\r\n if (opt.axes && Array.isArray(opt.axes)) {\r\n if (!opt.side) opt.side = {};\r\n opt.side.data = opt.axes.map((ax) => (typeof ax === 'object' ? ax.name : ax));\r\n delete opt.axes;\r\n }\r\n // Backward compatibility for `axisStyle` -> `side`\r\n if (opt.axisStyle) {\r\n if (!opt.side) opt.side = {};\r\n deepMerge(opt.side, opt.axisStyle);\r\n delete opt.axisStyle;\r\n }\r\n // Ensure side data exists\r\n if (!opt.side) opt.side = {};\r\n if (!opt.side.data || opt.side.data.length < 3) {\r\n opt.side.data = ['A', 'B', 'C'];\r\n }\r\n\r\n // Backward compatibility for `zones` -> `zone.data`\r\n if (opt.zones && Array.isArray(opt.zones)) {\r\n if (!opt.zone) opt.zone = {};\r\n opt.zone.data = opt.zones;\r\n delete opt.zones;\r\n }\r\n\r\n // Normalize Tooltip\r\n if (opt.showTooltip !== undefined) {\r\n if (!opt.tooltip) opt.tooltip = {};\r\n opt.tooltip.show = opt.showTooltip;\r\n }\r\n }\r\n\r\n computeGeometry() {\r\n const dpr = window.devicePixelRatio || 1;\r\n this.state.W = this.canvas.width / dpr;\r\n this.state.H = this.canvas.height / dpr;\r\n this.state.dpr = dpr;\r\n\r\n const padding = this.state.option.padding ?? 45;\r\n const grid = this.state.option.grid || {};\r\n const box = parseGridBox(this.state.W, this.state.H, grid, padding);\r\n this.state.tri = TriangleMath.computeTri(box);\r\n }\r\n\r\n buildZonePaths() {\r\n const { option, tri } = this.state;\r\n const zoneData = option.zone?.data || [];\r\n this.state.zones = zoneData.map((z) => {\r\n const nz = { ...z };\r\n // 预构建 Path2D\r\n const path = new Path2D();\r\n z.points.forEach(([pa, pb, pc], i) => {\r\n const ppt = TriangleMath.t2c(pa, pb, pc, tri);\r\n i === 0 ? path.moveTo(ppt.x, ppt.y) : path.lineTo(ppt.x, ppt.y);\r\n });\r\n path.closePath();\r\n nz.path = path;\r\n\r\n // 预构建标签位置\r\n if (z.labelAt) {\r\n nz.labelPos = { a: z.labelAt[0], b: z.labelAt[1], c: z.labelAt[2] };\r\n } else {\r\n const pts = z.points.map((p) => TriangleMath.t2c(p[0], p[1], p[2], tri));\r\n const cen = TriangleMath.polyCentroid(pts);\r\n const t = TriangleMath.c2t(cen.x, cen.y, tri);\r\n nz.labelPos = { a: t.a, b: t.b, c: t.c };\r\n }\r\n return nz;\r\n });\r\n }\r\n\r\n fitCanvas() {\r\n const dpr = window.devicePixelRatio || 1;\r\n const aW = this.container.clientWidth || 400,\r\n aH = this.container.clientHeight || 400;\r\n \r\n this.canvas.width = Math.round(aW * dpr);\r\n this.canvas.height = Math.round(aH * dpr);\r\n // 不再通过内联覆盖宽高,直接继承初始化时的宽高\r\n this.canvas.style.width = aW + 'px';\r\n this.canvas.style.height = aH + 'px';\r\n this.state.scale = 1;\r\n this.state.tx = 0;\r\n this.state.ty = 0;\r\n if (this._zoom) this._zoom.reset();\r\n if (Object.keys(this.state.option).length) {\r\n this.computeGeometry();\r\n this.buildZonePaths();\r\n this.render();\r\n }\r\n }\r\n\r\n render() {\r\n this.state.scale = this._zoom.zoom;\r\n this.state.tx = this._zoom.panX;\r\n this.state.ty = this._zoom.panY;\r\n this.renderer.render(this.state);\r\n }\r\n\r\n bindEvents() {\r\n const cv = this.canvas;\r\n\r\n this._onWheel = (e) => {\r\n e.preventDefault();\r\n const rect = cv.getBoundingClientRect();\r\n const ax = (e.clientX - rect.left) * (this.state.W / rect.width);\r\n const ay = (e.clientY - rect.top) * (this.state.H / rect.height);\r\n this._zoom.onWheel(e.deltaY, ax, ay);\r\n if (typeof this.events.viewChange === 'function') {\r\n this.events.viewChange(this._zoom.state);\r\n }\r\n this.render();\r\n };\r\n\r\n this._onDown = (e) => {\r\n if (e.button !== 0) return;\r\n const rect = cv.getBoundingClientRect();\r\n const scaleX = this.state.W / rect.width;\r\n const scaleY = this.state.H / rect.height;\r\n this._zoom.startDrag(e.clientX * scaleX, e.clientY * scaleY);\r\n cv.style.cursor = 'grabbing';\r\n };\r\n\r\n this._onMove = (e) => {\r\n const rect = cv.getBoundingClientRect();\r\n const scaleX = this.state.W / rect.width;\r\n const scaleY = this.state.H / rect.height;\r\n if (this._zoom.moveDrag(e.clientX * scaleX, e.clientY * scaleY, 1)) {\r\n this.render();\r\n return;\r\n }\r\n this.handleMouseMove(e);\r\n };\r\n\r\n this._onUp = () => {\r\n if (!this._zoom.endDrag()) return;\r\n cv.style.cursor = this.state.hoveredPoint ? 'pointer' : 'default';\r\n if (typeof this.events.viewChange === 'function') {\r\n this.events.viewChange(this._zoom.state);\r\n }\r\n };\r\n\r\n this._onLeave = () => {\r\n this.hideTooltip();\r\n this.state.hoveredPoint = null;\r\n if (typeof this.events.hover === 'function') {\r\n this.events.hover(null);\r\n }\r\n this.render();\r\n };\r\n\r\n this._onDbl = () => {\r\n this._zoom.reset();\r\n if (typeof this.events.viewChange === 'function') {\r\n this.events.viewChange(this._zoom.state);\r\n }\r\n this.render();\r\n };\r\n\r\n cv.addEventListener('wheel', this._onWheel, { passive: false });\r\n cv.addEventListener('mousedown', this._onDown);\r\n cv.addEventListener('mousemove', this._onMove);\r\n cv.addEventListener('mouseleave', this._onLeave);\r\n cv.addEventListener('dblclick', this._onDbl);\r\n cv.addEventListener('click', this.handleClick.bind(this));\r\n window.addEventListener('mouseup', this._onUp);\r\n }\r\n\r\n handleMouseMove(e) {\r\n const r = this.canvas.getBoundingClientRect();\r\n const scaleX = this.state.W / r.width;\r\n const scaleY = this.state.H / r.height;\r\n const cx = (e.clientX - r.left) * scaleX;\r\n const cy = (e.clientY - r.top) * scaleY;\r\n \r\n const x = (cx - this._zoom.panX) / this._zoom.zoom;\r\n const y = (cy - this._zoom.panY) / this._zoom.zoom;\r\n const { a, b, c } = TriangleMath.c2t(x, y, this.state.tri);\r\n if (a < -1e-7 || b < -1e-7 || c < -1e-7) {\r\n this.hideTooltip();\r\n if (this.state.hoveredPoint !== null) {\r\n this.state.hoveredPoint = null;\r\n this.canvas.style.cursor = 'default';\r\n this.render();\r\n }\r\n return;\r\n }\r\n\r\n let nearest = null,\r\n minDist = 14;\r\n const sideOrder = this.state.option.side?.data;\r\n (this.state.option.series || []).forEach((s) => {\r\n const ptData = s.data;\r\n if (!ptData) return;\r\n const ratio = TriangleMath.resolveData(ptData, sideOrder);\r\n if (!ratio) return;\r\n const pt = TriangleMath.t2c(...ratio, this.state.tri),\r\n d = Math.hypot(pt.x - x, pt.y - y);\r\n if (d < minDist) {\r\n minDist = d;\r\n nearest = { series: s, raw: ratio };\r\n }\r\n });\r\n if (nearest !== this.state.hoveredPoint) {\r\n this.state.hoveredPoint = nearest;\r\n this.canvas.style.cursor = nearest ? 'pointer' : 'default';\r\n this.render();\r\n }\r\n this.showTooltip(x, y, a, b, c);\r\n }\r\n\r\n handleClick(e) {\r\n if (this._zoom.isDragging) return;\r\n const r = this.canvas.getBoundingClientRect();\r\n const scaleX = this.state.W / r.width;\r\n const scaleY = this.state.H / r.height;\r\n const cx = (e.clientX - r.left) * scaleX;\r\n const cy = (e.clientY - r.top) * scaleY;\r\n\r\n const x = (cx - this._zoom.panX) / this._zoom.zoom;\r\n const y = (cy - this._zoom.panY) / this._zoom.zoom;\r\n const { a, b, c } = TriangleMath.c2t(x, y, this.state.tri);\r\n if (a < -1e-7 || b < -1e-7 || c < -1e-7) return;\r\n const zone = this.getZoneAt(a, b, c);\r\n if (typeof this.events.click === 'function') {\r\n this.events.click({ a, b, c, zone });\r\n }\r\n this.canvas.dispatchEvent(\r\n new CustomEvent('triangle:click', { detail: { a, b, c, zone }, bubbles: true })\r\n );\r\n }\r\n\r\n showTooltip(x, y, a, b, c) {\r\n const tOpt = this.state.option.tooltip || {};\r\n if (tOpt.show === false || (!this.state.hoveredPoint && tOpt.showDiagnostic === false)) {\r\n this.hideTooltip();\r\n return;\r\n }\r\n const foundZone = this.getZoneAt(a, b, c);\r\n const side = this.state.option.side || {};\r\n const sNames = side.data || ['A', 'B', 'C'];\r\n \r\n // 触发外部 hover 事件,对齐五边形返回的内容\r\n if (typeof this.events.hover === 'function') {\r\n this.events.hover({\r\n ratio: [a, b, c],\r\n zone: foundZone,\r\n point: this.state.hoveredPoint?.series || null,\r\n });\r\n }\r\n\r\n if (tOpt.formatter) {\r\n const html = tOpt.formatter({\r\n a, b, c, sNames, zone: foundZone,\r\n point: this.state.hoveredPoint?.series,\r\n });\r\n const docX = x * this._zoom.zoom + this._zoom.panX;\r\n const docY = y * this._zoom.zoom + this._zoom.panY;\r\n this._tooltip.show(html, docX, docY, tOpt, {}, foundZone);\r\n return;\r\n }\r\n\r\n const html = this._defaultTooltipHTML(a, b, c, sNames, foundZone);\r\n const docX = x * this._zoom.zoom + this._zoom.panX;\r\n const docY = y * this._zoom.zoom + this._zoom.panY;\r\n \r\n // 补偿 canvas 在容器内的偏移\r\n const canvasRect = this.canvas.getBoundingClientRect();\r\n const containerRect = this.container.getBoundingClientRect();\r\n const offsetX = canvasRect.left - containerRect.left;\r\n const offsetY = canvasRect.top - containerRect.top;\r\n \r\n this._tooltip.show(html, docX + offsetX, docY + offsetY, tOpt, {}, foundZone);\r\n }\r\n\r\n hideTooltip() {\r\n if (this._tooltip) this._tooltip.hide();\r\n }\r\n\r\n getZoneAt(a, b, c) {\r\n const pt = TriangleMath.t2c(a, b, c, this.state.tri);\r\n const ctx = this.ctx;\r\n ctx.save();\r\n ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n const found = (this.state.zones || []).find((z) => z.path && ctx.isPointInPath(z.path, pt.x, pt.y));\r\n ctx.restore();\r\n return found;\r\n }\r\n\r\n resetZoom() {\r\n this.state.scale = 1;\r\n this.state.tx = 0;\r\n this.state.ty = 0;\r\n this.render();\r\n if (typeof this.events.viewChange === 'function') {\r\n this.events.viewChange({ scale: this.state.scale, tx: this.state.tx, ty: this.state.ty });\r\n }\r\n }\r\n dispose() {\r\n this.ro?.disconnect();\r\n this._tooltip?.dispose();\r\n this.canvas?.remove();\r\n }\r\n\r\n /**\r\n * 默认 tooltip HTML 生成\r\n * @private\r\n */\r\n _defaultTooltipHTML(a, b, c, sNames, zone) {\r\n const hovered = this.state.hoveredPoint;\r\n const tOpt = this.state.option.tooltip || {};\r\n const showPoint = tOpt.showPoint !== false;\r\n const showDiagnostic = tOpt.showDiagnostic !== false;\r\n\r\n let pointNameStr = '';\r\n if (hovered && showPoint) {\r\n let ptName = hovered.series?.name || '';\r\n if (ptName) {\r\n pointNameStr = `<div style=\"font-size:14px; font-weight:bold; margin-bottom:4px; color:#fff;\">${ptName}</div>`;\r\n }\r\n }\r\n\r\n const zoneStr = zone ? `${zone.name || zone.id} ${zone.desc || zone.title || ''}` : 'Outside';\r\n const zoneColor = zone ? (zone.color?.replace(/[\\d.]+\\)$/, '1)') || '#fff') : '#fff';\r\n \r\n let html = `\r\n ${pointNameStr}\r\n ${zoneStr ? `<div style=\"color:${zoneColor}; font-size:13px; font-weight:bold; padding-bottom:8px; margin-bottom:8px; border-bottom:1px solid rgba(255,255,255,0.07);\">${zoneStr}</div>` : ''}\r\n `;\r\n\r\n const axisColors = ['#00e5ff', '#ff6b35', '#ffcc02'];\r\n const item = hovered?.series?.data;\r\n \r\n if (showPoint || (!showPoint && !showDiagnostic)) {\r\n sNames.forEach((name, i) => {\r\n const col = axisColors[i % 3];\r\n \r\n let rawValStr = '-';\r\n if (item) {\r\n if (Array.isArray(item)) {\r\n rawValStr = item[i] !== undefined ? item[i] : '-';\r\n } else if (typeof item === 'object') {\r\n if (item.value && Array.isArray(item.value)) {\r\n rawValStr = item.value[i] !== undefined ? item.value[i] : '-';\r\n } else if (item[name] !== undefined) {\r\n rawValStr = item[name];\r\n }\r\n }\r\n }\r\n\r\n html += `\r\n <div style=\"display:flex; align-items:center; margin-bottom:6px; font-size:13px;\">\r\n <span style=\"display:inline-block; width:8px; height:8px; border-radius:50%; background-color:${col}; margin-right:8px;\"></span>\r\n <span style=\"color:#cbd5e1; flex-grow:1;\">${name}</span>\r\n <span style=\"color:#fff; font-weight:bold; margin-left:20px;\">${rawValStr}</span>\r\n </div>\r\n `;\r\n });\r\n }\r\n\r\n return html;\r\n }\r\n}\r\n\r\nfunction parseRgba(color) {\r\n const cleaned = color.trim().toLowerCase();\r\n if (cleaned.startsWith('#')) {\r\n let hex = cleaned.slice(1);\r\n if (hex.length === 3) {\r\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\r\n }\r\n const r = parseInt(hex.substring(0, 2), 16);\r\n const g = parseInt(hex.substring(2, 4), 16);\r\n const b = parseInt(hex.substring(4, 6), 16);\r\n const a = hex.length === 8 ? parseInt(hex.substring(6, 8), 16) / 255 : 1;\r\n return [r, g, b, a];\r\n }\r\n const m = cleaned.match(/rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\)/);\r\n if (m) {\r\n return [\r\n parseInt(m[1], 10),\r\n parseInt(m[2], 10),\r\n parseInt(m[3], 10),\r\n m[4] !== undefined ? parseFloat(m[4]) : 1\r\n ];\r\n }\r\n if (cleaned === 'transparent') return [0, 0, 0, 0];\r\n return [255, 255, 255, 1];\r\n}\r\n\r\nfunction colorToRgba(color, alpha = 1) {\r\n const [r, g, b, a] = parseRgba(color);\r\n return `rgba(${r},${g},${b},${a * alpha})`;\r\n}\r\n\r\nfunction interpolateColor(c1, c2, factor) {\r\n const [r1, g1, b1, a1] = parseRgba(c1);\r\n const [r2, g2, b2, a2] = parseRgba(c2);\r\n const r = Math.round(r1 + (r2 - r1) * factor);\r\n const g = Math.round(g1 + (g2 - g1) * factor);\r\n const b = Math.round(b1 + (b2 - b1) * factor);\r\n const a = a1 + (a2 - a1) * factor;\r\n return `rgba(${r},${g},${b},${a})`;\r\n}\r\n\r\n\r\n\r\n\r\n","/**\r\n * DGA 三比值法 核心逻辑模块 \r\n * 包含: ThreeRatioConfig 配置, DGAScale 工具类, Renderer3D 渲染类, ThreeRatioChart 组件类\r\n */\r\nimport { parseGridBox, deepMerge } from './utils.js';\r\n\r\nimport { THREE_RADIO_ZONES } from './zones.js';\r\n\r\n// 核心配置中心:包含故障诊断规则、视觉样式及交互参数\r\nexport const ThreeRatioConfig = Object.freeze({\r\n // 故障区域定义(用于诊断逻辑与 3D/2D 绘图)\r\n ZONES: THREE_RADIO_ZONES,\r\n\r\n // 坐标轴固定配置(X: C2H4/C2H6, Y: CH4/H2, Z: C2H2/C2H4)\r\n AXES: {\r\n x: { color: '#ff9a3c', label: 'X (C₂H₄/C₂H₆)' },\r\n y: { color: '#4ac8ff', label: 'Y (CH₄/H₂)' },\r\n z: { color: '#70e870', label: 'Z (C₂H₂/C₂H₄)' },\r\n },\r\n\r\n // 绘图主题配置(深浅两色)\r\n THEMES: {\r\n dark: {\r\n wallFillAlpha: 0.05, // 立方体墙面填充透明度\r\n wallGridAlpha: '40', // 墙面网格线 Alpha (Hex)\r\n wallEdgeAlpha: '50', // 墙面边缘 Alpha (Hex)\r\n outerGrid: 'rgba(100,150,220,0.10)', // 外部辅助网格\r\n plane2dGrid: 'rgba(100,150,220,0.20)', // 2D 投影网格\r\n plane2dAxis: 'rgba(120,160,220,0.50)', // 2D 投影轴线\r\n plane2dLabel: 'rgba(150,180,220,0.60)', // 2D 区域文字标签颜色\r\n tickAlpha: 'cc', // 刻度文字 Alpha\r\n pointStroke: 'rgba(255,255,255,0.55)', // 样本点边缘描边\r\n },\r\n light: {\r\n wallFillAlpha: 0.06,\r\n wallGridAlpha: '28',\r\n wallEdgeAlpha: '55',\r\n outerGrid: 'rgba(80,120,200,0.12)',\r\n plane2dGrid: 'rgba(80,120,200,0.18)',\r\n plane2dAxis: 'rgba(80,120,200,0.45)',\r\n plane2dLabel: 'rgba(60,100,180,0.65)',\r\n tickAlpha: 'bb',\r\n pointStroke: 'rgba(0,0,0,0.25)',\r\n },\r\n },\r\n\r\n // 2D 投影平面视角配置\r\n PLANES: {\r\n xz: {\r\n hAxis: 'x',\r\n vAxis: 'z',\r\n hLabel: 'X C₂H₄/C₂H₆(热故障)',\r\n vLabel: 'Z C₂H₂/C₂H₄(高能放电)',\r\n bgColor: {\r\n dark: 'rgba(180,120,60,0.06)',\r\n light: 'rgba(180,100,40,0.05)',\r\n },\r\n },\r\n yz: {\r\n hAxis: 'y',\r\n vAxis: 'z',\r\n hLabel: 'Y CH₄/H₂(低能放电)',\r\n vLabel: 'Z C₂H₂/C₂H₄(高能放电)',\r\n bgColor: {\r\n dark: 'rgba(60,160,180,0.06)',\r\n light: 'rgba(40,140,160,0.05)',\r\n },\r\n },\r\n xy: {\r\n hAxis: 'x',\r\n vAxis: 'y',\r\n hLabel: 'X C₂H₄/C₂H₆(热故障)',\r\n vLabel: 'Y CH₄/H₂(低能放电)',\r\n bgColor: { dark: 'rgba(60,100,200,0.06)', light: 'rgba(40,80,180,0.05)' },\r\n },\r\n },\r\n\r\n TICKS: { vals: [0, 1 / 3, 2 / 3, 1], labels: ['0', '0.1', '1.0', '10'] }, // 刻度映射\r\n CAM: { elev: -20, yaw: 115 }, // 初始相机仰角、偏航角\r\n PROJ: { fov: 4.0, scaleK: 0.45, cx: 0.48, cy: 0.52 }, // 投影及中心偏移参数\r\n PAD2D: { l: 70, r: 30, t: 50, b: 60 }, // 2D 投影边距\r\n DRAG: {\r\n rotYSens: 0.45,\r\n rotXSens: 0.28,\r\n rotXMin: -70,\r\n rotXMax: 85,\r\n zoomMin: 0.3,\r\n zoomMax: 4.0,\r\n zoomIn: 1.08,\r\n zoomOut: 0.92,\r\n }, // 交互灵敏度与限制\r\n TWEEN: { step: 0.045 }, // 视角切换动画步长\r\n POINT: {\r\n defaultSize: 7,\r\n defaultColor: '#aaaaaa',\r\n glowAlpha: 0.25,\r\n glowRadius: 2.2,\r\n hlOffset: 0.35,\r\n }, // 样本点视觉参数\r\n ZONE_VIS: { fillAlpha: 0.25, labelAlpha: 0.9 }, // 3D 区域填充透明度(玻璃块效果)\r\n UNKNOWN: { name: '未分类(需综合判断)', color: '#888899' }, // 无法匹配诊断规则时的默认项\r\n TEXT_STYLE: {\r\n fontSize: 14,\r\n fontFamily: 'Segoe UI, Courier New',\r\n fontWeight: 'normal',\r\n },\r\n});\r\n\r\n/**\r\n * DGAScale: 提供原始三比值与单位立方体坐标(0-1)之间的映射\r\n */\r\nexport class DGAScale {\r\n /**\r\n * 将原始三比值数值转换为 0-1 的归一化坐标 (非等比例分段对数变换)\r\n * 变换规则:[0, 0.1]->[0, 1/3], [0.1, 1]->[1/3, 2/3], [1, 10]->[2/3, 1]\r\n */\r\n static realToU(v) {\r\n if (v <= 0) return 0;\r\n if (v <= 0.1) return v / 0.3;\r\n if (v <= 1) return 1 / 3 + (Math.log10(v) + 1) / 3;\r\n if (v <= 10) return 2 / 3 + Math.log10(v) / 3;\r\n return 1;\r\n }\r\n /** 将归一化单位值还原为原始比值 */\r\n static uToReal(u) {\r\n if (u <= 0) return 0;\r\n if (u <= 1 / 3) return u * 0.3;\r\n if (u <= 2 / 3) return Math.pow(10, (u - 1 / 3) * 3 - 1);\r\n return Math.pow(10, (u - 2 / 3) * 3);\r\n }\r\n /** 格式化数值输出 */\r\n static formatVal(v) {\r\n return v < 0.01 ? v.toFixed(4) : v.toFixed(3);\r\n }\r\n}\r\n\r\n/**\r\n * Renderer3D: Canvas 2D 实现的轻量级 3D 渲染器\r\n * 负责投影计算、场景裁剪及各类视觉元素的绘制\r\n */\r\nexport class Renderer3D {\r\n constructor(ctx, W, H, opts = {}) {\r\n this.ctx = ctx;\r\n this.opts = opts;\r\n this.layout = opts.layout ?? 'fill';\r\n this.resize(W, H);\r\n this.updateOptions(opts);\r\n }\r\n\r\n /** 更新渲染配置 */\r\n updateOptions(opts = {}) {\r\n this.opts = { ...this.opts, ...opts };\r\n if (opts.layout !== undefined || opts.grid !== undefined) {\r\n if (opts.layout !== undefined) {\r\n this.layout = opts.layout;\r\n }\r\n this.resize(this.W, this.H);\r\n }\r\n const themeName = this.opts.theme ?? 'dark';\r\n this.theme = ThreeRatioConfig.THEMES[themeName] ?? ThreeRatioConfig.THEMES.dark;\r\n this.themeName = themeName;\r\n this.zone = this.processZones(this.opts.zone ?? ThreeRatioConfig.ZONES);\r\n\r\n // 初始化 wall 和 axis 的默认配置并与 opts 进行合并\r\n const defaultWall = {\r\n show: true,\r\n fill: { show: true, alpha: this.theme.wallFillAlpha, colors: { xy: undefined, xz: undefined, yz: undefined } },\r\n grid: { show: true, lineStyle: { lineWidth: 0.6, alpha: parseInt(this.theme.wallGridAlpha, 16) / 255, type: 'solid' } },\r\n border: { show: true, lineStyle: { lineWidth: 0.8, alpha: parseInt(this.theme.wallEdgeAlpha, 16) / 255, type: 'solid' } }\r\n };\r\n\r\n const defaultAxis = {\r\n show: true,\r\n lineStyle: { lineWidth: 1.8, arrowSize: 9 },\r\n labelStyle: { show: true, fontSize: 14, fontWeight: 'bold', distance: 16 },\r\n tickLabelStyle: { show: true, fontSize: 12, color: 'rgba(255, 255, 255, 0.8)' },\r\n data: {\r\n x: { name: ThreeRatioConfig.AXES.x.label, color: ThreeRatioConfig.AXES.x.color },\r\n y: { name: ThreeRatioConfig.AXES.y.label, color: ThreeRatioConfig.AXES.y.color },\r\n z: { name: ThreeRatioConfig.AXES.z.label, color: ThreeRatioConfig.AXES.z.color }\r\n }\r\n };\r\n\r\n const defaultPlane2D = {\r\n show: true,\r\n fade3DAlpha: 0.03,\r\n grid: {\r\n show: true,\r\n backgroundColor: undefined,\r\n lineStyle: { lineWidth: 0.5, alpha: 0.2, type: 'solid' }\r\n },\r\n axis: {\r\n show: true,\r\n lineStyle: { lineWidth: 1.5, alpha: 0.9 },\r\n labelStyle: { show: true, fontSize: 13, distance: 25 },\r\n tickLabelStyle: { show: true, fontSize: 11, distance: 8 }\r\n },\r\n zone: {\r\n show: true,\r\n alpha: 0.45,\r\n borderStyle: { show: true, lineWidth: 1.4 }\r\n }\r\n };\r\n\r\n this.opts.wall = deepMerge(defaultWall, this.opts.wall || {});\r\n this.opts.axis = deepMerge(defaultAxis, this.opts.axis || {});\r\n this.opts.plane2D = deepMerge(defaultPlane2D, this.opts.plane2D || {});\r\n }\r\n\r\n /** 预计算区域数据 */\r\n processZones(zonesOpt) {\r\n let zonesData = [];\r\n let globalLabelStyle = {};\r\n if (Array.isArray(zonesOpt)) {\r\n zonesData = zonesOpt;\r\n } else if (zonesOpt && typeof zonesOpt === 'object' && Array.isArray(zonesOpt.data)) {\r\n zonesData = zonesOpt.data;\r\n globalLabelStyle = zonesOpt.labelStyle || {};\r\n } else {\r\n zonesData = ThreeRatioConfig.ZONES;\r\n }\r\n\r\n return zonesData.map((d) => {\r\n const [r, g, b] = parseRgba(d.fill || '#ffffff');\r\n\r\n const lblStyle = d.labelStyle || globalLabelStyle;\r\n const labelColor = lblStyle.color || d.fill;\r\n\r\n let fontParts = [];\r\n if (lblStyle.fontWeight) fontParts.push(lblStyle.fontWeight);\r\n if (lblStyle.fontSize) fontParts.push(lblStyle.fontSize + 'px');\r\n if (lblStyle.fontFamily) fontParts.push(lblStyle.fontFamily);\r\n const fontStr = fontParts.length > 0 ? fontParts.join(' ') : null;\r\n\r\n let edgeStr = d.edgeColor || d.fill;\r\n if (d.edgeAlpha !== undefined) {\r\n edgeStr = colorToRgba(edgeStr, d.edgeAlpha);\r\n }\r\n\r\n return {\r\n ...d,\r\n fillBase: `rgba(${r},${g},${b},`,\r\n edgeStr,\r\n x0: DGAScale.realToU(d.p1[0]),\r\n x1: DGAScale.realToU(d.p2[0]),\r\n y0: DGAScale.realToU(d.p1[1]),\r\n y1: DGAScale.realToU(d.p2[1]),\r\n z0: DGAScale.realToU(d.p1[2]),\r\n z1: DGAScale.realToU(d.p2[2]),\r\n labelColor,\r\n labelFontStr: fontStr\r\n };\r\n });\r\n }\r\n\r\n /** 获取配置的字体样式 */\r\n getFont(key) {\r\n const base = ThreeRatioConfig.TEXT_STYLE;\r\n const custom = this.opts.textStyle?.[key] ?? this.opts.textStyle ?? {};\r\n const size = custom.fontSize ?? base.fontSize;\r\n const family = custom.fontFamily ?? base.fontFamily;\r\n const weight = custom.fontWeight ?? (key === 'axis' || key === 'zone' ? 'bold' : base.fontWeight);\r\n return `${weight} ${size}px ${family}`;\r\n }\r\n\r\n /** 更新渲染器主题 */\r\n setTheme(name) {\r\n this.updateOptions({ theme: name });\r\n }\r\n\r\n /** 画布尺寸更新回调 */\r\n resize(W, H) {\r\n this.W = W;\r\n this.H = H;\r\n const grid = this.opts.grid;\r\n const hasGridMargin = grid && (grid.left !== undefined || grid.right !== undefined || grid.top !== undefined || grid.bottom !== undefined);\r\n\r\n // 根据 layout 模式计算有效显示区域\r\n if (hasGridMargin) {\r\n const box = parseGridBox(W, H, grid, 0);\r\n this.renderW = box.availW;\r\n this.renderH = box.availH;\r\n this.offsetX = box.left;\r\n this.offsetY = box.top;\r\n } else if (this.layout === 'square') {\r\n const S = Math.min(W, H);\r\n this.renderW = S;\r\n this.renderH = S;\r\n this.offsetX = (W - S) / 2;\r\n this.offsetY = (H - S) / 2;\r\n } else {\r\n this.renderW = W;\r\n this.renderH = H;\r\n this.offsetX = 0;\r\n this.offsetY = 0;\r\n }\r\n this.CX = this.offsetX + this.renderW * ThreeRatioConfig.PROJ.cx;\r\n this.CY = this.offsetY + this.renderH * ThreeRatioConfig.PROJ.cy;\r\n }\r\n\r\n /**\r\n * 核心投影函数:将 0-1 坐标系的 3D 点映射为 2D 屏幕画布坐标\r\n * 逻辑:平移中心 -> 执行绕 X, Y 轴旋转矩阵 -> 应用视场角(FOV)进行透视缩放 -> 映射至屏幕中心\r\n */\r\n proj(dx, dy, dz) {\r\n const cx = dx - 0.5,\r\n cy = dy - 0.5,\r\n cz = dz - 0.5;\r\n const RX = (this.cam.rotX * Math.PI) / 180,\r\n RY = (this.cam.rotY * Math.PI) / 180;\r\n const cosX = Math.cos(RX),\r\n sinX = Math.sin(RX);\r\n const cosY = Math.cos(RY),\r\n sinY = Math.sin(RY);\r\n // 旋转变换\r\n const x1 = cx * cosY + cy * sinY,\r\n z1 = -cx * sinY + cy * cosY;\r\n const y1 = cz * cosX - z1 * sinX,\r\n z2 = cz * sinX + z1 * cosX;\r\n // 透视缩放 (基于渲染区域的较小边)\r\n const sc = Math.min(this.renderW, this.renderH) * ThreeRatioConfig.PROJ.scaleK * this.cam.zoomFactor;\r\n const fov = ThreeRatioConfig.PROJ.fov,\r\n pz = z2 + fov;\r\n return {\r\n x: this.CX + (x1 / pz) * sc * fov,\r\n y: this.CY - (y1 / pz) * sc * fov,\r\n depth: z2,\r\n };\r\n }\r\n\r\n /** 判断法向量是否背向相机 (Backface Culling) */\r\n isBackface(nx, ny, nz) {\r\n const RX = (this.cam.rotX * Math.PI) / 180,\r\n RY = (this.cam.rotY * Math.PI) / 180;\r\n const cosX = Math.cos(RX), sinX = Math.sin(RX);\r\n const cosY = Math.cos(RY), sinY = Math.sin(RY);\r\n\r\n // 应用相同的旋转矩阵\r\n const x1 = nx * cosY + ny * sinY;\r\n const z1 = -nx * sinY + ny * cosY;\r\n const y1 = nz * cosX - z1 * sinX;\r\n const z2 = nz * sinX + z1 * cosX;\r\n\r\n return z2 > 0; // z正方向是朝向屏幕内部(远离相机)\r\n }\r\n\r\n /**\r\n * 渲染主循环\r\n * @param {Object} cam 相机状态对象\r\n * @param {Array} points 样本点数组\r\n * @param {string} view 当前视图 ID ('3d', 'xz' 等)\r\n * @param {number} flat 扁平化程度 (0-1), 用于 3D 转换 2D 平面的视觉过度\r\n */\r\n draw(cam, points, view, flat) {\r\n const ctx = this.ctx;\r\n ctx.clearRect(0, 0, this.W, this.H);\r\n this.cam = cam;\r\n const fadeTarget = this.opts.plane2D?.fade3DAlpha ?? 0.03;\r\n const d3a = 1 - flat * (1 - fadeTarget); // 3D 元素的整体透明度过渡\r\n\r\n ctx.globalAlpha = d3a;\r\n this.drawWalls(d3a); // 绘制底/侧面背景\r\n this.drawGrid(d3a); // 绘制网格辅助线\r\n this.drawZones(d3a); // 绘制诊断区域\r\n this.drawAxes(d3a); // 绘制坐标轴\r\n this.drawTickLabels(d3a); // 绘制刻度数值\r\n\r\n // 样本点渲染(按深度排序以解决 Z-fighting 问题)\r\n const pts = Array.isArray(points) ? points : [];\r\n [...pts]\r\n .sort(\r\n (a, b) =>\r\n this.proj(DGAScale.realToU(a.position.x), DGAScale.realToU(a.position.y), DGAScale.realToU(a.position.z)).depth -\r\n this.proj(DGAScale.realToU(b.position.x), DGAScale.realToU(b.position.y), DGAScale.realToU(b.position.z)).depth\r\n )\r\n .forEach((p) => this.drawPoint3D(p, d3a));\r\n\r\n ctx.globalAlpha = 1;\r\n // 如果处于 2D 视图状态,且开启了 plane2D 显示,则叠加 2D 专业投影层\r\n if (flat > 0 && this.opts.plane2D.show) this.draw2DOverlay(view, flat, pts);\r\n }\r\n\r\n // 基础绘制\r\n face(pts4, fill, stroke) {\r\n const ctx = this.ctx,\r\n pp = pts4.map((c) => this.proj(...c));\r\n ctx.beginPath();\r\n ctx.moveTo(pp[0].x, pp[0].y);\r\n for (let i = 1; i < pp.length; i++) ctx.lineTo(pp[i].x, pp[i].y);\r\n ctx.closePath();\r\n if (fill) {\r\n ctx.fillStyle = fill;\r\n ctx.fill();\r\n }\r\n if (stroke) {\r\n ctx.strokeStyle = stroke;\r\n ctx.lineWidth = 0.8;\r\n ctx.stroke();\r\n }\r\n }\r\n\r\n line(a, b) {\r\n const ctx = this.ctx;\r\n ctx.beginPath();\r\n ctx.moveTo(a.x, a.y);\r\n ctx.lineTo(b.x, b.y);\r\n ctx.stroke();\r\n }\r\n\r\n box(x0, x1, y0, y1, z0, z1, fill, edge) {\r\n const faces = [\r\n { f: [[x0, y0, z0], [x1, y0, z0], [x1, y1, z0], [x0, y1, z0]], n: [0, 0, -1] },\r\n { f: [[x0, y0, z1], [x1, y0, z1], [x1, y1, z1], [x0, y1, z1]], n: [0, 0, 1] },\r\n { f: [[x0, y0, z0], [x1, y0, z0], [x1, y0, z1], [x0, y0, z1]], n: [0, -1, 0] },\r\n { f: [[x0, y1, z0], [x1, y1, z0], [x1, y1, z1], [x0, y1, z1]], n: [0, 1, 0] },\r\n { f: [[x0, y0, z0], [x0, y1, z0], [x0, y1, z1], [x0, y0, z1]], n: [-1, 0, 0] },\r\n { f: [[x1, y0, z0], [x1, y1, z0], [x1, y1, z1], [x1, y0, z1]], n: [1, 0, 0] },\r\n ];\r\n\r\n faces\r\n .filter(({ n }) => !this.isBackface(n[0], n[1], n[2]))\r\n .map(({ f }) => ({\r\n f,\r\n d: f.reduce((s, c) => s + this.proj(...c).depth, 0) / f.length,\r\n }))\r\n .sort((a, b) => a.d - b.d)\r\n .forEach(({ f }) => this.face(f, fill, edge));\r\n }\r\n\r\n drawWalls(d3a = 1) {\r\n const ctx = this.ctx;\r\n const wallOpt = this.opts.wall;\r\n if (!wallOpt.show) return;\r\n\r\n const ax = this.opts.axis.data;\r\n const tv = ThreeRatioConfig.TICKS.vals;\r\n\r\n const walls = [\r\n { // X-Z 面 (底层底面通常认为是 z=0 或 y=0)\r\n pts: [[0, 0, 0], [1, 0, 0], [1, 0, 1], [0, 0, 1]],\r\n color: wallOpt.fill.colors.xz || ax.x.color,\r\n segs: (t) => [[this.proj(t, 0, 0), this.proj(t, 0, 1)], [this.proj(0, 0, t), this.proj(1, 0, t)]],\r\n gridColor: ax.x.color\r\n },\r\n { // Y-Z 面\r\n pts: [[0, 0, 0], [0, 1, 0], [0, 1, 1], [0, 0, 1]],\r\n color: wallOpt.fill.colors.yz || ax.y.color,\r\n segs: (t) => [[this.proj(0, t, 0), this.proj(0, t, 1)], [this.proj(0, 0, t), this.proj(0, 1, t)]],\r\n gridColor: ax.y.color\r\n },\r\n { // X-Y 面\r\n pts: [[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]],\r\n color: wallOpt.fill.colors.xy || ax.z.color,\r\n segs: (t) => [[this.proj(t, 0, 0), this.proj(t, 1, 0)], [this.proj(0, t, 0), this.proj(1, t, 0)]],\r\n gridColor: ax.z.color\r\n },\r\n ];\r\n\r\n // 绘制墙面填充\r\n if (wallOpt.fill.show) {\r\n ctx.globalAlpha = wallOpt.fill.alpha * d3a;\r\n walls.forEach((w) => this.face(w.pts, w.color));\r\n ctx.globalAlpha = d3a;\r\n }\r\n\r\n // 绘制墙面网格\r\n if (wallOpt.grid.show) {\r\n ctx.lineWidth = wallOpt.grid.lineStyle.lineWidth;\r\n ctx.globalAlpha = wallOpt.grid.lineStyle.alpha * d3a;\r\n // 简单支持 dashed\r\n if (wallOpt.grid.lineStyle.type === 'dashed') ctx.setLineDash([4, 4]);\r\n else if (wallOpt.grid.lineStyle.type === 'dotted') ctx.setLineDash([2, 2]);\r\n else ctx.setLineDash([]);\r\n\r\n walls.forEach(({ gridColor, segs }) => {\r\n ctx.strokeStyle = gridColor;\r\n tv.forEach((t) => segs(t).forEach(([a, b]) => this.line(a, b)));\r\n });\r\n ctx.setLineDash([]);\r\n ctx.globalAlpha = d3a;\r\n }\r\n\r\n // 绘制墙面边框\r\n if (wallOpt.border.show) {\r\n ctx.lineWidth = wallOpt.border.lineStyle.lineWidth;\r\n ctx.globalAlpha = wallOpt.border.lineStyle.alpha * d3a;\r\n if (wallOpt.border.lineStyle.type === 'dashed') ctx.setLineDash([4, 4]);\r\n else if (wallOpt.border.lineStyle.type === 'dotted') ctx.setLineDash([2, 2]);\r\n else ctx.setLineDash([]);\r\n\r\n walls.forEach(({ pts, gridColor }) => {\r\n ctx.strokeStyle = gridColor;\r\n pts.forEach((p, i) => this.line(this.proj(...p), this.proj(...pts[(i + 1) % pts.length])));\r\n });\r\n ctx.setLineDash([]);\r\n ctx.globalAlpha = d3a;\r\n }\r\n }\r\n\r\n drawGrid(d3a = 1) {\r\n const ctx = this.ctx;\r\n ctx.globalAlpha = d3a;\r\n ctx.strokeStyle = this.theme.outerGrid;\r\n ctx.lineWidth = 0.4;\r\n ThreeRatioConfig.TICKS.vals.forEach((t) => {\r\n this.line(this.proj(1, t, 0), this.proj(1, t, 1));\r\n this.line(this.proj(1, 0, t), this.proj(1, 1, t));\r\n });\r\n }\r\n\r\n drawZones(d3a) {\r\n const ctx = this.ctx,\r\n vis = ThreeRatioConfig.ZONE_VIS;\r\n [...this.zone]\r\n .sort(\r\n (a, b) =>\r\n this.proj((a.x0 + a.x1) / 2, (a.y0 + a.y1) / 2, (a.z0 + a.z1) / 2).depth -\r\n this.proj((b.x0 + b.x1) / 2, (b.y0 + b.y1) / 2, (b.z0 + b.z1) / 2).depth\r\n )\r\n .forEach((z) => {\r\n ctx.globalAlpha = d3a;\r\n const fA = z.fillAlpha !== undefined ? z.fillAlpha : vis.fillAlpha;\r\n this.box(z.x0, z.x1, z.y0, z.y1, z.z0, z.z1, z.fillBase + fA + ')', z.edgeStr);\r\n if (d3a > 0.05) {\r\n ctx.globalAlpha = d3a * vis.labelAlpha;\r\n const pp = this.proj((z.x0 + z.x1) / 2, (z.y0 + z.y1) / 2, (z.z0 + z.z1) / 2);\r\n ctx.font = z.labelFontStr || this.getFont('zone');\r\n ctx.textAlign = 'center';\r\n ctx.fillStyle = z.labelColor;\r\n ctx.fillText(z.name, pp.x, pp.y);\r\n }\r\n ctx.globalAlpha = d3a;\r\n });\r\n }\r\n\r\n drawAxes(d3a = 1) {\r\n const ctx = this.ctx;\r\n ctx.globalAlpha = d3a;\r\n const axisOpt = this.opts.axis;\r\n if (!axisOpt.show) return;\r\n\r\n [\r\n { from: [0, 0, 0], to: [1.18, 0, 0], lp: [1.22, 0, 0], ...axisOpt.data.x },\r\n { from: [0, 0, 0], to: [0, 1.18, 0], lp: [0, 1.22, 0], ...axisOpt.data.y },\r\n { from: [0, 0, 0], to: [0, 0, 1.22], lp: [0, 0, 1.28], ...axisOpt.data.z },\r\n ].forEach((ax) => {\r\n const f = this.proj(...ax.from),\r\n t = this.proj(...ax.to);\r\n ctx.beginPath();\r\n ctx.moveTo(f.x, f.y);\r\n ctx.lineTo(t.x, t.y);\r\n ctx.strokeStyle = ax.color;\r\n ctx.lineWidth = axisOpt.lineStyle.lineWidth;\r\n ctx.stroke();\r\n\r\n if (axisOpt.lineStyle.arrowSize > 0) {\r\n const dx = t.x - f.x,\r\n dy = t.y - f.y,\r\n len = Math.hypot(dx, dy) || 1,\r\n ux = dx / len,\r\n uy = dy / len,\r\n as = axisOpt.lineStyle.arrowSize;\r\n ctx.beginPath();\r\n ctx.moveTo(t.x, t.y);\r\n ctx.lineTo(t.x - ux * as + uy * (as / 2.25), t.y - uy * as - ux * (as / 2.25));\r\n ctx.lineTo(t.x - ux * as - uy * (as / 2.25), t.y - uy * as + ux * (as / 2.25));\r\n ctx.closePath();\r\n ctx.fillStyle = ax.color;\r\n ctx.fill();\r\n }\r\n\r\n if (axisOpt.labelStyle.show) {\r\n // Adjust endpoint for distance\r\n const dx = t.x - f.x, dy = t.y - f.y;\r\n const len = Math.hypot(dx, dy) || 1;\r\n const lx = t.x + (dx / len) * axisOpt.labelStyle.distance;\r\n const ly = t.y + (dy / len) * axisOpt.labelStyle.distance;\r\n\r\n ctx.fillStyle = ax.color;\r\n ctx.font = `${axisOpt.labelStyle.fontWeight} ${axisOpt.labelStyle.fontSize}px ${this.opts.textStyle?.fontFamily || ThreeRatioConfig.TEXT_STYLE.fontFamily}`;\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n ctx.fillText(ax.name, lx, ly);\r\n }\r\n });\r\n }\r\n\r\n drawTickLabels(d3a = 1) {\r\n const ctx = this.ctx;\r\n ctx.globalAlpha = d3a;\r\n const { vals, labels } = ThreeRatioConfig.TICKS,\r\n ta = this.theme.tickAlpha;\r\n ctx.font = this.getFont('tick');\r\n vals.forEach((t, i) => {\r\n let p = this.proj(t, 0, 0);\r\n ctx.fillStyle = ThreeRatioConfig.AXES.x.color + ta;\r\n ctx.textAlign = 'center';\r\n ctx.fillText(labels[i], p.x, p.y + 13);\r\n p = this.proj(0, t, 0);\r\n ctx.fillStyle = ThreeRatioConfig.AXES.y.color + ta;\r\n ctx.textAlign = 'left';\r\n ctx.fillText(labels[i], p.x + 7, p.y + 4);\r\n p = this.proj(0, 0, t);\r\n ctx.fillStyle = ThreeRatioConfig.AXES.z.color + ta;\r\n ctx.textAlign = 'right';\r\n ctx.fillText(labels[i], p.x - 7, p.y + 4);\r\n });\r\n ctx.textAlign = 'center';\r\n }\r\n\r\n drawPoint3D(p, alpha) {\r\n const ux = DGAScale.realToU(p.position.x),\r\n uy = DGAScale.realToU(p.position.y),\r\n uz = DGAScale.realToU(p.position.z);\r\n this.drawPointAt(this.proj(ux, uy, uz), p, alpha);\r\n }\r\n\r\n drawPointAt(pos, p, alpha = 1) {\r\n const ctx = this.ctx,\r\n pv = ThreeRatioConfig.POINT;\r\n const px = pos.x ?? pos.cx,\r\n py = pos.y ?? pos.cy;\r\n\r\n const r = p.itemStyle?.radius ?? pv.defaultSize;\r\n const c = p.itemStyle?.color ?? p.color;\r\n const lbl = p.name;\r\n const textStyle = p.textStyle || {};\r\n const hasGlowStyle = p.glowStyle !== undefined;\r\n const glowStyle = p.glowStyle || {};\r\n\r\n if (hasGlowStyle && glowStyle.show !== false) {\r\n let glowColors = [];\r\n let layers = 3;\r\n let dist = glowStyle.glowDistance !== undefined ? glowStyle.glowDistance : 4;\r\n const baseColor = glowStyle.color ?? c;\r\n\r\n if (Array.isArray(glowStyle.colors) && glowStyle.colors.length > 0) {\r\n glowColors = glowStyle.colors;\r\n layers = glowColors.length;\r\n } else {\r\n const startColor = glowStyle.startColor || colorToRgba(baseColor, 0.15);\r\n const endColor = glowStyle.endColor || 'transparent';\r\n layers = glowStyle.count !== undefined ? parseInt(glowStyle.count, 10) : 3;\r\n glowColors = [];\r\n for (let i = 0; i < layers; i++) {\r\n const factor = layers > 1 ? i / (layers - 1) : 0;\r\n glowColors.push(interpolateColor(startColor, endColor, factor));\r\n }\r\n }\r\n\r\n for (let i = layers - 1; i >= 0; i--) {\r\n const glowColor = glowColors[i];\r\n ctx.save();\r\n ctx.fillStyle = glowColor;\r\n ctx.beginPath();\r\n ctx.arc(px, py, r + (i + 1) * dist, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.restore();\r\n }\r\n }\r\n\r\n ctx.globalAlpha = alpha;\r\n ctx.beginPath();\r\n ctx.arc(px, py, r, 0, Math.PI * 2);\r\n const g = ctx.createRadialGradient(px - r * pv.hlOffset, py - r * pv.hlOffset, 1, px, py, r);\r\n g.addColorStop(0, 'rgba(255,255,255,0.9)');\r\n g.addColorStop(0.4, c + 'ee');\r\n g.addColorStop(1, c + '88');\r\n ctx.fillStyle = g;\r\n ctx.fill();\r\n ctx.strokeStyle = this.theme.pointStroke;\r\n ctx.lineWidth = 1.3;\r\n ctx.stroke();\r\n ctx.restore();\r\n\r\n if (lbl) {\r\n ctx.font = textStyle.bold\r\n ? `bold ${textStyle.fontSize || 12}px ${textStyle.fontFamily || 'sans-serif'}`\r\n : `${textStyle.fontSize || 12}px ${textStyle.fontFamily || 'sans-serif'}`;\r\n ctx.fillStyle = textStyle.color ?? p.color;\r\n ctx.textAlign = 'left';\r\n ctx.fillText(lbl, px + r + 3, py - 2);\r\n }\r\n }\r\n\r\n draw2DOverlay(view, alpha, points) {\r\n const plane = ThreeRatioConfig.PLANES[view];\r\n if (!plane) return;\r\n const ctx = this.ctx,\r\n th = this.theme,\r\n opt2d = this.opts.plane2D,\r\n axOpt = this.opts.axis.data;\r\n\r\n ctx.save();\r\n ctx.globalAlpha = alpha;\r\n\r\n // 废弃绝对的 PAD2D,但若未开启自定义网格边距,为了防止2D文字被裁切,需要给予一个默认的边界保护\r\n let left = this.offsetX,\r\n top = this.offsetY,\r\n right = this.offsetX + this.renderW,\r\n bottom = this.offsetY + this.renderH;\r\n\r\n const grid = this.opts.grid || {};\r\n const hasGridMargin = grid.left !== undefined || grid.right !== undefined || grid.top !== undefined || grid.bottom !== undefined;\r\n if (!hasGridMargin) {\r\n const pad = ThreeRatioConfig.PAD2D || { l: 70, r: 30, t: 50, b: 60 };\r\n left = pad.l;\r\n top = pad.t;\r\n right = this.W - pad.r;\r\n bottom = this.H - pad.b;\r\n }\r\n\r\n // 强制将 2D 投影区域转换为居中的正方形\r\n const availW = right - left;\r\n const availH = bottom - top;\r\n const sqSize = Math.min(availW, availH);\r\n const cx = left + availW / 2;\r\n const cy = top + availH / 2;\r\n left = cx - sqSize / 2;\r\n right = cx + sqSize / 2;\r\n top = cy - sqSize / 2;\r\n bottom = cy + sqSize / 2;\r\n\r\n const { vals, labels } = ThreeRatioConfig.TICKS;\r\n const u2c = (h, v) => ({\r\n cx: left + h * (right - left),\r\n cy: bottom - v * (bottom - top),\r\n });\r\n const themeName = this.themeName ?? 'dark';\r\n\r\n // 绘制背景\r\n if (opt2d.grid.show) {\r\n ctx.fillStyle = opt2d.grid.backgroundColor ?? (plane.bgColor[themeName] ?? plane.bgColor.dark);\r\n ctx.fillRect(left, top, right - left, bottom - top);\r\n }\r\n\r\n // 绘制区域 (Zones)\r\n if (opt2d.zone.show) {\r\n this.zone.forEach((z) => {\r\n const [h0, h1] = [z[plane.hAxis + '0'], z[plane.hAxis + '1']];\r\n const [v0, v1] = [z[plane.vAxis + '0'], z[plane.vAxis + '1']];\r\n const p0 = u2c(h0, v0),\r\n p1 = u2c(h1, v1),\r\n pw = p1.cx - p0.cx,\r\n ph = p0.cy - p1.cy;\r\n\r\n const fA = z.fillAlpha !== undefined ? z.fillAlpha : opt2d.zone.alpha;\r\n ctx.fillStyle = z.fillBase + fA + ')';\r\n ctx.fillRect(p0.cx, p1.cy, pw, ph);\r\n\r\n if (opt2d.zone.borderStyle.show) {\r\n ctx.strokeStyle = z.edgeStr;\r\n ctx.lineWidth = opt2d.zone.borderStyle.lineWidth;\r\n ctx.strokeRect(p0.cx, p1.cy, pw, ph);\r\n }\r\n\r\n const mx = (p0.cx + p1.cx) / 2,\r\n my = (p0.cy + p1.cy) / 2;\r\n ctx.font = z.labelFontStr || this.getFont('zone');\r\n ctx.textAlign = 'center';\r\n ctx.fillStyle = z.labelColor;\r\n ctx.fillText(z.name, mx, my + 4);\r\n });\r\n }\r\n\r\n // 绘制网格线 (Grid)\r\n if (opt2d.grid.show) {\r\n ctx.strokeStyle = opt2d.grid.lineStyle.color || th.plane2dGrid;\r\n ctx.lineWidth = opt2d.grid.lineStyle.lineWidth;\r\n ctx.globalAlpha = alpha * opt2d.grid.lineStyle.alpha;\r\n\r\n if (opt2d.grid.lineStyle.type === 'dashed') ctx.setLineDash([4, 4]);\r\n else if (opt2d.grid.lineStyle.type === 'dotted') ctx.setLineDash([2, 2]);\r\n else ctx.setLineDash([]);\r\n\r\n vals.forEach((v) => {\r\n const ph = u2c(v, 0).cx,\r\n pv = u2c(0, v).cy;\r\n ctx.beginPath();\r\n ctx.moveTo(ph, top);\r\n ctx.lineTo(ph, bottom);\r\n ctx.stroke();\r\n ctx.beginPath();\r\n ctx.moveTo(left, pv);\r\n ctx.lineTo(right, pv);\r\n ctx.stroke();\r\n });\r\n ctx.setLineDash([]);\r\n ctx.globalAlpha = alpha;\r\n }\r\n\r\n // 绘制坐标轴 (Axis)\r\n if (opt2d.axis.show) {\r\n const hColor = axOpt[plane.hAxis].color;\r\n const vColor = axOpt[plane.vAxis].color;\r\n\r\n ctx.lineWidth = opt2d.axis.lineStyle.lineWidth;\r\n ctx.globalAlpha = alpha * opt2d.axis.lineStyle.alpha;\r\n\r\n // 横轴\r\n ctx.strokeStyle = hColor;\r\n ctx.beginPath();\r\n ctx.moveTo(left, bottom);\r\n ctx.lineTo(right + 10, bottom); // arrow extra\r\n ctx.stroke();\r\n\r\n // 纵轴\r\n ctx.strokeStyle = vColor;\r\n ctx.beginPath();\r\n ctx.moveTo(left, bottom);\r\n ctx.lineTo(left, top - 10); // arrow extra\r\n ctx.stroke();\r\n\r\n ctx.globalAlpha = alpha;\r\n const fontFam = this.opts.textStyle?.fontFamily || ThreeRatioConfig.TEXT_STYLE.fontFamily;\r\n\r\n // 刻度数值\r\n if (opt2d.axis.tickLabelStyle.show) {\r\n ctx.font = `${opt2d.axis.tickLabelStyle.fontSize}px ${fontFam}`;\r\n const dist = opt2d.axis.tickLabelStyle.distance;\r\n vals.forEach((v, i) => {\r\n ctx.fillStyle = hColor;\r\n ctx.textAlign = 'center';\r\n ctx.fillText(labels[i], u2c(v, 0).cx, bottom + dist + opt2d.axis.tickLabelStyle.fontSize / 2);\r\n ctx.fillStyle = vColor;\r\n ctx.textAlign = 'right';\r\n ctx.fillText(labels[i], left - dist + 2, u2c(0, v).cy + opt2d.axis.tickLabelStyle.fontSize / 3);\r\n });\r\n }\r\n\r\n // 轴标签\r\n if (opt2d.axis.labelStyle.show) {\r\n ctx.font = `bold ${opt2d.axis.labelStyle.fontSize}px ${fontFam}`;\r\n const dist = opt2d.axis.labelStyle.distance;\r\n\r\n ctx.textAlign = 'center';\r\n ctx.fillStyle = hColor;\r\n ctx.fillText(axOpt[plane.hAxis].name, (left + right) / 2, bottom + dist + opt2d.axis.labelStyle.fontSize);\r\n\r\n ctx.save();\r\n ctx.translate(left - dist - opt2d.axis.labelStyle.fontSize, (top + bottom) / 2);\r\n ctx.rotate(-Math.PI / 2);\r\n ctx.fillStyle = vColor;\r\n ctx.fillText(axOpt[plane.vAxis].name, 0, 0);\r\n ctx.restore();\r\n }\r\n }\r\n\r\n // 绘制散点\r\n points.forEach((p) => {\r\n const pos = u2c(DGAScale.realToU(p.position[plane.hAxis]), DGAScale.realToU(p.position[plane.vAxis]));\r\n this.drawPointAt(pos, p, alpha);\r\n });\r\n\r\n ctx.restore();\r\n }\r\n}\r\n\r\n/**\r\n * ThreeRatioChart: 顶层组件类\r\n * 负责业务状态管理、DOM 构建、动画控制及事件分发\r\n */\r\nexport class ThreeRatioChart {\r\n static VIEWS = {\r\n '3d': { rotX: () => ThreeRatioConfig.CAM.elev, rotY: () => ThreeRatioConfig.CAM.yaw },\r\n xz: { rotX: 0, rotY: 0 },\r\n yz: { rotX: 0, rotY: 90 },\r\n xy: { rotX: 90, rotY: 0 },\r\n };\r\n\r\n /**\r\n * 构造函数\r\n * @param {string|HTMLElement} container 容器选择器或元素\r\n * @param {Object} opts 配置项\r\n * @param {string} opts.initialView 初始视角 (默认 '3d')\r\n * @param {string} opts.theme 初始主题 ('dark' | 'light')\r\n */\r\n constructor(container, opts = {}) {\r\n this.series = [];\r\n this.opts = opts;\r\n this.cam = {\r\n rotX: ThreeRatioConfig.CAM.elev,\r\n rotY: ThreeRatioConfig.CAM.yaw,\r\n zoomFactor: 1.0,\r\n };\r\n this.view = opts.initialView ?? '3d';\r\n this.layout = opts.layout ?? 'fill';\r\n this.drag = { active: false, lastX: 0, lastY: 0 };\r\n this.tween = {\r\n from: { rotX: 0, rotY: 0 },\r\n to: { rotX: 0, rotY: 0 },\r\n t: 1,\r\n };\r\n this.animId = null;\r\n this.pinchDist = null;\r\n this.events = { viewChange: null, dataChange: null };\r\n\r\n container = typeof container === 'string' ? document.querySelector(container) : container;\r\n if (container) this.buildDOM(container);\r\n\r\n this.renderer = new Renderer3D(this.ctx, this.W, this.H, opts);\r\n this.bindEvents();\r\n this.applyView();\r\n this.render();\r\n }\r\n\r\n\r\n\r\n /**\r\n * 设置图表配置(主要用于更新数据或视角)\r\n * @param {Object} opt\r\n */\r\n setOption(opt) {\r\n if (!opt) return;\r\n this.opts = { ...this.opts, ...opt };\r\n if (opt.zone || opt.textStyle || opt.theme || opt.wallColors || opt.layout !== undefined || opt.grid !== undefined || opt.axis !== undefined || opt.wall !== undefined || opt.plane2D !== undefined) {\r\n this.renderer.updateOptions({\r\n zone: this.opts.zone,\r\n textStyle: this.opts.textStyle,\r\n theme: this.opts.theme,\r\n wallColors: this.opts.wallColors,\r\n layout: this.opts.layout,\r\n grid: this.opts.grid,\r\n axis: this.opts.axis,\r\n wall: this.opts.wall,\r\n plane2D: this.opts.plane2D,\r\n });\r\n }\r\n if (opt.series !== undefined) {\r\n const arr = Array.isArray(opt.series) ? opt.series : [opt.series];\r\n this.series = arr.map((p) => ({\r\n name: p.name ?? '',\r\n color: p.color ?? ThreeRatioConfig.POINT.defaultColor,\r\n itemStyle: p.itemStyle ?? {},\r\n textStyle: p.textStyle ?? {},\r\n glowStyle: p.glowStyle,\r\n position: p.position ?? { x: 0, y: 0, z: 0 },\r\n }));\r\n this.emit('dataChange', [...this.series]);\r\n this.render();\r\n }\r\n if (opt.view && opt.view !== this.view) this.setView(opt.view);\r\n }\r\n\r\n /**\r\n * 切换视图角度(包含平滑补间动画)\r\n * @param {string} v 视图 ID\r\n */\r\n setView(v) {\r\n if (!ThreeRatioChart.VIEWS[v]) return;\r\n this.view = v;\r\n cancelAnimationFrame(this.animId);\r\n const tgt = this.getViewTarget(v);\r\n this.tween = {\r\n from: { rotX: this.cam.rotX, rotY: this.cam.rotY },\r\n to: tgt,\r\n t: 0,\r\n };\r\n this.cv.style.cursor = v === '3d' ? 'grab' : 'default';\r\n this.runTween();\r\n this.emit('viewChange', v);\r\n }\r\n\r\n /** 切换主题渲染 */\r\n setTheme(name) {\r\n this.renderer.setTheme(name);\r\n this.render();\r\n }\r\n\r\n /**\r\n * 诊断逻辑:根据输入的三比值 X, Y, Z 判断所属故障区域\r\n * @returns {Array} 匹配到的诊断区域信息数组\r\n */\r\n diagnose(x, y, z) {\r\n if (!this.renderer) return [{ ...(this.opts.unknown ?? ThreeRatioConfig.UNKNOWN) }];\r\n const hits = this.renderer.zone\r\n .filter((r) => x >= r.p1[0] && x < r.p2[0] && y >= r.p1[1] && y < r.p2[1] && z >= r.p1[2] && z < r.p2[2])\r\n .map((r) => ({ name: r.name, title: r.title, color: r.edgeColor || r.fill }));\r\n return hits.length ? hits : [{ ...(this.opts.unknown ?? ThreeRatioConfig.UNKNOWN) }];\r\n }\r\n\r\n on(event, handler) {\r\n if (event in this.events) this.events[event] = handler;\r\n }\r\n emit(event, ...args) {\r\n if (typeof this.events[event] === 'function') this.events[event](...args);\r\n }\r\n\r\n render() {\r\n if (!this.renderer || !this.ctx) return;\r\n this.renderer.draw(this.cam, this.series, this.view, this.flatness());\r\n }\r\n\r\n dispose() {\r\n cancelAnimationFrame(this.animId);\r\n this.resizeObs?.disconnect();\r\n this.cv?.remove();\r\n window.removeEventListener('mousemove', this.onMouseMove);\r\n window.removeEventListener('mouseup', this.onMouseUp);\r\n }\r\n\r\n // 内部方法\r\n getViewTarget(v) {\r\n const d = ThreeRatioChart.VIEWS[v];\r\n return {\r\n rotX: typeof d.rotX === 'function' ? d.rotX() : d.rotX,\r\n rotY: typeof d.rotY === 'function' ? d.rotY() : d.rotY,\r\n };\r\n }\r\n\r\n applyView() {\r\n if (this.view !== '3d') {\r\n const t = this.getViewTarget(this.view);\r\n this.cam.rotX = t.rotX;\r\n this.cam.rotY = t.rotY;\r\n this.cv.style.cursor = 'default';\r\n }\r\n }\r\n\r\n flatness() {\r\n if (this.view === '3d') return 0;\r\n const t = this.getViewTarget(this.view);\r\n return Math.max(0, 1 - (Math.abs(this.cam.rotX - t.rotX) + Math.abs(this.cam.rotY - t.rotY)) / 30);\r\n }\r\n\r\n runTween() {\r\n this.tween.t = Math.min(1, this.tween.t + ThreeRatioConfig.TWEEN.step);\r\n const e = ((t) => (t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2))(this.tween.t);\r\n this.cam.rotX = this.tween.from.rotX + (this.tween.to.rotX - this.tween.from.rotX) * e;\r\n this.cam.rotY = this.tween.from.rotY + (this.tween.to.rotY - this.tween.from.rotY) * e;\r\n this.render();\r\n if (this.tween.t < 1) this.animId = requestAnimationFrame(() => this.runTween());\r\n }\r\n\r\n buildDOM(container) {\r\n const rect = container.getBoundingClientRect();\r\n this.W = rect.width > 0 ? Math.round(rect.width) : 600;\r\n this.H = rect.height > 0 ? Math.round(rect.height) : 540;\r\n this.cv = document.createElement('canvas');\r\n this.cv.className = 'trc-canvas';\r\n this.cv.width = this.W;\r\n this.cv.height = this.H;\r\n this.cv.style.cssText = 'width:100%;height:100%;display:block;touch-action:none;';\r\n this.ctx = this.cv.getContext('2d');\r\n container.appendChild(this.cv);\r\n this.resizeObs = new ResizeObserver((entries) => {\r\n const { width, height } = entries[0].contentRect;\r\n if (width > 0 && height > 0) {\r\n this.W = Math.round(width);\r\n this.H = Math.round(height);\r\n this.cv.width = this.W;\r\n this.cv.height = this.H;\r\n this.renderer?.resize(this.W, this.H);\r\n this.render();\r\n }\r\n });\r\n this.resizeObs.observe(container);\r\n }\r\n\r\n bindEvents() {\r\n const d = ThreeRatioConfig.DRAG,\r\n cv = this.cv;\r\n cv.addEventListener('mousedown', (e) => {\r\n if (this.view !== '3d') return;\r\n this.drag = { active: true, lastX: e.clientX, lastY: e.clientY };\r\n cv.style.cursor = 'grabbing';\r\n cancelAnimationFrame(this.animId);\r\n });\r\n this.onMouseMove = (e) => {\r\n if (!this.drag.active || this.view !== '3d') return;\r\n this.cam.rotY += (e.clientX - this.drag.lastX) * d.rotYSens;\r\n this.cam.rotX = Math.max(\r\n d.rotXMin,\r\n Math.min(d.rotXMax, this.cam.rotX + (e.clientY - this.drag.lastY) * d.rotXSens)\r\n );\r\n this.drag.lastX = e.clientX;\r\n this.drag.lastY = e.clientY;\r\n this.render();\r\n };\r\n this.onMouseUp = () => {\r\n this.drag.active = false;\r\n if (this.view === '3d') cv.style.cursor = 'grab';\r\n };\r\n window.addEventListener('mousemove', this.onMouseMove);\r\n window.addEventListener('mouseup', this.onMouseUp);\r\n cv.addEventListener(\r\n 'touchstart',\r\n (e) => {\r\n if (this.view !== '3d') return;\r\n this.drag = {\r\n active: true,\r\n lastX: e.touches[0].clientX,\r\n lastY: e.touches[0].clientY,\r\n };\r\n if (e.touches.length === 2)\r\n this.pinchDist = Math.hypot(\r\n e.touches[0].clientX - e.touches[1].clientX,\r\n e.touches[0].clientY - e.touches[1].clientY\r\n );\r\n },\r\n { passive: true }\r\n );\r\n cv.addEventListener(\r\n 'touchmove',\r\n (e) => {\r\n if (this.view !== '3d') return;\r\n if (e.touches.length === 2 && this.pinchDist !== null) {\r\n const dist = Math.hypot(\r\n e.touches[0].clientX - e.touches[1].clientX,\r\n e.touches[0].clientY - e.touches[1].clientY\r\n );\r\n this.cam.zoomFactor = Math.max(\r\n d.zoomMin,\r\n Math.min(d.zoomMax, (this.cam.zoomFactor * dist) / this.pinchDist)\r\n );\r\n this.pinchDist = dist;\r\n this.render();\r\n } else if (this.drag.active && e.touches.length === 1) {\r\n this.cam.rotY += (e.touches[0].clientX - this.drag.lastX) * d.rotYSens;\r\n this.cam.rotX = Math.max(\r\n d.rotXMin,\r\n Math.min(d.rotXMax, this.cam.rotX + (e.touches[0].clientY - this.drag.lastY) * d.rotXSens)\r\n );\r\n this.drag.lastX = e.touches[0].clientX;\r\n this.drag.lastY = e.touches[0].clientY;\r\n this.render();\r\n }\r\n },\r\n { passive: true }\r\n );\r\n cv.addEventListener(\r\n 'touchend',\r\n (e) => {\r\n if (e.touches.length < 2) this.pinchDist = null;\r\n if (e.touches.length === 0) this.drag.active = false;\r\n },\r\n { passive: true }\r\n );\r\n cv.addEventListener(\r\n 'wheel',\r\n (e) => {\r\n if (this.view !== '3d') return;\r\n e.preventDefault();\r\n this.cam.zoomFactor = Math.max(\r\n d.zoomMin,\r\n Math.min(d.zoomMax, this.cam.zoomFactor * (e.deltaY > 0 ? d.zoomOut : d.zoomIn))\r\n );\r\n this.render();\r\n },\r\n { passive: false }\r\n );\r\n }\r\n}\r\n\r\nfunction parseRgba(color) {\r\n const cleaned = color.trim().toLowerCase();\r\n if (cleaned.startsWith('#')) {\r\n let hex = cleaned.slice(1);\r\n if (hex.length === 3) {\r\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\r\n }\r\n const r = parseInt(hex.substring(0, 2), 16);\r\n const g = parseInt(hex.substring(2, 4), 16);\r\n const b = parseInt(hex.substring(4, 6), 16);\r\n const a = hex.length === 8 ? parseInt(hex.substring(6, 8), 16) / 255 : 1;\r\n return [r, g, b, a];\r\n }\r\n const m = cleaned.match(/rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\)/);\r\n if (m) {\r\n return [\r\n parseInt(m[1], 10),\r\n parseInt(m[2], 10),\r\n parseInt(m[3], 10),\r\n m[4] !== undefined ? parseFloat(m[4]) : 1\r\n ];\r\n }\r\n if (cleaned === 'transparent') return [0, 0, 0, 0];\r\n return [255, 255, 255, 1];\r\n}\r\n\r\nfunction colorToRgba(color, alpha) {\r\n const [r, g, b, a] = parseRgba(color);\r\n return `rgba(${r},${g},${b},${alpha !== undefined ? alpha : a})`;\r\n}\r\n\r\nfunction interpolateColor(c1, c2, factor) {\r\n const [r1, g1, b1, a1] = parseRgba(c1);\r\n const [r2, g2, b2, a2] = parseRgba(c2);\r\n const r = Math.round(r1 + (r2 - r1) * factor);\r\n const g = Math.round(g1 + (g2 - g1) * factor);\r\n const b = Math.round(b1 + (b2 - b1) * factor);\r\n const a = a1 + (a2 - a1) * factor;\r\n return `rgba(${r},${g},${b},${a})`;\r\n}\r\n","import { inPoly, hexToRgba, deepMerge, EventBus, ZoomController, DOMTooltip, parseGridBox, drawShapePath } from './utils.js';\nimport { ETRA_ZONES_A } from './zones.js';\n\nconst DEFAULTS = {\n theme: 'light',\n backgroundColor: 'transparent',\n grid: {\n left: 72, right: 20, top: 20, bottom: 56,\n lineStyle: { type: 'solid', width: 0.4, color: null },\n majorLineStyle: { type: 'solid', width: 0.8, color: null }\n },\n zone: {\n data: ETRA_ZONES_A,\n labelStyle: { show: true, fontSize: 12, borderRadius: 4 },\n borderStyle: { show: true, stroke: 1, type: 'solid', color: null }\n },\n xAxis: {\n title: '',\n min: -2, max: 3, // log10 range\n labelStyle: { fontSize: 11, fontWeight: 'normal', offsetX: 0, offsetY: 0, color: null },\n lineStyle: { show: true, stroke: 1.5, type: 'solid', color: null },\n titleStyle: { fontSize: 13, color: null, fontWeight: 'normal', align: 'center', offsetX: 0, offsetY: 0 }\n },\n yAxis: {\n title: '',\n min: -3, max: 3, // log10 range\n labelStyle: { fontSize: 11, fontWeight: 'normal', offsetX: 0, offsetY: 0, color: null },\n lineStyle: { show: true, stroke: 1.5, type: 'solid', color: null },\n titleStyle: { fontSize: 13, color: null, fontWeight: 'normal', align: 'center', offsetX: 0, offsetY: 0 }\n },\n tooltip: { show: true, formatter: null },\n series: []\n};\n\nconst THEME = {\n light: {\n backgroundColor: '#ffffff',\n text: '#333333',\n textSecondary: '#666666',\n gridLine: 'rgba(0,0,0,0.12)',\n gridLineMajor: 'rgba(0,0,0,0.22)',\n axisLine: 'rgba(0,0,0,0.5)',\n zoneBorder: 'rgba(0,0,0,0.35)',\n zoneLabelBg: 'rgba(255,255,255,0.75)',\n tooltipBg: 'rgba(255,255,255,0.95)',\n tooltipBorder: 'rgba(0,0,0,0.15)',\n tooltipTextColor: '#222222'\n },\n dark: {\n backgroundColor: '#1a1a2e',\n text: 'rgba(255,255,255,0.85)',\n textSecondary: 'rgba(255,255,255,0.5)',\n gridLine: 'rgba(255,255,255,0.08)',\n gridLineMajor: 'rgba(255,255,255,0.18)',\n axisLine: 'rgba(255,255,255,0.55)',\n zoneBorder: 'rgba(255,255,255,0.3)',\n zoneLabelBg: 'rgba(0,0,0,0.5)',\n tooltipBg: 'rgba(20,20,40,0.95)',\n tooltipBorder: 'rgba(255,255,255,0.15)',\n tooltipTextColor: 'rgba(255,255,255,0.9)'\n }\n};\n\nfunction fmtLog(v) {\n const e = Math.round(v);\n const sup = String(e).split('').map(c =>\n ({ '-': '⁻', '0': '⁰', '1': '¹', '2': '²', '3': '³', '4': '⁴', '5': '⁵', '6': '⁶', '7': '⁷', '8': '⁸', '9': '⁹' }[c] || c)\n ).join('');\n return '10' + sup;\n}\n\nexport class ETRAChart {\n constructor(container, option = {}) {\n if (typeof container === 'string') {\n container = document.querySelector(container);\n }\n if (!container) throw new Error('[ETRAChart] Container element not found');\n\n this._container = container;\n this._opt = deepMerge(deepMerge({}, DEFAULTS), option);\n this._bus = new EventBus();\n\n this._initDOM();\n\n // 统一组件\n this._zoom = new ZoomController(this._opt.zoom || {});\n\n this._tooltipRenderer = new DOMTooltip(this._container, this._theme);\n\n this._hoverZone = null;\n this._hoverPoint = null;\n\n // ResizeObserver\n if (typeof ResizeObserver !== 'undefined') {\n this._ro = new ResizeObserver(() => this.resize());\n this._ro.observe(this._container);\n }\n\n // Mouse events for zoom & hover\n this._onWheel = (e) => {\n e.preventDefault();\n const rect = this._canvas.getBoundingClientRect();\n const ax = e.clientX - rect.left;\n const ay = e.clientY - rect.top;\n this._zoom.onWheel(e.deltaY, ax, ay);\n this._bus.emit('zoom', this._zoom.state);\n this._render();\n };\n\n this._onDown = (e) => {\n if (e.button !== 0) return;\n this._zoom.startDrag(e.clientX, e.clientY);\n this._canvas.style.cursor = 'grabbing';\n };\n\n this._onMove = (e) => {\n const rect = this._canvas.getBoundingClientRect();\n if (this._zoom.moveDrag(e.clientX, e.clientY, 1)) {\n this._render();\n return;\n }\n if (!this._coordMap || !this._drawnPoints) return;\n \n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n const { panX, panY, zoom } = this._zoom;\n const rawX = (mouseX - panX) / zoom;\n const rawY = (mouseY - panY) / zoom;\n\n let found = null;\n let minDist = Infinity;\n for (const pt of this._drawnPoints) {\n const dist = Math.hypot(rawX - pt.px, rawY - pt.py);\n const size = pt.series.size || 6;\n if (dist < size * 2 + 5 && dist < minDist) {\n minDist = dist;\n found = pt;\n }\n }\n if (found !== this._hoverPoint) {\n this._hoverPoint = found;\n this._render();\n if (found) {\n this._canvas.style.cursor = 'pointer';\n this._bus.emit('hover', found);\n } else {\n this._canvas.style.cursor = 'default';\n this._bus.emit('hover', null);\n }\n }\n };\n\n this._onUp = () => {\n if (!this._zoom.endDrag()) return;\n this._canvas.style.cursor = this._hoverPoint ? 'pointer' : 'default';\n this._bus.emit('zoom', this._zoom.state);\n };\n\n this._onLeave = () => {\n if (this._hoverPoint) {\n this._hoverPoint = null;\n this._canvas.style.cursor = 'default';\n this._render();\n this._bus.emit('hover', null);\n }\n };\n\n this._onDbl = () => {\n this._zoom.reset();\n this._bus.emit('zoom', this._zoom.state);\n this._render();\n };\n\n const cv = this._canvas;\n cv.addEventListener('wheel', this._onWheel, { passive: false });\n cv.addEventListener('mousedown', this._onDown);\n cv.addEventListener('mousemove', this._onMove);\n cv.addEventListener('mouseleave', this._onLeave);\n cv.addEventListener('dblclick', this._onDbl);\n window.addEventListener('mouseup', this._onUp);\n\n this._render();\n }\n\n static init(container, option) {\n return new ETRAChart(container, option);\n }\n\n get _theme() {\n return THEME[this._opt.theme] || THEME.light;\n }\n\n _initDOM() {\n this._container.style.position = 'relative';\n this._container.style.overflow = 'hidden';\n\n this._canvas = document.createElement('canvas');\n this._canvas.style.display = 'block';\n this._canvas.style.width = '100%';\n this._canvas.style.height = '100%';\n this._container.appendChild(this._canvas);\n\n this._ctx = this._canvas.getContext('2d');\n }\n\n setOption(option) {\n this._opt = deepMerge(this._opt, option);\n this._render();\n return this;\n }\n\n on(event, handler) {\n this._bus.on(event, handler);\n return this;\n }\n\n off(event, handler) {\n this._bus.off(event, handler);\n return this;\n }\n\n resize() {\n this._render();\n return this;\n }\n\n dispose() {\n if (this._ro) this._ro.disconnect();\n this._tooltipRenderer.dispose();\n if (this._canvas && this._canvas.parentNode) {\n this._canvas.parentNode.removeChild(this._canvas);\n }\n this._bus.dispose();\n window.removeEventListener('mouseup', this._onUp);\n }\n\n _dims() {\n const rect = this._container.getBoundingClientRect();\n const W = rect.width || 600;\n const H = rect.height || 400;\n\n const dpr = window.devicePixelRatio || 1;\n if (this._canvas.width !== Math.round(W * dpr) || this._canvas.height !== Math.round(H * dpr)) {\n this._canvas.width = Math.round(W * dpr);\n this._canvas.height = Math.round(H * dpr);\n }\n\n const box = parseGridBox(W, H, this._opt.grid, 0);\n return { W, H, box, dpr };\n }\n\n _render() {\n const { W, H, box, dpr } = this._dims();\n const ctx = this._ctx;\n if (!ctx) return;\n\n const th = this._theme;\n const opt = this._opt;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, W, H);\n\n const bgColor = opt.backgroundColor || th.backgroundColor || 'transparent';\n if (bgColor && bgColor !== 'transparent') {\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, W, H);\n }\n\n // Coordinate definitions\n const xMin = opt.xAxis.min;\n const xMax = opt.xAxis.max;\n const yMin = opt.yAxis.min;\n const yMax = opt.yAxis.max;\n\n const plotW = box.availW;\n const plotH = box.availH;\n const gL = box.left;\n const gT = box.top;\n\n const toPixX = (logVal) => gL + ((logVal - xMin) / (xMax - xMin)) * plotW;\n const toPixY = (logVal) => gT + ((yMax - logVal) / (yMax - yMin)) * plotH;\n \n // Save these for mouse event hit testing\n this._coordMap = { xMin, xMax, yMin, yMax, plotW, plotH, gL, gT, toPixX, toPixY };\n\n // Save state for zoom\n ctx.save();\n\n // Apply Zoom to entire chart (grid, zones, series, axes, borders)\n this._zoom.applyTransform(ctx);\n\n this._drawGrid(ctx, toPixX, toPixY, th, opt);\n this._drawZones(ctx, toPixX, toPixY, th, opt);\n \n const results = this._drawSeries(ctx, toPixX, toPixY, th, opt);\n\n // Draw Axes inside zoom context\n this._drawAxes(ctx, toPixX, toPixY, th, opt, W, H, gL, gT, plotW, plotH);\n\n ctx.restore();\n\n // Tooltip updates\n if (opt.tooltip.show && this._hoverPoint) {\n const hp = this._hoverPoint;\n const px = toPixX(hp.logX) * this._zoom.zoom + this._zoom.panX;\n const py = toPixY(hp.logY) * this._zoom.zoom + this._zoom.panY;\n \n let html = '';\n if (typeof opt.tooltip.formatter === 'function') {\n html = opt.tooltip.formatter({\n series: hp.series,\n logX: hp.logX,\n logY: hp.logY,\n rawX: Math.pow(10, hp.logX),\n rawY: Math.pow(10, hp.logY),\n zone: hp.zone\n });\n } else {\n html = this._defaultTooltipHTML(hp, opt);\n }\n this._tooltipRenderer.show(html, px, py, opt.tooltip, th, hp.zone);\n } else {\n this._tooltipRenderer.hide();\n }\n\n if (results.length > 0) this._bus.emit('diagnose', results);\n }\n\n _drawGrid(ctx, toPixX, toPixY, th, opt) {\n const xMin = opt.xAxis.min;\n const xMax = opt.xAxis.max;\n const yMin = opt.yAxis.min;\n const yMax = opt.yAxis.max;\n const gL = this._coordMap.gL;\n const gT = this._coordMap.gT;\n const plotW = this._coordMap.plotW;\n const plotH = this._coordMap.plotH;\n\n const glStyle = opt.grid.lineStyle || {};\n const majorColor = glStyle.color || th.gridLineMajor;\n const minorColor = th.gridLine;\n\n // X Grid (Vertical lines)\n for (let lx = Math.ceil(xMin); lx <= Math.floor(xMax); lx++) {\n const px = toPixX(lx);\n \n // Major\n ctx.beginPath();\n ctx.moveTo(px, gT);\n ctx.lineTo(px, gT + plotH);\n ctx.strokeStyle = majorColor;\n ctx.lineWidth = glStyle.width || 0.4;\n if (glStyle.type === 'dashed') ctx.setLineDash([4, 3]);\n else ctx.setLineDash([]);\n ctx.stroke();\n\n // Minor\n ctx.setLineDash([]);\n ctx.strokeStyle = minorColor;\n ctx.lineWidth = 0.25;\n for (let sub = 2; sub <= 9; sub++) {\n const lxm = lx + Math.log10(sub);\n if (lxm > xMax) break;\n const pxm = toPixX(lxm);\n ctx.beginPath();\n ctx.moveTo(pxm, gT);\n ctx.lineTo(pxm, gT + plotH);\n ctx.stroke();\n }\n }\n\n // Y Grid (Horizontal lines)\n for (let ly = Math.ceil(yMin); ly <= Math.floor(yMax); ly++) {\n const py = toPixY(ly);\n \n // Major\n ctx.beginPath();\n ctx.moveTo(gL, py);\n ctx.lineTo(gL + plotW, py);\n ctx.strokeStyle = majorColor;\n ctx.lineWidth = glStyle.width || 0.4;\n if (glStyle.type === 'dashed') ctx.setLineDash([4, 3]);\n else ctx.setLineDash([]);\n ctx.stroke();\n\n // Minor\n ctx.setLineDash([]);\n ctx.strokeStyle = minorColor;\n ctx.lineWidth = 0.25;\n for (let sub = 2; sub <= 9; sub++) {\n const lym = ly + Math.log10(sub);\n if (lym > yMax) break;\n const pym = toPixY(lym);\n ctx.beginPath();\n ctx.moveTo(gL, pym);\n ctx.lineTo(gL + plotW, pym);\n ctx.stroke();\n }\n }\n }\n\n _drawZones(ctx, toPixX, toPixY, th, opt) {\n const zoneOpt = opt.zone;\n if (!zoneOpt || !zoneOpt.data) return;\n\n for (const zone of zoneOpt.data) {\n if (!zone.poly || zone.poly.length < 3) continue;\n\n ctx.beginPath();\n zone.poly.forEach((p, i) => {\n const px = toPixX(p[0]);\n const py = toPixY(p[1]);\n if (i === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n });\n ctx.closePath();\n\n // Fill\n ctx.fillStyle = zone.color || 'rgba(128,128,128,0.2)';\n ctx.fill();\n\n // Border\n if (zoneOpt.borderStyle.show) {\n ctx.strokeStyle = zoneOpt.borderStyle.color || zone.color || th.zoneBorder;\n ctx.lineWidth = zoneOpt.borderStyle.stroke || 1;\n if (zoneOpt.borderStyle.type === 'dashed') ctx.setLineDash([5, 3]);\n else ctx.setLineDash([]);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n // Labels\n if (zoneOpt.labelStyle.show && (zone.title || zone.name)) {\n let sumX = 0, sumY = 0;\n zone.poly.forEach(p => { sumX += toPixX(p[0]); sumY += toPixY(p[1]); });\n const cx = sumX / zone.poly.length;\n const cy = sumY / zone.poly.length;\n\n // Clamp loosely\n const gL = this._coordMap.gL;\n const gT = this._coordMap.gT;\n const plotW = this._coordMap.plotW;\n const plotH = this._coordMap.plotH;\n\n const lx = Math.max(gL + 4, Math.min(gL + plotW - 4, cx));\n const ly = Math.max(gT + 4, Math.min(gT + plotH - 4, cy));\n\n const fs = zoneOpt.labelStyle.fontSize || 12;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n \n if (zone.title && zone.name && zone.name !== zone.title) {\n ctx.font = `600 ${fs + 1}px system-ui, sans-serif`;\n ctx.fillStyle = zone.labelColor || th.text;\n ctx.fillText(zone.name, lx, ly - fs * 0.7);\n\n ctx.font = `${fs - 1}px system-ui, sans-serif`;\n ctx.fillStyle = zone.labelColor || th.textSecondary;\n ctx.fillText(zone.title, lx, ly + fs * 0.9);\n } else {\n const label = zone.title || zone.name;\n ctx.font = `500 ${fs}px system-ui, sans-serif`;\n ctx.fillStyle = zone.labelColor || th.text;\n ctx.fillText(label, lx, ly);\n }\n }\n }\n }\n\n _drawAxes(ctx, toPixX, toPixY, th, opt, W, H, gL, gT, plotW, plotH) {\n const xMin = opt.xAxis.min;\n const xMax = opt.xAxis.max;\n const yMin = opt.yAxis.min;\n const yMax = opt.yAxis.max;\n\n // Border Box\n ctx.beginPath();\n ctx.rect(gL, gT, plotW, plotH);\n ctx.strokeStyle = th.axisLine;\n ctx.lineWidth = 1;\n ctx.stroke();\n\n const xLabelColor = opt.xAxis.labelStyle.color || th.textSecondary;\n const yLabelColor = opt.yAxis.labelStyle.color || th.textSecondary;\n\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n \n // X Axis Labels\n for (let lx = Math.ceil(xMin); lx <= Math.floor(xMax); lx++) {\n const px = toPixX(lx);\n const xls = opt.xAxis.labelStyle;\n ctx.font = `${xls.fontWeight || 'normal'} ${xls.fontSize || 11}px system-ui, sans-serif`;\n ctx.fillStyle = xLabelColor;\n ctx.fillText(fmtLog(lx), px + (xls.offsetX || 0), gT + plotH + 16 + (xls.offsetY || 0));\n }\n\n // Y Axis Labels\n ctx.textAlign = 'right';\n for (let ly = Math.ceil(yMin); ly <= Math.floor(yMax); ly++) {\n const py = toPixY(ly);\n const yls = opt.yAxis.labelStyle;\n ctx.font = `${yls.fontWeight || 'normal'} ${yls.fontSize || 11}px system-ui, sans-serif`;\n ctx.fillStyle = yLabelColor;\n ctx.fillText(fmtLog(ly), gL - 6 + (yls.offsetX || 0), py + (yls.offsetY || 0));\n }\n\n // X Axis Title\n if (opt.xAxis.title) {\n const xts = opt.xAxis.titleStyle;\n const alignMap = { left: gL, center: gL + plotW / 2, right: gL + plotW };\n const tx = (alignMap[xts.align] || alignMap.center) + (xts.offsetX || 0);\n const ty = gT + plotH + 38 + (xts.offsetY || 0);\n \n ctx.textAlign = xts.align === 'left' ? 'left' : xts.align === 'right' ? 'right' : 'center';\n ctx.font = `${xts.fontWeight || 'normal'} ${xts.fontSize || 13}px system-ui, sans-serif`;\n ctx.fillStyle = xts.color || th.text;\n ctx.fillText(opt.xAxis.title, tx, ty);\n }\n\n // Y Axis Title\n if (opt.yAxis.title) {\n const yts = opt.yAxis.titleStyle;\n const alignMap = { left: gT + plotH, center: gT + plotH / 2, right: gT };\n const ty_base = alignMap[yts.align] || alignMap.center;\n const tx = 14 + (yts.offsetX || 0);\n const ty = ty_base + (yts.offsetY || 0);\n \n ctx.save();\n ctx.translate(tx, ty);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = yts.align === 'left' ? 'right' : yts.align === 'right' ? 'left' : 'center';\n ctx.font = `${yts.fontWeight || 'normal'} ${yts.fontSize || 13}px system-ui, sans-serif`;\n ctx.fillStyle = yts.color || th.text;\n ctx.fillText(opt.yAxis.title, 0, 0);\n ctx.restore();\n }\n }\n\n _drawSeries(ctx, toPixX, toPixY, th, opt) {\n const results = [];\n \n for (const s of opt.series || []) {\n let logX = 0, logY = 0;\n\n // Normalized 1D array support: data: [x, y]\n if (Array.isArray(s.data) && s.data.length >= 2) {\n const valX = typeof s.data[0] === 'object' ? s.data[0].value : s.data[0];\n const valY = typeof s.data[1] === 'object' ? s.data[1].value : s.data[1];\n logX = s.logScale === false ? valX : Math.log10(valX || 1e-9);\n logY = s.logScale === false ? valY : Math.log10(valY || 1e-9);\n } \n // Fallback for custom format {dataX, dataY}\n else if (s.dataX !== undefined && s.dataY !== undefined) {\n logX = s.logScale === false ? s.dataX : Math.log10(s.dataX || 1e-9);\n logY = s.logScale === false ? s.dataY : Math.log10(s.dataY || 1e-9);\n } else {\n continue;\n }\n\n const px = toPixX(logX);\n const py = toPixY(logY);\n\n // Determine active zone\n let matchZone = null;\n if (opt.zone && opt.zone.data) {\n for (const zone of opt.zone.data) {\n if (zone.poly && inPoly(logX, logY, zone.poly)) {\n matchZone = zone;\n break;\n }\n }\n }\n\n results.push({ series: s, zone: matchZone, logX, logY, px, py });\n\n const color = s.color || '#00e5ff';\n const size = s.size || 6;\n const shape = s.shape || 'circle';\n const isHover = this._hoverPoint && this._hoverPoint.series === s;\n\n ctx.save();\n ctx.translate(px, py);\n\n // Glow\n const gs = s.glowStyle || {};\n if (gs.show || (isHover && gs.show !== false)) {\n ctx.shadowColor = gs.color || hexToRgba(color, 0.8);\n ctx.shadowBlur = gs.blur || 15;\n }\n\n ctx.fillStyle = color;\n ctx.strokeStyle = s.itemStyle?.borderColor || 'none';\n ctx.lineWidth = s.itemStyle?.borderWidth || 0;\n\n if (ctx.strokeStyle === 'none' || !s.itemStyle?.borderColor) ctx.lineWidth = 0;\n\n ctx.beginPath();\n drawShapePath(ctx, 0, 0, shape, size, 1, 0);\n\n ctx.fill();\n if (ctx.lineWidth > 0) ctx.stroke();\n\n // Text\n const ts = s.textStyle;\n if (ts && ts.show && s.name) {\n ctx.shadowBlur = 0; // Disable shadow for text\n const posOffsets = {\n top: [0, -(size + 6)], bottom: [0, size + 12],\n left: [-(size + 6), 4], right: [size + 6, 4]\n };\n const [ox, oy] = posOffsets[ts.position] || posOffsets.top;\n \n ctx.textAlign = ts.position === 'left' ? 'right' : ts.position === 'right' ? 'left' : 'center';\n ctx.textBaseline = 'middle';\n ctx.font = `${ts.fontWeight || 'normal'} ${ts.fontSize || 12}px system-ui, sans-serif`;\n ctx.fillStyle = ts.color || color;\n ctx.fillText(s.name, ox, oy);\n }\n\n ctx.restore();\n }\n\n this._drawnPoints = results;\n return results;\n }\n\n _defaultTooltipHTML(hp, opt) {\n const s = hp.series;\n const rawX = Math.pow(10, hp.logX).toPrecision(4);\n const rawY = Math.pow(10, hp.logY).toPrecision(4);\n const xTitle = opt.xAxis.title || 'X';\n const yTitle = opt.yAxis.title || 'Y';\n const zTitle = hp.zone ? (hp.zone.title || hp.zone.name) : 'Outside';\n const zColor = hp.zone ? (hp.zone.color || '#fff') : '#fff';\n\n return `\n <div style=\"font-weight:bold; font-size:14px; margin-bottom:6px; color:#fff;\">${s.name || 'Data Point'}</div>\n <div style=\"font-size:13px; font-weight:bold; color:${zColor}; border-bottom:1px solid rgba(255,255,255,0.1); padding-bottom:6px; margin-bottom:8px;\">${zTitle}</div>\n <div style=\"font-size:13px; color:#cbd5e1; display:flex; justify-content:space-between; margin-bottom:4px;\">\n <span>${xTitle}:</span><span style=\"font-weight:bold; color:#fff; margin-left:12px;\">${rawX}</span>\n </div>\n <div style=\"font-size:13px; color:#cbd5e1; display:flex; justify-content:space-between;\">\n <span>${yTitle}:</span><span style=\"font-weight:bold; color:#fff; margin-left:12px;\">${rawY}</span>\n </div>\n `;\n }\n}"],"names":["EventBus","ev","fn","f","d","ZoomController","cfg","deltaY","ax","ay","dir","nz","rat","cx","cy","scale","was","ctx","hexToRgba","hex","alpha","h","r","g","b","deepMerge","target","source","k","sv","inPoly","px","py","poly","inside","i","j","xi","yi","xj","yj","DOMTooltip","container","theme","tt","textStyle","padding","p","html","x","y","tooltipOpt","zone","bw","bc","rect","tw","th","left","top","parseGridBox","W","H","grid","defaultPadding","parse","val","max","def","right","bottom","availW","availH","drawShapePath","shape","size","offset","radius","inn","a","side","rx","ry","TRIANGLE_ZONES_1","TRIANGLE_ZONES_4","TRIANGLE_ZONES_5","PENTAGON_ZONES_1","PENTAGON_ZONES_2","ETRA_ZONES_A","ETRA_ZONES_B","THREE_RADIO_ZONES","computedPercent","values","nums","v","total","sum","n","pct","_pentagonRatioToDoc","H2","C2H2","C2H4","CH4","C2H6","vals","s","ratio","R","angles","_inPentagonPoly","DiagnosticTools","ch4","c2h4","c2h2","h2","c2h6","pt","last","_PentagonCoord","verts","bx","by","dx","dy","len2","t","t2","v0","v1","v2","denom","l0","l1","l2","tot","ang","_","polyPoint","vx","vy","data","gasOrder","isObj","item","decimals","__publicField","PentagonCoord","_ThemeManager","ThemeManager","ZoneRenderer","zoneOpt","S","gLabel","gBorder","z","pts","bStyle","ff","lStyle","lx","ly","fs","fontStyle","text","padX","padY","bh","GridRenderer","vertexOpt","gridOpt","_a","lineStyle","lw","lc","lt","globalDist","style","dist","distOffset","fontWeight","fontSize","parseRgba","color","cleaned","m","interpolateColor","c1","c2","factor","r1","g1","b1","a1","r2","g2","b2","a2","PointRenderer","series","hoverPoint","results","ptName","docX","docY","globalItemStyle","borderColor","borderWidth","opacity","globalTextStyle","textShow","textColor","textFontSize","textFontWeight","textPosition","textOffset","globalGlowStyle","glowShow","glowColorsOpt","glowBlur","glowStartColor","glowEndColor","glowCount","glowDistance","glowColors","layers","glowColor","textAlign","textBaseline","tx","ty","offsetVal","_DuvalPentagon","option","defaultLabelStyle","opt","_b","c","hoveredPoint","minDistance","pr","showTooltip","hr","dpr","w","box","gas","bgColor","resList","res","hx","hy","vertexData","rawData","pointNameStr","zoneStr","zoneColor","key","_c","_d","col","rawValStr","found","DuvalPentagon","TriangleConfig","TriangleMath","triH","startX","startY","tri","T","L","A","cross","sideOrder","raw","v3","TriangleRenderer","state","zones","globalBorderStyle","globalLabelStyle","lab","centPx","pad","fx","fy","len","ux","uy","sz","steps","majorEvery","majorLineStyle","getNormal","p1","p2","inwardPt","n1","n2","normals","isMajor","currentStyle","ln","tStyle","tickLen","tickLineColor","tickColor","font","drawLine","nx","ny","p0","sOpt","names","fw","lMid","lDx","lDy","lLen","rMid","rDx","rDy","rLen","canvasPt","isHov","DuvalTriangle","containerIdOrEl","el","tooltipCfg","zoneData","path","pa","pb","pc","ppt","cen","aW","aH","cv","scaleX","scaleY","e","nearest","minDist","ptData","tOpt","foundZone","sNames","canvasRect","containerRect","offsetX","offsetY","hovered","showPoint","showDiagnostic","axisColors","name","ThreeRatioConfig","DGAScale","u","Renderer3D","opts","themeName","defaultWall","defaultAxis","defaultPlane2D","zonesOpt","zonesData","lblStyle","labelColor","fontParts","fontStr","edgeStr","colorToRgba","base","custom","family","dz","cz","RX","RY","cosX","sinX","cosY","sinY","x1","z1","y1","z2","sc","fov","pz","cam","points","view","flat","fadeTarget","d3a","pts4","fill","stroke","pp","x0","y0","z0","edge","wallOpt","tv","walls","gridColor","segs","vis","fA","axisOpt","as","labels","ta","uz","pos","pv","lbl","hasGlowStyle","glowStyle","baseColor","startColor","endColor","plane","opt2d","axOpt","sqSize","u2c","h0","h1","pw","ph","mx","my","hColor","vColor","fontFam","_ThreeRatioChart","arr","tgt","hits","event","handler","args","entries","width","height","ThreeRatioChart","DEFAULTS","THEME","fmtLog","ETRAChart","mouseX","mouseY","panX","panY","zoom","rawX","rawY","xMin","xMax","yMin","yMax","plotW","plotH","gL","gT","toPixX","logVal","toPixY","hp","glStyle","majorColor","minorColor","sub","lxm","pxm","lym","pym","sumX","sumY","label","xLabelColor","yLabelColor","xls","yls","xts","alignMap","yts","ty_base","logX","logY","valX","valY","matchZone","isHover","gs","ts","posOffsets","ox","oy","xTitle","yTitle","zTitle","zColor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/utils.js","../src/zones.js","../src/pentagon.js","../src/triangle.js","../src/three-ratio.js","../src/etra.js"],"sourcesContent":["/**\n * DGA 图表核心工具库 (Utils)\n * 包含: 通用事件总线 EventBus、缩放交互 ZoomController、\n * DOM 原生悬浮提示框 DOMTooltip、颜色计算、数学判定等公用辅助函数\n */\nexport const DEFAULT_COLORS = [\n '#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de',\n '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'\n];\n\nexport class EventBus {\n constructor() {\n this._h = Object.create(null);\n }\n on(ev, fn) {\n (this._h[ev] || (this._h[ev] = [])).push(fn);\n return this;\n }\n off(ev, fn) {\n if (!fn) {\n delete this._h[ev];\n return this;\n }\n if (this._h[ev]) this._h[ev] = this._h[ev].filter((f) => f !== fn);\n return this;\n }\n emit(ev, d) {\n (this._h[ev] || []).slice().forEach((fn) => fn(d));\n return this;\n }\n dispose() {\n this._h = Object.create(null);\n }\n}\n\n/**\n * 通用缩放和平移控制器\n */\nexport class ZoomController {\n constructor(cfg = {}) {\n this.zoom = 1;\n this.panX = 0;\n this.panY = 0;\n this._min = cfg.min ?? 0.3;\n this._max = cfg.max ?? 6;\n this._step = cfg.step ?? 0.12;\n this._dragging = false;\n this._dragStart = null;\n this._panStart = null;\n }\n onWheel(deltaY, ax, ay) {\n const dir = deltaY < 0 ? 1 : -1;\n const nz = Math.min(this._max, Math.max(this._min, this.zoom * (1 + dir * this._step)));\n const rat = nz / this.zoom;\n this.panX = ax - rat * (ax - this.panX);\n this.panY = ay - rat * (ay - this.panY);\n this.zoom = nz;\n return this;\n }\n startDrag(cx, cy) {\n this._dragging = true;\n this._dragStart = { x: cx, y: cy };\n this._panStart = { x: this.panX, y: this.panY };\n }\n moveDrag(cx, cy, scale) {\n if (!this._dragging) return false;\n this.panX = this._panStart.x + (cx - this._dragStart.x) * scale;\n this.panY = this._panStart.y + (cy - this._dragStart.y) * scale;\n return true;\n }\n endDrag() {\n const was = this._dragging;\n this._dragging = false;\n return was;\n }\n reset() {\n this.zoom = 1;\n this.panX = 0;\n this.panY = 0;\n return this;\n }\n get isDragging() {\n return this._dragging;\n }\n get state() {\n return { zoom: this.zoom, panX: this.panX, panY: this.panY };\n }\n applyTransform(ctx) {\n ctx.translate(this.panX, this.panY);\n ctx.scale(this.zoom, this.zoom);\n }\n}\n\n/**\n * 将 hex 颜色转换为 rgba\n * @param {string} hex \n * @param {number} alpha \n * @returns {string}\n */\nexport function hexToRgba(hex, alpha) {\n const h = hex.replace('#', '');\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n return `rgba(${r},${g},${b},${alpha})`;\n}\n\n/**\n * 深度合并对象\n * @param {object} target \n * @param {object} source \n * @returns {object}\n */\nexport function deepMerge(target, source) {\n for (const k of Object.keys(source)) {\n const sv = source[k];\n if (sv !== null && typeof sv === 'object' && !Array.isArray(sv)) {\n target[k] = target[k] && typeof target[k] === 'object' ? target[k] : {};\n deepMerge(target[k], sv);\n } else {\n target[k] = sv;\n }\n }\n return target;\n}\n\n/**\n * 射线法判断点是否在多边形内\n * @param {number} px \n * @param {number} py \n * @param {number[][]} poly \n * @returns {boolean}\n */\nexport function inPoly(px, py, poly) {\n let inside = false;\n for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n const [xi, yi] = poly[i],\n [xj, yj] = poly[j];\n if (yi > py !== yj > py && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi) inside = !inside;\n }\n return inside;\n}\n\n/**\n * 通用 DOM 悬浮提示框\n */\nexport class DOMTooltip {\n constructor(container, theme) {\n this.container = container;\n this.el = document.createElement('div');\n this.el.style.position = 'absolute';\n this.el.style.pointerEvents = 'none';\n this.el.style.display = 'none';\n this.el.style.zIndex = '9999';\n this.el.style.transition = 'left 0.1s, top 0.1s';\n \n // 确保容器至少有 relative 定位\n const compStyle = window.getComputedStyle(container);\n if (compStyle.position === 'static') {\n container.style.position = 'relative';\n }\n \n container.appendChild(this.el);\n this.updateTheme(theme);\n }\n\n updateTheme(theme) {\n if (!theme) return;\n const tt = theme.tooltip || {};\n const textStyle = tt.textStyle || {};\n this.el.style.backgroundColor = tt.backgroundColor || theme.tooltipBg || 'rgba(6,13,31,0.93)';\n this.el.style.color = textStyle.color || theme.tooltipTextColor || '#c8ddf0';\n\n let padding = tt.padding !== undefined ? tt.padding : (theme.tooltipPadding || 10);\n if (typeof padding === 'number') {\n this.el.style.padding = `${padding}px`;\n } else if (Array.isArray(padding)) {\n this.el.style.padding = padding.map(p => `${p}px`).join(' ');\n } else {\n this.el.style.padding = padding + 'px';\n }\n\n this.el.style.borderRadius = '5px';\n this.el.style.border = `1px solid ${theme.zoneBorderColor || 'rgba(255,255,255,0.25)'}`;\n this.el.style.boxShadow = '0 0 10px rgba(0,0,0,0.45)';\n this.el.style.fontFamily = theme.fontFamily || 'Rajdhani, sans-serif';\n this.el.style.fontSize = textStyle.fontSize !== undefined ? (typeof textStyle.fontSize === 'number' ? `${textStyle.fontSize}px` : textStyle.fontSize) : '12px';\n }\n\n show(html, x, y, tooltipOpt = {}, theme = {}, zone = null) {\n this.el.innerHTML = html;\n this.el.style.display = 'block';\n\n // 1. 背景色\n this.el.style.backgroundColor = tooltipOpt.backgroundColor || theme.tooltipBg || 'rgba(6,13,31,0.93)';\n\n // 2. 边框\n const bw = tooltipOpt.borderWidth !== undefined ? (typeof tooltipOpt.borderWidth === 'number' ? `${tooltipOpt.borderWidth}px` : tooltipOpt.borderWidth) : '1px';\n const bc = tooltipOpt.borderColor || (zone ? zone.borderColor || theme.zoneBorderColor || zone.color : 'rgba(255,255,255,0.25)');\n this.el.style.border = `${bw} solid ${bc}`;\n\n // 3. 内边距\n if (tooltipOpt.padding !== undefined) {\n if (typeof tooltipOpt.padding === 'number') {\n this.el.style.padding = `${tooltipOpt.padding}px`;\n } else if (Array.isArray(tooltipOpt.padding)) {\n this.el.style.padding = tooltipOpt.padding.map(p => `${p}px`).join(' ');\n } else {\n this.el.style.padding = tooltipOpt.padding;\n }\n } else {\n this.el.style.padding = (theme.tooltipPadding || 10) + 'px';\n }\n\n // 4. 文字样式\n const textStyle = tooltipOpt.textStyle || {};\n this.el.style.color = textStyle.color || theme.tooltipTextColor || '#c8ddf0';\n this.el.style.fontStyle = textStyle.fontStyle || '';\n this.el.style.fontWeight = textStyle.fontWeight || textStyle.fontStyle || '';\n this.el.style.fontSize = textStyle.fontSize !== undefined ? (typeof textStyle.fontSize === 'number' ? `${textStyle.fontSize}px` : textStyle.fontSize) : '12px';\n this.el.style.fontFamily = theme.fontFamily || 'Rajdhani, sans-serif';\n\n // 简单边缘检测\n const rect = this.container.getBoundingClientRect();\n const tw = this.el.offsetWidth;\n const th = this.el.offsetHeight;\n\n let left = x + 15;\n let top = y - th / 2;\n\n if (left + tw > rect.width) {\n left = x - tw - 15;\n }\n if (top < 0) top = 0;\n if (top + th > rect.height) top = rect.height - th;\n\n this.el.style.left = left + 'px';\n this.el.style.top = top + 'px';\n }\n\n hide() {\n this.el.style.display = 'none';\n }\n\n dispose() {\n if (this.el && this.el.parentNode) {\n this.el.parentNode.removeChild(this.el);\n }\n }\n}\n\n/**\n * 解析 ECharts 风格的 grid 边距模型\n * 支持数值 (像素) 和字符串百分比 (如 '10%')\n */\nexport function parseGridBox(W, H, grid = {}, defaultPadding = 45) {\n const parse = (val, max, def) => {\n if (val === undefined || val === null) return def;\n if (typeof val === 'string' && val.endsWith('%')) return (parseFloat(val) / 100) * max;\n return parseFloat(val) || 0;\n };\n\n const left = parse(grid.left, W, defaultPadding);\n const right = parse(grid.right, W, defaultPadding);\n const top = parse(grid.top, H, defaultPadding);\n const bottom = parse(grid.bottom, H, defaultPadding);\n\n const availW = Math.max(0, W - left - right);\n const availH = Math.max(0, H - top - bottom);\n const cx = left + availW / 2;\n const cy = top + availH / 2;\n\n return { left, right, top, bottom, availW, availH, cx, cy };\n}\n\n/**\n * 绘制各种形状的数据点路径\n * 支持: circle, ring, star, triangle, diamond, square, rect\n */\nexport function drawShapePath(ctx, px, py, shape, size, scale = 1, offset = 0) {\n const radius = (size + offset) * scale;\n\n if (shape === 'circle' || shape === 'ring') {\n ctx.arc(px, py, radius, 0, Math.PI * 2);\n } else if (shape === 'star') {\n const inn = radius * 0.42;\n for (let k = 0; k < 10; k++) {\n const a = (k * Math.PI) / 5 - Math.PI / 2;\n const r = k % 2 === 0 ? radius : inn;\n k === 0\n ? ctx.moveTo(px + r * Math.cos(a), py + r * Math.sin(a))\n : ctx.lineTo(px + r * Math.cos(a), py + r * Math.sin(a));\n }\n ctx.closePath();\n } else if (shape === 'triangle') {\n for (let i = 0; i < 3; i++) {\n const a = -Math.PI / 2 + (i * 2 * Math.PI) / 3;\n const x = px + radius * Math.cos(a);\n const y = py + radius * Math.sin(a);\n i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n }\n ctx.closePath();\n } else if (shape === 'diamond') {\n ctx.moveTo(px, py - radius);\n ctx.lineTo(px + radius, py);\n ctx.lineTo(px, py + radius);\n ctx.lineTo(px - radius, py);\n ctx.closePath();\n } else if (shape === 'square' || shape === 'rect') {\n const side = (size + offset) * 2 * scale;\n const rx = px - side / 2;\n const ry = py - side / 2;\n ctx.rect(rx, ry, side, side);\n } else {\n ctx.arc(px, py, radius, 0, Math.PI * 2);\n }\n}\n","/**\n * DGA 核心诊断规则库 (Zones Constants)\n * 包含所有图表的出厂默认故障区域定义(多边形顶点坐标、颜色及标识名)\n * 如:三角形区域、五边形区域、三比值空间区块、ETRA 平面区域\n */\nexport const TRIANGLE_ZONES_1 = [\n {\n name: 'PD', color: '#A0DC99',\n coordinates: [[1, 0, 0], [0.95, 0.05, 0], [0.95, 0, 0.05]]\n },\n {\n name: 'D1', color: '#77A3FC',\n coordinates: [[0.85, 0.15, 0], [0, 1, 0], [0, 0.75, 0.25], [0.6, 0.15, 0.25]]\n },\n {\n name: 'D2', color: '#E3F2FF',\n coordinates: [[0, 0.75, 0.25], [0, 0.28, 0.72], [0.32, 0.28, 0.40], [0.45, 0.15, 0.40], [0.6, 0.15, 0.25]]\n },\n {\n name: 'T1', color: '#CBE4FD',\n coordinates: [[0.95, 0.05, 0], [0.85, 0.05, 0.1], [0.9, 0, 0.1], [0.95, 0, 0.05]]\n },\n {\n name: 'T2', color: '#56AD4A',\n coordinates: [[0.85, 0.05, 0.1], [0.45, 0.05, 0.50], [0.5, 0, 0.5], [0.9, 0, 0.1]]\n },\n {\n name: 'T3', color: '#5490FF',\n coordinates: [[0.5, 0, 0.5], [0.35, 0.15, 0.50], [0, 0.15, 0.85], [0, 0, 1]]\n },\n {\n name: 'DT', color: '#313CFF',\n coordinates: [[0.95, 0.05, 0], [0.85, 0.15, 0], [0.45, 0.15, 0.40], [0.32, 0.28, 0.40], [0, 0.28, 0.72], [0, 0.15, 0.85], [0.35, 0.15, 0.50], [0.45, 0.05, 0.50]]\n },\n];\n\nexport const TRIANGLE_ZONES_4 = [\n {\n name: 'PD', color: '#A0DC99',\n coordinates: [[0.975, 0, 0.025], [0.955, 0.02, 0.025], [0.83, 0.02, 0.15], [0.85, 0, 0.15]]\n },\n {\n name: 'S', color: '#313CFF',\n coordinates: [[1, 0, 0], [0.45, 0.55, 0], [0.08, 0.52, 0.40], [0.08, 0.30, 0.62], [0.15, 0.30, 0.55], [0.15, 0.25, 0.60], [0.4, 0.25, 0.35], [0.65, 0, 0.35], [0.85, 0, 0.15], [0.83, 0.02, 0.15], [0.955, 0.02, 0.025], [0.975, 0, 0.025]]\n },\n {\n name: 'C', color: '#3587FF',\n coordinates: [[0.65, 0, 0.35], [0.4, 0.25, 0.35], [0.15, 0.25, 0.60], [0.15, 0.30, 0.55], [0, 0.3, 0.7], [0, 0, 1]]\n },\n {\n name: 'O', color: '#6AA4FF',\n coordinates: [[0.08, 0.92, 0], [0, 1, 0], [0, 0.3, 0.7], [0.08, 0.3, 0.62]]\n },\n {\n name: 'ND', color: '#BEE1FD',\n coordinates: [[0.45, 0.55, 0], [0.08, 0.92, 0], [0.08, 0.52, 0.40],]\n },\n];\n\nexport const TRIANGLE_ZONES_5 = [\n {\n name: 'PD', color: '#A0DC99',\n coordinates: [[0.85, 0.15, 0], [0.83, 0.15, 0.02], [0.96, 0.02, 0.02], [0.98, 0.02, 0]]\n },\n {\n name: 'T2', color: '#56AD4A',\n coordinates: [[0.9, 0, 0.1], [0.65, 0, 0.35], [0.525, 0.125, 0.35], [0.775, 0.125, 0.1]]\n },\n\n {\n name: 'S', color: '#313CFF',\n coordinates: [[0.85, 0.15, 0], [0.35, 0.65, 0], [0.25, 0.65, 0.1], [0.75, 0.15, 0.1],]\n },\n {\n name: 'C', color: '#3587FF',\n coordinates: [[0.6, 0.3, 0.1], [0, 0.3, 0.7], [0.15, 0.15, 0.7], [0.35, 0.15, 0.5], [0.375, 0.125, 0.5], [0.775, 0.125, 0.1]]\n },\n {\n name: 'O', color: '#6AA4FF',\n coordinates: [[1, 0, 0], [0.98, 0.02, 0], [0.96, 0.02, 0.02], [0.83, 0.15, 0.02], [0.85, 0.15, 0], [0, 1, 0], [0, 0.9, 0.1], [0.35, 0.55, 0.1], [0.45, 0.55, 0], [0.85, 0.15, 0], [0.75, 0.15, 0.1], [0.9, 0, 0.1]]\n },\n {\n name: 'T3-H', color: '#77A3FC',\n coordinates: [[0.35, 0.3, 0.35], [0, 0.65, 0.35], [0, 0, 1], [0.65, 0, 0.35], [0.525, 0.125, 0.35], [0.375, 0.125, 0.5], [0.35, 0.15, 0.5], [0.15, 0.15, 0.7], [0, 0.3, 0.7]],\n labelAt: [0.1, 0.42, 0.48]\n },\n {\n name: 'ND', color: '#E3F2FF',\n coordinates: [[0.6, 0.3, 0.1], [0, 0.9, 0.1], [0, 0.65, 0.35], [0.35, 0.3, 0.35]]\n },\n];\n\nexport const PENTAGON_ZONES_1 = [\n {\n name: 'PD',\n title: '电晕型局部放电',\n color: '#A0DC99',\n coordinates: [\n [0, 33],\n [-1, 33],\n [-1, 24.5],\n [0, 24.5],\n ],\n },\n {\n name: 'D1',\n title: '低能量放电或火花型局部放电',\n color: '#81ADFF',\n coordinates: [\n [0, 40],\n [38, 12],\n [32, -6.1],\n [4, 16],\n [0, 1.5],\n ],\n },\n {\n name: 'D2',\n title: '高能量放电',\n color: '#E3F2FF',\n coordinates: [\n [4, 16],\n [32, -6.1],\n [24.3, -30],\n [0, -3],\n [0, 1.5],\n ],\n },\n {\n name: 'T3',\n title: '过热故障,t>700℃',\n color: '#5490FF',\n coordinates: [\n [0, -3],\n [24.3, -30],\n [23.5, -32.4],\n [1, -32.4],\n [-6, -4],\n ],\n },\n {\n name: 'T2',\n title: '过热故障,300℃<t<700℃',\n color: '#56AD4A',\n coordinates: [\n [-6, -4],\n [1, -32.4],\n [-22.5, -32.4],\n ],\n },\n {\n name: 'T1',\n title: '过热故障,t<300℃',\n color: '#CBE4FD',\n coordinates: [\n [-6, -4],\n [-22.5, -32.4],\n [-23.5, -32.4],\n [-35, 3],\n [0, 1.5],\n [0, -3],\n ],\n },\n {\n name: 'S',\n title: '温度<200℃时的杂散气体',\n color: '#2735FF',\n coordinates: [\n [0, 1.5],\n [-35, 3.1],\n [-38, 12.4],\n [0, 40],\n [0, 33],\n [-1, 33],\n [-1, 24.5],\n [0, 24.5],\n ],\n },\n];\n\nexport const PENTAGON_ZONES_2 = [\n {\n \"name\": \"PD\",\n \"title\": \"电晕型局部放电\",\n \"color\": \"#A0DC99\",\n \"coordinates\": [\n [0, 33],\n [-1, 33],\n [-1, 24.5],\n [0, 24.5]\n ]\n },\n {\n \"name\": \"D1\",\n \"title\": \"低能量放电或火花型局部放电\",\n \"color\": \"#81ADFF\",\n \"coordinates\": [\n [0, 40],\n [38, 12],\n [32, -6.1],\n [4, 16],\n [0, 1.5]\n ]\n },\n {\n \"name\": \"D2\",\n \"title\": \"高能量放电\",\n \"color\": \"#E3F2FF\",\n \"coordinates\": [\n [4, 16],\n [32, -6.1],\n [24.3, -30],\n [0, -3],\n [0, 1.5]\n ]\n },\n {\n \"name\": \"S\",\n \"title\": \"温度<200℃时的杂散气体\",\n \"color\": \"#2735FF\",\n \"coordinates\": [\n [0, 1.5],\n [-35, 3.1],\n [-38, 12.4],\n [0, 40],\n [0, 33],\n [-1, 33],\n [-1, 24.5],\n [0, 24.5]\n ]\n },\n {\n \"name\": \"T3-H\",\n \"title\": \"——仅矿物油过热\",\n \"color\": \"#25A53D\",\n \"coordinates\": [\n [0, -3],\n [24.3, -30],\n [23.5, -32.4],\n [2.5, -32.4],\n [-3.5, -3]\n ]\n },\n {\n \"name\": \"C\",\n \"title\": \"绝缘纸可能碳化\",\n \"color\": \"#3587FF\",\n \"coordinates\": [\n [-3.5, -3],\n [2.5, -32.4],\n [-21.5, -32.4],\n [-11, -8]\n ]\n },\n {\n \"name\": \"O\",\n \"title\": \"过热温度<250℃,绝缘纸不碳化\",\n \"color\": \"#6AA4FF\",\n \"coordinates\": [\n [-3.5, -3],\n [-11, -8],\n [-21.5, -32.4],\n [-23.5, -32.4],\n [-35, 3.1],\n [0, 1.5],\n [0, -3]\n ]\n }\n];\n\nexport const ETRA_ZONES_A = [\n {\n name: 'D1/PD', title: '局部放电',\n color: '#51b4c8',\n coordinates: [[-2, 3], [3, 3], [3, 0], [-2, 0]] // Y >= 1 (logY >= 0), full X\n },\n {\n name: 'T3/DT', title: '高温热故障/放电+热',\n color: '#fe9d37',\n coordinates: [[-2, 0], [3, 0], [3, -2], [-2, -2]] // -2 <= logY <= 0, full X\n },\n {\n name: 'T1', title: '过热故障,t<300℃',\n color: '#df4d41',\n coordinates: [[-2, -2], [0, -2], [0, -3], [-2, -3]]\n },\n {\n name: 'T2', title: '过热故障,300℃<t<700℃',\n color: '#458be6',\n coordinates: [[0, -2], [0.4, -2], [0.4, -3], [0, -3]]\n },\n {\n name: 'T3', title: '过热故障,t>700℃',\n color: '#8c2fae',\n coordinates: [[0.4, -2], [3, -2], [3, -3], [0.4, -3]]\n }\n];\n\nexport const ETRA_ZONES_B = [\n {\n name: 'D2', title: '高能放电',\n color: '#63a856',\n // Y >= 10 AND X >= 10 → logY>=1, logX>=1\n coordinates: [[-2, 3], [3, 3], [3, 0], [1, 0], [1, 1], [-2, 1]]\n },\n {\n name: 'D1', title: '低能放电',\n color: '#f16335',\n // L-shape: Y>=1 AND X<10\n // = (logY in [0,3], logX in [-2,1])\n coordinates: [[-2, 1], [1, 1], [1, 0], [-2, 0]]\n },\n {\n name: 'PD', title: '局部放电',\n color: '#53b7cc',\n coordinates: [[-2, 0], [0, 0], [0, -2], [-2, -2]]\n },\n {\n name: 'T3/DT', title: '高温热/放电+热',\n color: '#fe9d37',\n coordinates: [[0, 0], [3, 0], [3, -2], [0, -2]]\n },\n {\n name: 'T1', title: '过热故障,t<300℃',\n color: '#df4d41',\n coordinates: [[-2, -2], [0, -2], [0, -3], [-2, -3]]\n },\n {\n name: 'T2', title: '过热故障,300℃<t<700℃',\n color: '#458be6',\n coordinates: [[0, -2], [0.4, -2], [0.4, -3], [0, -3]]\n },\n {\n name: 'T3', title: '过热故障,t>700℃',\n color: '#8c2fae',\n coordinates: [[0.4, -2], [3, -2], [3, -3], [0.4, -3]]\n }\n];\nexport const THREE_RADIO_ZONES = [\n {\n name: 'PD', title: '电晕型局部放电',\n color: '#09FAFF',\n coordinates: [[0, 0, 0], [0.2, 0.1, 0.01]], // 结束坐标点\n },\n {\n name: 'T1', title: '过热故障,t<300℃',\n color: '#EC9B9A',\n coordinates: [[0, 1, 0], [1, 10, 0.01]],\n },\n {\n name: 'T2', title: '过热故障,300℃<t<700℃',\n color: '#A0C9F5',\n coordinates: [[1, 1, 0], [4, 10, 0.1]],\n },\n {\n name: 'T3', title: '过热故障,t>700℃',\n color: '#CA677B',\n coordinates: [[4, 1, 0], [10, 10, 0.2]],\n },\n {\n name: 'D1', title: '低能量放电火花型局部放电',\n color: '#FF7B16',\n coordinates: [[1, 0.1, 1], [10, 0.5, 10]],\n },\n {\n name: 'D2', title: '高能量放电',\n color: '#48FF16',\n coordinates: [[2, 0.1, 0.6], [10, 1, 2.5]],\n },\n];\nexport function computedPercent(values) {\n if (!Array.isArray(values)) return [];\n const nums = values.map(v => Math.max(Number(v) || 0, 0));\n const total = nums.reduce((sum, n) => sum + n, 0);\n if (total === 0) return nums.map(() => 0);\n return nums.map(n => {\n const pct = (n / total) * 100;\n return Math.round(pct * 100) / 100;\n });\n}\n\nfunction _pentagonRatioToDoc(H2, C2H2, C2H4, CH4, C2H6) {\n const vals = [H2, C2H2, C2H4, CH4, C2H6].map(v => Math.max(0, Number(v) || 0));\n const total = vals.reduce((s, v) => s + v, 0);\n if (total <= 0) return null;\n const ratio = vals.map(v => v / total);\n const R = 40;\n const angles = [90, 18, -54, -126, 162];\n let x = 0, y = 0;\n for (let i = 0; i < 5; i++) {\n const a = angles[i] * Math.PI / 180;\n x += ratio[i] * R * Math.cos(a);\n y += ratio[i] * R * Math.sin(a);\n }\n return { x, y, ratio };\n}\n\nfunction _inPentagonPoly(px, py, poly) {\n let inside = false;\n for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n const [xi, yi] = poly[i], [xj, yj] = poly[j];\n if ((yi > py) !== (yj > py) && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi) {\n inside = !inside;\n }\n }\n return inside;\n}\n\nexport const DiagnosticTools = {\n duvalTriangle1: (CH4, C2H4, C2H2) => {\n const total = CH4 + C2H4 + C2H2;\n if (total <= 0) return { code: \"INVALID\", label: \"无效输入\" };\n const [ch4, c2h4, c2h2] = computedPercent([CH4, C2H4, C2H2]);\n if (ch4 >= 98) return { code: \"PD\", label: \"局部放电\" };\n if (c2h4 >= 23 && c2h2 <= 13) return { code: \"D1\", label: \"低能放电\" };\n if (c2h4 >= 23 && c2h4 <= 40 && c2h2 >= 13 && c2h2 <= 29) return { code: \"D2\", label: \"高能放电\" };\n if (c2h2 <= 4 && c2h4 <= 20) return { code: \"T1\", label: \"热故障(t < 300℃)\" };\n if (c2h2 <= 4 && c2h4 > 20 && c2h4 <= 50) return { code: \"T2\", label: \"热故障(300℃ < t < 700℃)\" };\n if (c2h2 <= 15 && c2h4 >= 50) return { code: \"T3\", label: \"热故障(t > 700℃)\" };\n return { code: \"ND\", label: \"区域未定义\" };\n },\n duvalTriangle4: (H2, C2H6, CH4) => {\n const total = H2 + C2H6 + CH4;\n if (total <= 0) return { code: \"INVALID\", label: \"无效输入\" };\n const [h2, c2h6, ch4] = computedPercent([H2, C2H6, CH4]);\n if (c2h6 >= 1 && ch4 >= 2 && ch4 <= 15) return { code: \"PD\", label: \"电晕型局部放电\" };\n if (h2 <= 9 && c2h6 >= 24 && c2h6 <= 46 && ch4 <= 36) return { code: \"S\", label: '温度<200℃时的杂散气体' };\n if (h2 <= 9 && c2h6 <= 30) return { code: \"O\", label: \"过热温度<250℃,绝缘纸不碳化\" };\n if (c2h6 >= 24 && c2h6 <= 30 && ch4 >= 36) return { code: \"C\", label: \"绝缘纸可能碳化\" };\n return { code: \"ND\", label: \"区域未定义\" };\n },\n duvalTriangle5: (CH4, C2H4, C2H6) => {\n const total = CH4 + C2H4 + C2H6;\n if (total <= 0) return { code: \"INVALID\", label: \"无效输入\" };\n const [ch4, c2h4, c2h6] = computedPercent([CH4, C2H4, C2H6]);\n if (ch4 >= 85 && ch4 <= 100 && c2h6 >= 0 && c2h6 <= 15) return { code: \"PD\", label: \"电晕型局部放电\" };\n if ((c2h4 >= 35 && c2h4 <= 100 && c2h6 >= 0 && c2h6 <= 14) ||\n (c2h4 >= 35 && c2h4 <= 70 && c2h6 >= 30 && c2h6 <= 75)) return { code: \"T3\", label: \"高温过热故障(t > 700℃)\" };\n if (c2h4 >= 10 && c2h4 <= 35 && c2h6 >= 0 && c2h6 <= 12) return { code: \"T2\", label: \"中温过热故障(t > 300℃)\" };\n if (c2h4 >= 10 && c2h4 <= 70 && c2h6 >= 12 && c2h6 <= 30) return { code: \"C\", label: \"绝缘纸碳化故障\" };\n if (c2h4 <= 10 && c2h6 >= 15 && c2h6 <= 54) return { code: \"S\", label: \"矿物油杂散气体(低温过热 90℃~200℃)\" };\n if (c2h4 <= 10 && (c2h6 <= 15 || c2h6 >= 54)) return { code: \"O\", label: \"过热故障\" };\n return { code: \"ND\", label: \"区域未定义\" };\n },\n duvalPentagon1: (H2, CH4, C2H2, C2H4, C2H6) => {\n const pt = _pentagonRatioToDoc(H2, C2H2, C2H4, CH4, C2H6);\n if (!pt) return { code: 'INVALID', label: '无效输入', desc: '', color: '' };\n const { x, y } = pt;\n for (let i = 0; i < PENTAGON_ZONES_1.length - 1; i++) {\n const zone = PENTAGON_ZONES_1[i];\n if (_inPentagonPoly(x, y, zone.poly)) {\n return { code: zone.name, label: zone.title, desc: zone.desc, color: zone.color };\n }\n }\n const last = PENTAGON_ZONES_1[PENTAGON_ZONES_1.length - 1];\n return { code: last.name, label: last.title, desc: last.desc, color: last.color };\n },\n duvalPentagon2: (H2, CH4, C2H2, C2H4, C2H6) => {\n const pt = _pentagonRatioToDoc(H2, C2H2, C2H4, CH4, C2H6);\n if (!pt) return { code: 'INVALID', label: '无效输入', desc: '', color: '' };\n const { x, y } = pt;\n for (let i = 0; i < PENTAGON_ZONES_2.length - 1; i++) {\n const zone = PENTAGON_ZONES_2[i];\n if (_inPentagonPoly(x, y, zone.poly)) {\n return { code: zone.name, label: zone.title, desc: zone.desc, color: zone.color };\n }\n }\n const last = PENTAGON_ZONES_2[PENTAGON_ZONES_2.length - 1];\n return { code: last.name, label: last.title, desc: last.desc, color: last.color };\n },\n};\n","/**\n * DGA Duval 五边形类 (Pentagon Chart)\n * 包含: DuvalPentagon 核心图表组件类、多边形数学映射计算与 Canvas 渲染逻辑\n * 用于变压器溶解气体分析的故障诊断\n */\nimport { inPoly, hexToRgba, deepMerge, EventBus, ZoomController, DOMTooltip, parseGridBox, drawShapePath, DEFAULT_COLORS } from './utils.js';\n\nfunction colorToRgba(color, alpha) {\n if (!color) return `rgba(0,0,0,${alpha})`;\n if (color.startsWith('#')) {\n return hexToRgba(color, alpha);\n }\n if (color.startsWith('rgb')) {\n return color.replace(/rgb(a)?\\(([^)]+)\\)/, (m, a, content) => {\n const parts = content.split(',');\n const r = parts[0].trim();\n const g = parts[1].trim();\n const b = parts[2].trim();\n return `rgba(${r},${g},${b},${alpha})`;\n });\n }\n return color;\n}\n\n/**\n * PentagonCoord — 坐标系核心\n * 提供 doc 坐标(文献原始)、ratio 向量(归一化比例)和 canvas 坐标(渲染内部)之间的转换\n *\n * * 两种坐标系:\n *\n * ① \"doc 坐标\"(文献原始)\n * R = 40,数学坐标(Y 向上),中心 (0, 0)\n * H2 顶点 = (0, 40),C2H2 = (38.04, 12.36) ...\n * 优点:与 Duval 2002 论文完全一致,直接可读\n *\n * ② \"ratio 向量\"(归一化比例)\n * [H2%, C2H2%, C2H4%, CH4%, C2H6%],合计 = 1\n * 优点:坐标系无关,可自定义 gasOrder/R/cx/cy\n *\n * ③ \"canvas 坐标\"(渲染内部,外部不感知)\n * R = S*0.385,canvas 坐标(Y 向下),中心 (cx, cy)\n * 仅在 draw 函数内部使用,外部 API 不暴露\n *\n * 关系:\n * doc → ratio → canvas\n * doc ← ratio ← canvas\n *\n * poly 字段支持两种格式(通过元素长度自动识别):\n * 长度 2 → doc 坐标 [x, y] 例:[24.3, -30]\n * 长度 5 → ratio 向量 [r0,r1,r2,r3,r4] 例:[0,0.05,0.95,0,0]\n *\n * series.data 支持两种格式:\n * 对象格式(气体浓度):{ H2: 120, C2H2: 5, ... }\n * doc 坐标格式: { x: 24.3, y: -30 }\n */\nexport class PentagonCoord {\n // doc 坐标系参数(固定)\n static DOC_R = 40;\n // 顶点角度(数学坐标,顺时针,H2 在顶部=90°)\n static DOC_ANGLES = [90, 18, -54, -126, 162]; // 度\n\n /**\n * 将 doc 坐标(R=40,Y向上)转换为归一化 ratio 向量\n * @param {number} x - doc 坐标系 x\n * @param {number} y - doc 坐标系 y\n * @returns {number[]|null} - 长度为5的 ratio 向量,或 null(如果在五边形外)\n */\n static docToRatio(x, y) {\n const R = PentagonCoord.DOC_R;\n const ang = PentagonCoord.DOC_ANGLES;\n const verts = ang.map((d) => {\n const a = (d * Math.PI) / 180;\n return [R * Math.cos(a), R * Math.sin(a)];\n });\n\n // 顶点精确匹配\n for (let i = 0; i < 5; i++) {\n if (Math.hypot(x - verts[i][0], y - verts[i][1]) < 0.5) {\n const r = [0, 0, 0, 0, 0];\n r[i] = 1;\n return r;\n }\n }\n\n // 边上精确插值\n for (let i = 0; i < 5; i++) {\n const j = (i + 1) % 5;\n const [ax, ay] = verts[i],\n [bx, by] = verts[j];\n const dx = bx - ax,\n dy = by - ay;\n const len2 = dx * dx + dy * dy;\n if (len2 < 1e-10) continue;\n const t = ((x - ax) * dx + (y - ay) * dy) / len2;\n if (t >= -1e-6 && t <= 1 + 1e-6) {\n const dist = Math.abs((y - ay) * dx - (x - ax) * dy) / Math.sqrt(len2);\n if (dist < 0.15) {\n const t2 = Math.max(0, Math.min(1, t));\n const r = [0, 0, 0, 0, 0];\n r[i] = 1 - t2;\n r[j] = t2;\n return r;\n }\n }\n }\n\n // 内部点:三角扇重心坐标(放宽 eps)\n for (let i = 0; i < 5; i++) {\n const v0 = [0, 0],\n v1 = verts[i],\n v2 = verts[(i + 1) % 5];\n const denom = (v1[1] - v2[1]) * (v0[0] - v2[0]) + (v2[0] - v1[0]) * (v0[1] - v2[1]);\n if (Math.abs(denom) < 1e-10) continue;\n const l0 = ((v1[1] - v2[1]) * (x - v2[0]) + (v2[0] - v1[0]) * (y - v2[1])) / denom;\n const l1 = ((v2[1] - v0[1]) * (x - v2[0]) + (v0[0] - v2[0]) * (y - v2[1])) / denom;\n const l2 = 1 - l0 - l1;\n if (l0 >= -0.01 && l1 >= -0.01 && l2 >= -0.01) {\n const r = new Array(5).fill(l0 / 5);\n r[i] += l1;\n r[(i + 1) % 5] += l2;\n const tot = r.reduce((s, v) => s + Math.max(0, v), 0);\n return r.map((v) => Math.max(0, v) / tot);\n }\n }\n return null;\n }\n\n /**\n * 将归一化 ratio 向量转换为 doc 坐标\n * @param {number[]} ratio - 长度为5的 ratio 向量\n * @returns {number[]} - [x, y] doc 坐标\n */\n static ratioToDoc(ratio) {\n const R = PentagonCoord.DOC_R;\n const ang = PentagonCoord.DOC_ANGLES;\n let x = 0,\n y = 0;\n for (let i = 0; i < 5; i++) {\n const a = (ang[i] * Math.PI) / 180;\n x += ratio[i] * R * Math.cos(a);\n y += ratio[i] * R * Math.sin(a);\n }\n return [x, y];\n }\n\n /**\n * 将 canvas 像素坐标转换为归一化 ratio 向量\n * @param {number} px - canvas 像素坐标 x\n * @param {number} py - canvas 像素坐标 y\n * @param {number} cx - 五边形中心 x\n * @param {number} cy - 五边形中心 y\n * @param {number} R - 五边形半径\n * @returns {number[]|null} - ratio 向量或 null\n */\n static canvasToRatio(px, py, cx, cy, R) {\n const verts = Array.from({ length: 5 }, (_, i) => PentagonCoord.canvasVertex(i, cx, cy, R));\n if (!inPoly(px, py, verts)) return null;\n\n for (let i = 0; i < 5; i++) {\n const v0 = [cx, cy],\n v1 = verts[i],\n v2 = verts[(i + 1) % 5];\n const denom = (v1[1] - v2[1]) * (v0[0] - v2[0]) + (v2[0] - v1[0]) * (v0[1] - v2[1]);\n if (Math.abs(denom) < 1e-10) continue;\n const l0 = ((v1[1] - v2[1]) * (px - v2[0]) + (v2[0] - v1[0]) * (py - v2[1])) / denom;\n const l1 = ((v2[1] - v0[1]) * (px - v2[0]) + (v0[0] - v2[0]) * (py - v2[1])) / denom;\n const l2 = 1 - l0 - l1;\n if (l0 >= -1e-9 && l1 >= -1e-9 && l2 >= -1e-9) {\n const r = new Array(5).fill(l0 / 5);\n r[i] += l1;\n r[(i + 1) % 5] += l2;\n const tot = r.reduce((s, v) => s + Math.max(0, v), 0);\n return r.map((v) => Math.max(0, v) / tot);\n }\n }\n return null;\n }\n\n // canvas 顶点坐标(Y 向下,从顶部 12 点顺时针)\n static canvasVertex(i, cx, cy, R) {\n const a = -Math.PI / 2 + (i * 2 * Math.PI) / 5;\n return [cx + R * Math.cos(a), cy + R * Math.sin(a)];\n }\n\n // doc 坐标 → canvas 坐标(直接线性映射)\n static docToCanvas(x, y, cx, cy, R) {\n return [\n cx + (x / PentagonCoord.DOC_R) * R,\n cy - (y / PentagonCoord.DOC_R) * R, // Y 轴反转\n ];\n }\n\n // poly 统一解析 → canvas 点数组\n static polyToCanvas(polyPoint, cx, cy, R) {\n if (polyPoint.length === 2) {\n return PentagonCoord.docToCanvas(polyPoint[0], polyPoint[1], cx, cy, R);\n }\n let x = 0,\n y = 0;\n for (let i = 0; i < 5; i++) {\n const [vx, vy] = PentagonCoord.canvasVertex(i, cx, cy, R);\n x += polyPoint[i] * vx;\n y += polyPoint[i] * vy;\n }\n return [x, y];\n }\n /**\n * 将任意格式的 series.data 解析为归一化 ratio 向量\n * @param {object|number[]} data - 待解析的数据\n * @param {string[]} gasOrder - 气体顺序\n * @returns {number[]|null} - ratio 向量或 null\n */\n static resolveData(data, gasOrder) {\n if (!data) return null;\n\n if (Array.isArray(data)) {\n const isObj = data.length > 0 && data[0] && typeof data[0] === 'object';\n let vals;\n if (isObj && gasOrder) {\n vals = gasOrder.map(k => {\n const item = data.find(d => d.name === k);\n return Math.max(0, (item ? item.value : 0) || 0);\n });\n } else {\n vals = data.map((v) => Math.max(0, v || 0));\n }\n const total = vals.reduce((s, v) => s + v, 0);\n if (total <= 1e-9) return null;\n return vals.map((v) => v / total);\n }\n\n if ('x' in data && 'y' in data) {\n return PentagonCoord.docToRatio(data.x, data.y);\n }\n\n return null;\n }\n\n // ratio → doc 坐标字符串(调试/显示用)\n static ratioToDocStr(ratio, decimals = 1) {\n const [x, y] = PentagonCoord.ratioToDoc(ratio);\n return `(${x.toFixed(decimals)}, ${y.toFixed(decimals)})`;\n }\n}\n\n/**\n * ThemeManager — 主题管理系统\n * 内置 DARK/LIGHT 主题,并支持用户通过 setOption 覆盖任意字段\n */\nexport class ThemeManager {\n static DARK = {\n backgroundColor: 'transparent', // 画布背景色\n pointStyle: {\n itemStyle: {\n shape: 'circle',\n radius: 3,\n color: '#00e5ff',\n borderColor: '#ffffff',\n borderWidth: 0.5,\n },\n textStyle: {\n show: false,\n fontSize: 11,\n color: '#00e5ff',\n position: 'top',\n }\n },\n vertex: {\n show: true,\n labelStyle: {\n color: '#01FFE1',\n fontStyle: 'normal',\n fontWeight: 'bold',\n fontSize: 14,\n }\n },\n grid: {\n show: false,\n lineStyle: {\n lineType: 'solid',\n lineWidth: 1.0,\n lineColor: 'rgba(0, 229, 255, 0.15)',\n }\n },\n zone: {\n alpha: 0.75,\n labelStyle: {\n show: true,\n color: '#ffffff',\n fontStyle: 'bold',\n fontSize: 12,\n letterSpacing: 0,\n textShadow: 'rgba(0,0,0,0.85)',\n padding: [4, 8],\n borderRadius: 4,\n backgroundColor: 'transparent'\n },\n borderStyle: {\n show: true,\n width: 1.0,\n type: 'solid',\n color: 'rgba(255, 255, 255, 0.25)'\n }\n },\n tooltip: {\n show: true,\n backgroundColor: 'rgba(6, 13, 31, 0.93)',\n textStyle: {\n color: '#c8ddf0',\n fontStyle: '',\n fontWeight: '',\n fontSize: 12,\n },\n padding: 10\n },\n fontFamily: 'Rajdhani, sans-serif', // 全局字体\n };\n\n static LIGHT = {\n backgroundColor: 'transparent', // 画布背景色\n pointStyle: {\n itemStyle: {\n shape: 'circle',\n radius: 3,\n color: '#1d4ed8',\n borderColor: '#ffffff',\n borderWidth: 0.5,\n },\n textStyle: {\n show: false,\n fontSize: 11,\n color: '#1d4ed8',\n position: 'top',\n }\n },\n vertex: {\n show: true,\n labelStyle: {\n color: '#1d4ed8',\n fontStyle: 'normal',\n fontWeight: 'bold',\n fontSize: 14,\n }\n },\n grid: {\n show: false,\n lineStyle: {\n lineType: 'solid',\n lineWidth: 1.0,\n lineColor: 'rgba(29, 78, 216, 0.15)',\n }\n },\n zone: {\n labelStyle: {\n show: true,\n color: '#1e293b',\n fontStyle: 'bold',\n fontSize: 11,\n letterSpacing: 0,\n textShadow: 'rgba(255,255,255,0.8)',\n padding: [4, 8],\n borderRadius: 4,\n backgroundColor: 'transparent'\n },\n borderStyle: {\n show: true,\n width: 1.0,\n type: 'solid',\n color: 'rgba(0, 0, 0, 0.25)'\n }\n },\n tooltip: {\n show: true,\n backgroundColor: 'rgba(240, 244, 248, 0.96)',\n textStyle: {\n color: '#334155',\n fontStyle: '',\n fontWeight: '',\n fontSize: 12,\n },\n padding: 10\n },\n fontFamily: 'Rajdhani, sans-serif', // 全局字体\n };\n\n static resolve(theme) {\n if (!theme || theme === 'dark') return { ...ThemeManager.DARK };\n if (theme === 'light') return { ...ThemeManager.LIGHT };\n return deepMerge({ ...ThemeManager.DARK }, theme);\n }\n}\n\n/**\n * ZoneRenderer — 故障区域渲染器\n * 绘制五边形背景区域和标识文字,并根据坐标判定当前所在的诊断区域\n */\nexport class ZoneRenderer {\n /**\n * 根据 ratio 向量诊断所在故障区域\n * @param {number[]} ratio - 待诊断的 ratio 向量\n * @param {object} zoneOpt - 区域配置对象\n * @param {number} cx - 中心点 x\n * @param {number} cy - 中心点 y\n * @param {number} R - 半径\n * @returns {object} - 匹配的区域对象\n */\n static diagnose(ratio, zoneOpt, cx, cy, R) {\n const data = (zoneOpt && Array.isArray(zoneOpt.data)) ? zoneOpt.data : [];\n if (!data.length) return null;\n const [px, py] = PentagonCoord.polyToCanvas(ratio, cx, cy, R);\n for (let i = 0; i < data.length - 1; i++) {\n if (!data[i].coordinates || !data[i].coordinates.length) continue;\n const poly = data[i].coordinates.map((p) => PentagonCoord.polyToCanvas(p, cx, cy, R));\n if (inPoly(px, py, poly)) return data[i];\n }\n return data[data.length - 1];\n }\n\n /**\n * 绘制所有故障区域\n * @param {CanvasRenderingContext2D} ctx - Canvas 2D 上下文\n * @param {object} zoneOpt - 区域配置对象\n * @param {object} theme - 主题配置\n * @param {number} cx - 中心点 x\n * @param {number} cy - 中心点 y\n * @param {number} R - 半径\n * @param {number} S - 容器尺寸\n */\n static draw(ctx, zoneOpt, theme, cx, cy, R, S) {\n const data = (zoneOpt && Array.isArray(zoneOpt.data)) ? zoneOpt.data : [];\n const gLabel = zoneOpt.labelStyle || {};\n const gBorder = zoneOpt.borderStyle || {};\n const gAlpha = zoneOpt.alpha;\n const colors = zoneOpt.colors || theme.colors || DEFAULT_COLORS;\n\n // 1. 绘制背景区域\n data.forEach((z, i) => {\n if (!z.coordinates || !z.coordinates.length) return;\n const pts = z.coordinates.map((p) => PentagonCoord.polyToCanvas(p, cx, cy, R));\n ctx.beginPath();\n pts.forEach(([x, y], j) => (j === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\n ctx.closePath();\n\n let baseColor = z.color || colors[i % colors.length];\n if (gAlpha !== undefined && baseColor !== 'transparent') {\n baseColor = colorToRgba(baseColor, gAlpha);\n }\n ctx.fillStyle = baseColor;\n ctx.fill();\n });\n\n // 2. 绘制边框\n data.forEach((z, i) => {\n const bStyle = gBorder;\n if (bStyle.show === false || !z.coordinates || !z.coordinates.length) return;\n\n const pts = z.coordinates.map((p) => PentagonCoord.polyToCanvas(p, cx, cy, R));\n ctx.beginPath();\n pts.forEach(([x, y], j) => (j === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\n ctx.closePath();\n\n let borderColor = bStyle.color || z.color || colors[i % colors.length];\n if (bStyle.alpha !== undefined && borderColor !== 'transparent') {\n borderColor = colorToRgba(borderColor, bStyle.alpha);\n }\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = bStyle.width ?? 1.0;\n\n if (bStyle.type === 'dashed') {\n ctx.setLineDash([4, 4]);\n } else if (bStyle.type === 'dotted') {\n ctx.setLineDash([2, 4]);\n } else {\n ctx.setLineDash([]);\n }\n ctx.stroke();\n });\n ctx.setLineDash([]); // 重置虚线\n\n // 3. 绘制文字标签\n const ff = theme.fontFamily || 'Rajdhani, sans-serif';\n\n for (const z of data) {\n const lStyle = gLabel;\n if (lStyle.show === false || !z.name) continue;\n\n const pts = z.coordinates ? z.coordinates.map((p) => PentagonCoord.polyToCanvas(p, cx, cy, R)) : [];\n let lx, ly;\n if (z.labelAt && Array.isArray(z.labelAt)) {\n [lx, ly] = PentagonCoord.polyToCanvas(z.labelAt, cx, cy, R);\n } else if (pts.length > 0) {\n lx = pts.reduce((s, p) => s + p[0], 0) / pts.length;\n ly = pts.reduce((s, p) => s + p[1], 0) / pts.length;\n } else {\n continue;\n }\n\n const fs = Math.round((lStyle.fontSize || theme.zoneLabelSize || 12) * (1));\n const fontStyle = lStyle.fontStyle || 'bold';\n ctx.font = `${fontStyle} ${fs}px ${ff}`;\n\n if (lStyle.letterSpacing !== undefined && 'letterSpacing' in ctx) {\n ctx.letterSpacing = `${lStyle.letterSpacing}px`;\n }\n\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n const text = typeof lStyle.formatter === 'function' ? lStyle.formatter(z) : z.name;\n const tw = ctx.measureText(text).width;\n const th = fs;\n\n // 绘制带圆角、内边距的背景\n if (lStyle.backgroundColor && lStyle.backgroundColor !== 'transparent') {\n let padX = 4, padY = 4;\n if (Array.isArray(lStyle.padding)) {\n padY = lStyle.padding[0];\n padX = lStyle.padding[1] !== undefined ? lStyle.padding[1] : padY;\n } else if (typeof lstyle.padding === 'number') {\n padX = padY = lstyle.padding;\n }\n padX *= (1);\n padY *= (1);\n\n const radius = (lStyle.borderRadius || 0) * (1);\n const bw = tw + padX * 2;\n const bh = th + padY * 2;\n const bx = lx - bw / 2;\n const by = ly - bh / 2;\n\n ctx.fillStyle = lStyle.backgroundColor;\n ctx.beginPath();\n if (ctx.roundRect) {\n ctx.roundRect(bx, by, bw, bh, radius);\n } else {\n ctx.rect(bx, by, bw, bh);\n }\n ctx.fill();\n }\n\n // 文本阴影\n if (lStyle.textShadow && lStyle.textShadow !== 'none') {\n ctx.shadowColor = lStyle.textShadow;\n ctx.shadowBlur = 4;\n } else {\n ctx.shadowColor = 'transparent';\n ctx.shadowBlur = 0;\n }\n\n ctx.fillStyle = lStyle.color || theme.zoneLabelColor || '#fff';\n ctx.fillText(text, lx, ly);\n\n // 恢复默认状态\n ctx.shadowBlur = 0;\n ctx.shadowColor = 'transparent';\n if ('letterSpacing' in ctx) ctx.letterSpacing = '0px';\n }\n }\n}\n\n/**\n * GridRenderer — 网格渲染器\n * 绘制五边形背景网格、五个顶点的气体标签、刻度线以及放射状轴线\n */\nexport class GridRenderer {\n static draw(ctx, vertexOpt, theme, cx, cy, R, S, gridOpt) {\n const scale = 1;\n const ff = theme.fontFamily || 'Rajdhani, sans-serif';\n\n if (gridOpt && gridOpt.show !== false) {\n const lineStyle = gridOpt.lineStyle || {};\n const lw = (lineStyle.lineWidth ?? 1) * scale;\n const lc = lineStyle.lineColor || '#e5e7eb';\n const lt = lineStyle.lineType || 'solid';\n\n ctx.strokeStyle = lc;\n ctx.lineWidth = lw;\n\n if (lt === 'dashed') {\n ctx.setLineDash([4, 4]);\n } else if (lt === 'dotted') {\n ctx.setLineDash([2, 4]);\n } else {\n ctx.setLineDash([]);\n }\n\n for (const f of [0.2, 0.4, 0.6, 0.8, 1.0]) {\n ctx.beginPath();\n for (let i = 0; i < 5; i++) {\n const [x, y] = PentagonCoord.canvasVertex(i, cx, cy, R * f);\n i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n }\n ctx.closePath();\n ctx.stroke();\n }\n for (let i = 0; i < 5; i++) {\n const [x, y] = PentagonCoord.canvasVertex(i, cx, cy, R);\n ctx.beginPath();\n ctx.moveTo(cx, cy);\n ctx.lineTo(x, y);\n ctx.stroke();\n }\n ctx.setLineDash([]); // 重置虚线\n }\n if (!vertexOpt || vertexOpt.show === false) return;\n const globalDist = vertexOpt.labelStyle?.distance !== undefined ? vertexOpt.labelStyle.distance : 27.2;\n\n vertexOpt.data.forEach((item, i) => {\n const style = item.labelStyle || {};\n const dist = style.distance !== undefined ? style.distance : globalDist;\n const distOffset = (typeof dist === 'string' && dist.endsWith('%'))\n ? (parseFloat(dist) / 100) * R\n : (parseFloat(dist) * scale);\n\n const [x, y] = PentagonCoord.canvasVertex(i, cx, cy, R + distOffset);\n const fontStyle = style.fontStyle || 'normal';\n const fontWeight = style.fontWeight || 'bold';\n const fontSize = Math.round((style.fontSize || theme.gasLabelSize || 14) * scale);\n ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${ff}`;\n ctx.fillStyle = style.color || theme.gasLabelColor || '#fff';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.shadowColor = theme.gasLabelShadow;\n ctx.shadowBlur = 7;\n ctx.fillText(item.name, x, y);\n ctx.shadowBlur = 0;\n });\n }\n}\n\nfunction parseRgba(color) {\n const cleaned = color.trim().toLowerCase();\n if (cleaned.startsWith('#')) {\n let hex = cleaned.slice(1);\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n const a = hex.length === 8 ? parseInt(hex.substring(6, 8), 16) / 255 : 1;\n return [r, g, b, a];\n }\n const m = cleaned.match(/rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\)/);\n if (m) {\n return [\n parseInt(m[1], 10),\n parseInt(m[2], 10),\n parseInt(m[3], 10),\n m[4] !== undefined ? parseFloat(m[4]) : 1\n ];\n }\n if (cleaned === 'transparent') return [0, 0, 0, 0];\n return [255, 255, 255, 1];\n}\n\nfunction interpolateColor(c1, c2, factor) {\n const [r1, g1, b1, a1] = parseRgba(c1);\n const [r2, g2, b2, a2] = parseRgba(c2);\n const r = Math.round(r1 + (r2 - r1) * factor);\n const g = Math.round(g1 + (g2 - g1) * factor);\n const b = Math.round(b1 + (b2 - b1) * factor);\n const a = a1 + (a2 - a1) * factor;\n return `rgba(${r},${g},${b},${a})`;\n}\n\n\n\n/**\n * PointRenderer — 数据点渲染器\n * 绘制圆、圆环、星形、三角形、正方形等形状的数据点,并支持辉光效果和名称标签\n */\nexport class PointRenderer {\n /**\n * 绘制数据点及其辉光、标签\n */\n static draw(ctx, series, theme, cx, cy, R, S, gasOrder, zoneOpt, hoverPoint) {\n if (!series || !series.data || !Array.isArray(series.data)) return [];\n\n const scale = 1;\n const ff = theme.fontFamily || 'Rajdhani, sans-serif';\n const results = [];\n\n const pt = series.data;\n if (!pt || pt.length === 0) return [];\n\n const ratio = PentagonCoord.resolveData(pt, gasOrder);\n if (!ratio) return [];\n\n const ptName = series.name;\n const shape = series.shape || 'circle';\n const color = series.color || '#409eff';\n let size = series.size !== undefined ? series.size : 5;\n\n const [px, py] = PentagonCoord.polyToCanvas(ratio, cx, cy, R);\n const zone = ZoneRenderer.diagnose(ratio, zoneOpt, cx, cy, R);\n const [docX, docY] = PentagonCoord.ratioToDoc(ratio);\n\n const isHov = hoverPoint && hoverPoint.series === series;\n if (isHov) size *= 1.5;\n\n const globalItemStyle = series.itemStyle || {};\n const borderColor = globalItemStyle.borderColor || '#fff';\n const borderWidth = globalItemStyle.borderWidth !== undefined ? globalItemStyle.borderWidth : 1;\n const opacity = globalItemStyle.opacity !== undefined ? globalItemStyle.opacity : 1;\n\n const globalTextStyle = series.textStyle || {};\n const textShow = globalTextStyle.show !== undefined ? globalTextStyle.show : true;\n const textColor = globalTextStyle.color || color;\n const textFontSize = globalTextStyle.fontSize !== undefined ? globalTextStyle.fontSize : 12;\n const textFontWeight = globalTextStyle.fontWeight || 'normal';\n const textPosition = globalTextStyle.position || 'top';\n const textOffset = globalTextStyle.offset || [0, 0];\n\n const globalGlowStyle = series.glowStyle || {};\n const glowShow = globalGlowStyle.show !== undefined ? globalGlowStyle.show : false;\n const glowColorsOpt = globalGlowStyle.colors;\n const glowBlur = globalGlowStyle.blur !== undefined ? globalGlowStyle.blur : 15;\n const glowStartColor = globalGlowStyle.startColor || color;\n const glowEndColor = globalGlowStyle.endColor || 'transparent';\n const glowCount = globalGlowStyle.count !== undefined ? globalGlowStyle.count : 3;\n const glowDistance = globalGlowStyle.glowDistance !== undefined ? globalGlowStyle.glowDistance : 2;\n\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Glow Style Rendering\n if (glowShow) {\n ctx.shadowColor = glowColorsOpt ? glowColorsOpt[0] : glowStartColor;\n ctx.shadowBlur = glowBlur;\n\n let glowColors = [];\n let layers = glowCount;\n\n if (Array.isArray(glowColorsOpt) && glowColorsOpt.length > 0) {\n glowColors = glowColorsOpt;\n layers = glowColors.length;\n } else {\n for (let i = 0; i < layers; i++) {\n const factor = layers > 1 ? i / (layers - 1) : 0;\n glowColors.push(interpolateColor(glowStartColor, glowEndColor, factor));\n }\n }\n\n for (let i = layers - 1; i >= 0; i--) {\n const glowColor = glowColors[i];\n ctx.save();\n ctx.fillStyle = glowColor;\n ctx.beginPath();\n drawShapePath(ctx, px, py, shape, size, scale, (i + 1) * glowDistance);\n ctx.fill();\n ctx.restore();\n }\n }\n\n // Point Shape Rendering\n ctx.beginPath();\n drawShapePath(ctx, px, py, shape, size, scale, 0);\n\n if (shape === 'ring') {\n ctx.strokeStyle = color;\n ctx.lineWidth = borderWidth * scale;\n ctx.stroke();\n } else {\n ctx.fillStyle = color;\n ctx.fill();\n if (borderWidth > 0) {\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = borderWidth * scale;\n ctx.stroke();\n }\n }\n ctx.restore();\n\n // Text/Label Rendering\n if (textShow && ptName) {\n ctx.save();\n ctx.globalAlpha = opacity;\n ctx.font = `${textFontWeight} ${Math.round(textFontSize * scale)}px ${ff}`;\n ctx.fillStyle = textColor;\n\n let textAlign = 'center';\n let textBaseline = 'middle';\n let tx = px + textOffset[0] * scale;\n let ty = py + textOffset[1] * scale;\n\n let offsetVal = 6 * scale;\n if (shape === 'circle' || shape === 'ring' || shape === 'star' || shape === 'triangle') {\n offsetVal += size * scale;\n } else if (shape === 'square') {\n offsetVal += size * scale / 2;\n }\n\n if (textPosition === 'top') {\n textAlign = 'center';\n textBaseline = 'bottom';\n ty -= offsetVal;\n } else if (textPosition === 'bottom') {\n textAlign = 'center';\n textBaseline = 'top';\n ty += offsetVal;\n } else if (textPosition === 'left') {\n textAlign = 'right';\n textBaseline = 'middle';\n tx -= offsetVal;\n } else if (textPosition === 'right') {\n textAlign = 'left';\n textBaseline = 'middle';\n tx += offsetVal;\n } else if (textPosition === 'center') {\n textAlign = 'center';\n textBaseline = 'middle';\n }\n\n ctx.textAlign = textAlign;\n ctx.textBaseline = textBaseline;\n\n ctx.fillText(ptName, tx, ty);\n ctx.restore();\n }\n\n results.push({\n ratio,\n zone,\n docX,\n docY,\n rawData: pt,\n name: ptName,\n series: series\n });\n\n\n return results;\n }\n}\n\n/**\n * HoverLayer — 悬浮交互层\n * 负责渲染悬浮交互相关的辅助 UI 元素(目前主要包含图表缩放状态徽章)。\n */\nexport class HoverLayer {\n\n /**\n * 绘制缩放状态徽章 (Zoom Badge)\n * 当图表处于放大状态时,在右下角显示当前的缩放比例及“双击重置”的提示\n * @param {CanvasRenderingContext2D} ctx - Canvas 2D 上下文\n * @param {number} zoom - 当前的缩放倍数\n * @param {number} S - 容器尺寸 (宽和高中的较小值),用于做自适应缩放计算\n * @param {object} theme - 主题配置对象,包含徽章背景、字体颜色等信息\n */\n static drawZoomBadge(ctx, zoom, S, theme) {\n if (zoom === 1) return;\n const scale = 1;\n const text = `${zoom.toFixed(2)}×`;\n const hint = ' 双击重置';\n const fs = Math.round(11 * scale);\n const pad = 6 * scale;\n const ff = theme.fontFamily || 'Rajdhani, sans-serif';\n ctx.font = `600 ${fs}px ${ff}`;\n const tw = ctx.measureText(text + hint).width;\n const bw = tw + pad * 2,\n bh = fs + pad * 1.8;\n const bx = S - bw - 8,\n by = S - bh - 8;\n ctx.fillStyle = theme.badgeBg;\n ctx.strokeStyle = theme.badgeBorderColor;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.roundRect(bx, by, bw, bh, 4);\n ctx.fill();\n ctx.stroke();\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillStyle = theme.badgeTextColor;\n ctx.fillText(text, bx + pad, by + bh / 2);\n ctx.fillStyle = theme.badgeHintColor || 'rgba(200,221,240,0.4)';\n ctx.fillText(hint, bx + pad + ctx.measureText(text).width, by + bh / 2);\n }\n}\n\nimport { PENTAGON_ZONES_1 } from './zones.js';\n\n/**\n * DuvalPentagon — 杜瓦五边形图表主类\n * 组合数学计算、渲染器和交互控制,对外提供 setOption、setSeries 等 API\n */\nexport class DuvalPentagon {\n static DEFAULT_ZONES = PENTAGON_ZONES_1;\n\n static DEFAULTS = {\n theme: 'dark',\n colors: DEFAULT_COLORS,\n vertex: {\n show: true,\n data: ['H2', 'C2H2', 'C2H4', 'CH4', 'C2H6']\n },\n zone: null,\n series: [],\n grid: {\n show: false\n },\n zoom: { min: 0.3, max: 6, step: 0.12 },\n tooltip: {\n show: true\n }\n };\n\n constructor(container, option = {}) {\n this._el = typeof container === 'string' ? document.getElementById(container) : container;\n if (!this._el) throw new Error(`DuvalPentagon: container not found — \"${container}\"`);\n\n this._theme = ThemeManager.resolve(option.theme || DuvalPentagon.DEFAULTS.theme);\n this._opt = deepMerge(deepMerge(deepMerge({}, DuvalPentagon.DEFAULTS), this._theme), option);\n this._normalizeOptions();\n\n this._bus = new EventBus();\n this._zoom = new ZoomController(this._opt.zoom);\n\n this._canvas = document.createElement('canvas');\n this._ctx = this._canvas.getContext('2d');\n Object.assign(this._canvas.style, { display: 'block', width: '100%', height: '100%' });\n this._el.appendChild(this._canvas);\n\n this._tooltipRenderer = new DOMTooltip(this._el, this._theme);\n\n this._hoverRatio = null;\n this._hoverZone = null;\n this._hoverPoint = null;\n\n this._bindEvents();\n this._observeResize();\n this._syncCanvas();\n this._renderFull();\n }\n\n _normalizeOptions() {\n\n // 标准化 vertex.data 并进行校验\n if (!this._opt.vertex.data) {\n this._opt.vertex.data = ['H2', 'C2H2', 'C2H4', 'CH4', 'C2H6'];\n }\n if (!Array.isArray(this._opt.vertex.data) || this._opt.vertex.data.length !== 5) {\n throw new Error(\"DuvalPentagon: vertex.data must be an array of exactly 5 elements.\");\n }\n const defaultLabelStyle = this._opt.vertex.labelStyle || {};\n this._opt.vertex.data = this._opt.vertex.data.map(item => {\n if (typeof item === 'string') {\n return {\n name: item,\n labelStyle: { ...defaultLabelStyle }\n };\n } else if (item && typeof item === 'object') {\n if (!item.name) {\n throw new Error(\"DuvalPentagon: each vertex object in vertex.data must have a 'name' property.\");\n }\n return {\n name: item.name,\n labelStyle: deepMerge({ ...defaultLabelStyle }, item.labelStyle || {})\n };\n } else {\n throw new Error(\"DuvalPentagon: vertex.data elements must be either strings or objects with a 'name' property.\");\n }\n });\n\n // 衍生出内部的 gasOrder 数组\n this._opt.gasOrder = this._opt.vertex.data.map(v => v.name);\n\n // 处理 zone 默认数据和数组/对象格式\n if (!this._opt.zone) {\n this._opt.zone = { data: DuvalPentagon.DEFAULT_ZONES };\n } else if (typeof this._opt.zone === 'object' && !this._opt.zone.data) {\n this._opt.zone.data = DuvalPentagon.DEFAULT_ZONES;\n }\n\n\n }\n\n /* 公开 API ─ */\n\n /**\n * 深度合并配置并重绘图表\n * @param {object} opt - 需要合并的配置项\n * @returns {DuvalPentagon} - 当前实例,支持链式调用\n */\n setOption(opt) {\n if (opt.theme !== undefined) {\n this._theme = ThemeManager.resolve(opt.theme);\n this._tooltipRenderer.updateTheme(this._theme);\n // 将新主题默认值与已有的完整配置进行深度合并,防止自定义配置丢失\n this._opt = deepMerge(deepMerge(deepMerge({}, DuvalPentagon.DEFAULTS), this._theme), this._opt);\n }\n deepMerge(this._opt, opt);\n this._normalizeOptions();\n this._syncCanvas();\n this._render();\n return this;\n }\n\n /**\n * 替换全部数据点并重绘\n * @param {object|object[]} series - 单个或多个数据点系列\n * @returns {DuvalPentagon} - 当前实例,支持链式调用\n */\n setSeries(series) {\n this._opt.series = Array.isArray(series) ? series : [series];\n this._renderFull();\n return this;\n }\n\n /**\n * 诊断指定的比值数据,返回命中的区域\n * @param {number[]} ratio - 五个比值数据数组\n * @returns {object|null} - 命中的故障区域对象\n */\n diagnose(ratio) {\n const { cx, cy, R } = this._dims();\n return ZoneRenderer.diagnose(ratio, this._opt.zone, cx, cy, R);\n }\n\n zoomReset() {\n this._zoom.reset();\n this._renderFull();\n return this;\n }\n\n on(ev, fn) {\n this._bus.on(ev, fn);\n return this;\n }\n off(ev, fn) {\n this._bus.off(ev, fn);\n return this;\n }\n\n dispose() {\n this._ro?.disconnect();\n this._tooltipRenderer.dispose();\n const c = this._canvas;\n if (c) {\n c.removeEventListener('wheel', this._onWheel);\n c.removeEventListener('mousedown', this._onDown);\n c.removeEventListener('mousemove', this._onMove);\n c.removeEventListener('mouseleave', this._onLeave);\n c.removeEventListener('dblclick', this._onDbl);\n c.parentNode?.removeChild(c);\n }\n window.removeEventListener('mouseup', this._onUp);\n this._bus.dispose();\n }\n\n /* 内部:事件绑定 */\n\n _bindEvents() {\n const c = this._canvas;\n\n this._onWheel = (e) => {\n e.preventDefault();\n const rect = c.getBoundingClientRect();\n const ax = (e.clientX - rect.left) * (this._cssW / rect.width);\n const ay = (e.clientY - rect.top) * (this._cssH / rect.height);\n this._zoom.onWheel(e.deltaY, ax, ay);\n this._bus.emit('zoom', this._zoom.state);\n this._renderFull();\n };\n\n this._onDown = (e) => {\n if (e.button !== 0) return;\n this._zoom.startDrag(e.clientX, e.clientY);\n c.style.cursor = 'grabbing';\n };\n\n this._onMove = (e) => {\n const rect = c.getBoundingClientRect();\n const scale = this._cssW / rect.width;\n if (this._zoom.moveDrag(e.clientX, e.clientY, scale)) {\n this._renderFull();\n return;\n }\n const lx = ((e.clientX - rect.left) * scale - this._zoom.panX) / this._zoom.zoom;\n const ly = ((e.clientY - rect.top) * scale - this._zoom.panY) / this._zoom.zoom;\n const { cx, cy, R, S } = this._dims();\n\n let hoveredPoint = null;\n let minDistance = Infinity;\n\n if (this._drawnResults) {\n for (const r of this._drawnResults) {\n const [px, py] = PentagonCoord.polyToCanvas(r.ratio, cx, cy, R);\n const pr = r.series.size || Math.max(5, S * 0.013);\n const dist = Math.hypot(px - lx, py - ly);\n if (dist < Math.max(pr * 1.5, 12) && dist < minDistance) {\n minDistance = dist;\n hoveredPoint = r;\n }\n }\n }\n\n const tooltipOpt = this._opt.tooltip || {};\n const showTooltip = tooltipOpt.show !== false;\n\n if (hoveredPoint && showTooltip) {\n c.style.cursor = 'pointer';\n this._hoverPoint = hoveredPoint;\n this._hoverRatio = hoveredPoint.ratio;\n this._hoverZone = hoveredPoint.zone;\n this._bus.emit('hover', {\n ratio: hoveredPoint.ratio,\n zone: hoveredPoint.zone,\n docX: hoveredPoint.docX,\n docY: hoveredPoint.docY,\n point: hoveredPoint.series,\n });\n } else {\n c.style.cursor = 'default';\n this._hoverPoint = null;\n const hr = PentagonCoord.canvasToRatio(lx, ly, cx, cy, R);\n if (hr && showTooltip) {\n this._hoverRatio = hr;\n this._hoverZone = ZoneRenderer.diagnose(hr, this._opt.zone, cx, cy, R);\n const [dx, dy] = PentagonCoord.ratioToDoc(hr);\n this._bus.emit('hover', { ratio: hr, zone: this._hoverZone, docX: dx, docY: dy });\n } else {\n this._hoverRatio = null;\n this._hoverZone = null;\n this._bus.emit('hover', null);\n }\n }\n this._renderFull();\n };\n\n this._onUp = () => {\n if (!this._zoom.endDrag()) return;\n c.style.cursor = this._hoverPoint ? 'pointer' : 'default';\n this._bus.emit('zoom', this._zoom.state);\n };\n\n this._onLeave = () => {\n this._hoverRatio = null;\n this._hoverZone = null;\n this._hoverPoint = null;\n this._bus.emit('hover', null);\n this._renderFull();\n };\n\n this._onDbl = () => {\n this.zoomReset();\n this._bus.emit('zoom', this._zoom.state);\n };\n\n c.addEventListener('wheel', this._onWheel, { passive: false });\n c.addEventListener('mousedown', this._onDown);\n c.addEventListener('mousemove', this._onMove);\n c.addEventListener('mouseleave', this._onLeave);\n c.addEventListener('dblclick', this._onDbl);\n window.addEventListener('mouseup', this._onUp);\n c.style.cursor = 'default';\n }\n\n _observeResize() {\n if (typeof ResizeObserver === 'undefined') return;\n this._ro = new ResizeObserver(() => {\n this._syncCanvas();\n this._renderFull();\n });\n this._ro.observe(this._el);\n }\n\n _syncCanvas() {\n const dpr = window.devicePixelRatio || 1;\n const w = this._el.clientWidth || 300;\n const h = this._el.clientHeight || 300;\n this._cssW = w;\n this._cssH = h;\n this._canvas.width = Math.round(w * dpr);\n this._canvas.height = Math.round(h * dpr);\n }\n\n _dims() {\n const W = this._cssW,\n H = this._cssH;\n const grid = this._opt?.grid || {};\n // If no grid left/top/right/bottom is set, fallback to original 0.385 * min(W,H)\n const hasGridMargin = grid.left !== undefined || grid.right !== undefined || grid.top !== undefined || grid.bottom !== undefined;\n\n if (!hasGridMargin) {\n const S = Math.min(W, H);\n return { W, H, S, cx: W / 2, cy: H / 2, R: S * 0.385 };\n }\n\n const box = parseGridBox(W, H, grid, 0); // Default to 0 padding if not specified but margins are used\n const availS = Math.min(box.availW, box.availH);\n const R = availS / 2;\n // Set S backward compatibly (R = S * 0.385 => S = R / 0.385)\n const S = R / 0.385;\n\n return { W, H, S, cx: box.cx, cy: box.cy, R };\n }\n\n _render() {\n this._hoverRatio = null;\n this._hoverZone = null;\n this._hoverPoint = null;\n this._renderFull();\n }\n\n /**\n * 核心渲染方法,绘制所有可见元素\n * @private\n */\n _renderFull() {\n const ctx = this._ctx;\n if (!ctx) return;\n const dpr = window.devicePixelRatio || 1;\n const { W, H, S, cx, cy, R } = this._dims();\n const th = this._theme;\n const gas = this._opt.gasOrder;\n const zoneOpt = this._opt.zone;\n const vertexOpt = this._opt.vertex;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, W, H);\n\n const bgColor = this._opt.backgroundColor || th.backgroundColor || 'transparent';\n if (bgColor && bgColor !== 'transparent') {\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, W, H);\n }\n\n ctx.save();\n this._zoom.applyTransform(ctx);\n\n ZoneRenderer.draw(ctx, zoneOpt, th, cx, cy, R, S);\n GridRenderer.draw(ctx, vertexOpt, th, cx, cy, R, S, this._opt.grid);\n\n const results = [];\n for (const s of this._opt.series || []) {\n const resList = PointRenderer.draw(ctx, s, th, cx, cy, R, S, gas, zoneOpt, this._hoverPoint);\n if (Array.isArray(resList)) {\n resList.forEach(res => {\n results.push({ series: s, ...res });\n });\n }\n }\n this._drawnResults = results;\n\n const tooltipOpt = this._opt.tooltip || {};\n const showTooltip = tooltipOpt.show !== false;\n\n if (showTooltip && this._hoverPoint) {\n let hx = 0, hy = 0;\n [hx, hy] = PentagonCoord.polyToCanvas(this._hoverRatio, cx, cy, R);\n\n const px = hx * this._zoom.zoom + this._zoom.panX;\n const py = hy * this._zoom.zoom + this._zoom.panY;\n\n let html = '';\n if (typeof tooltipOpt.formatter === 'function') {\n html = tooltipOpt.formatter({\n ratio: this._hoverRatio,\n zone: this._hoverZone,\n point: this._hoverPoint?.series,\n gasOrder: gas\n });\n } else {\n html = this._defaultTooltipHTML(this._hoverRatio, this._hoverZone, th, gas, this._hoverPoint);\n }\n this._tooltipRenderer.show(html, px, py, tooltipOpt, th, this._hoverZone);\n } else {\n this._tooltipRenderer.hide();\n }\n\n ctx.restore();\n // HoverLayer.drawZoomBadge(ctx, this._zoom.zoom, S, th);\n\n if (results.length > 0) this._bus.emit('diagnose', results);\n }\n\n _defaultTooltipHTML(ratio, zone, theme, gasOrder, hoverPoint) {\n const vertexData = this._opt.vertex?.data || [];\n const rawData = hoverPoint?.rawData;\n\n const ptName = hoverPoint?.name || 'Data Point';\n const pointNameStr = `<div style=\"font-size:14px; font-weight:bold; margin-bottom:4px; color:#fff;\">${ptName}</div>`;\n\n const zoneStr = zone ? `${zone.name || ''} ${zone.title || ''}`.trim() : 'Outside';\n const zoneColor = zone ? zone.color : '#fff';\n\n let html = `\n ${pointNameStr}\n <div style=\"color:${zoneColor}; font-size:13px; font-weight:bold; padding-bottom:8px; margin-bottom:8px; border-bottom:1px solid rgba(255,255,255,0.07);\">\n ${zoneStr}\n </div>\n `;\n\n gasOrder.forEach((key, i) => {\n const col = vertexData[i]?.labelStyle?.color || theme.vertex?.labelStyle?.color || '#fff';\n\n let rawValStr = '-';\n if (rawData) {\n if (Array.isArray(rawData)) {\n const item = rawData[i];\n if (item && typeof item === 'object') {\n const found = rawData.find(d => d.name === key);\n rawValStr = found && found.value !== undefined ? found.value : '-';\n } else {\n rawValStr = rawData[i] !== undefined ? rawData[i] : '-';\n }\n } else if (typeof rawData === 'object') {\n rawValStr = rawData[key] !== undefined ? rawData[key] : '-';\n }\n }\n\n html += `\n <div style=\"display:flex; align-items:center; margin-bottom:6px; font-size:13px;\">\n <span style=\"display:inline-block; width:8px; height:8px; border-radius:50%; background-color:${col}; margin-right:8px;\"></span>\n <span style=\"color:#cbd5e1; flex-grow:1;\">${key}</span>\n <span style=\"color:#fff; font-weight:bold; margin-left:20px;\">${rawValStr}</span>\n </div>\n `;\n });\n\n return html;\n }\n}\n","/**\n * DGA Duval 三角形类 (Triangle Chart)\n * 包含: TriangleConfig 配置, TriangleMath 数学逻辑, TriangleRenderer 渲染器, DuvalTriangle 组件类\n */\nimport { DOMTooltip, deepMerge, ZoomController, EventBus, parseGridBox, drawShapePath, DEFAULT_COLORS } from './utils.js';\n\n/**\n * TriangleConfig: 核心配置中心\n * 包含默认样式、网格、坐标轴及交互参数\n */\n\nimport { TRIANGLE_ZONES_1 } from './zones.js';\n\n/**\n * TriangleConfig: 图表的全局默认配置选项\n * 所有未传入的属性将自动回退到这里的定义\n */\nexport const TriangleConfig = Object.freeze({\n colors: DEFAULT_COLORS,\n zone: { data: TRIANGLE_ZONES_1, alpha: 0.75 },\n backgroundColor: '#050d1a',\n triFill: 'rgba(8,20,50,0)',\n grid: {\n show: true,\n steps: 10,\n majorEvery: 2,\n lineStyle: {\n color: 'rgba(255,255,255,0)',\n width: 1,\n type: 'solid'\n },\n majorLineStyle: {\n color: 'rgba(255,255,255,0)',\n width: 1,\n type: 'solid'\n },\n labelStyle: {\n color: 'rgba(200,220,255,0.8)',\n fontSize: 12,\n fontWeight: 'normal'\n },\n },\n side: {\n show: true,\n data: ['CH4', 'C2H2', 'C2H4'],\n labelStyle: {\n color: '#00e5ff',\n fontSize: 14,\n fontWeight: 'bold',\n offset: 40\n },\n tickStyle: {\n show: true,\n color: 'rgba(200,220,255)',\n fontSize: 14,\n offset: 15,\n length: 6,\n lineColor: 'rgba(0,0,0,0.2)'\n },\n lineStyle: {\n color: 'rgba(180,210,255,0.1)',\n width: 1.5,\n type: 'solid'\n }\n },\n tooltip: {\n show: true,\n backgroundColor: 'rgba(5,13,26,0.95)',\n borderColor: '#00e5ff',\n padding: 10,\n textStyle: {\n color: '#c8d8e8',\n fontSize: 12\n }\n },\n pointStyle: {\n itemStyle: {\n shape: 'circle',\n radius: 6,\n color: '#ff4081',\n borderWidth: 1.5,\n borderColor: 'rgba(255,255,255,0.7)',\n },\n textStyle: {\n show: true,\n fontSize: 12,\n color: '#00e5ff',\n position: 'top',\n }\n },\n});\n\n/**\n * TriangleMath: 封装所有三元坐标系相关的几何计算\n * 职责:坐标转换 (Triangle <-> Cartesian)、面积计算、质心计算\n */\nexport class TriangleMath {\n /** 计算等边三角形在给定视口下的顶点 */\n static computeTri(box) {\n const { availW, availH, cx, cy } = box;\n\n // 计算最大允许的等边三角形边长 (高 = 边长 * sin(60度))\n const S = Math.max(0, Math.min(availW, availH / Math.sin(Math.PI / 3)));\n const triH = S * Math.sin(Math.PI / 3);\n\n const startX = cx - S / 2;\n const startY = cy - triH / 2; // 上下居中 Bounding Box\n\n return {\n top: { x: cx, y: startY },\n left: { x: startX, y: startY + triH },\n right: { x: startX + S, y: startY + triH },\n };\n }\n\n /** 三元坐标(a,b,c)转笛卡尔坐标(x,y) */\n static t2c(a, b, c, tri) {\n const { top: T, left: L, right: R } = tri;\n return {\n x: a * T.x + b * L.x + c * R.x,\n y: a * T.y + b * L.y + c * R.y,\n };\n }\n\n /** 笛卡尔坐标(x,y)转三元坐标(a,b,c) */\n static c2t(px, py, tri) {\n const { top: T, left: L, right: R } = tri;\n const denom = (L.y - R.y) * (T.x - R.x) + (R.x - L.x) * (T.y - R.y);\n const a = ((L.y - R.y) * (px - R.x) + (R.x - L.x) * (py - R.y)) / denom;\n const b = ((R.y - T.y) * (px - R.x) + (T.x - R.x) * (py - R.y)) / denom;\n return { a, b, c: 1 - a - b };\n }\n\n /** 计算多边形像素面积 */\n static polyArea(pts) {\n let a = 0;\n for (let i = 0, n = pts.length; i < n; i++) {\n const j = (i + 1) % n;\n a += pts[i].x * pts[j].y - pts[j].x * pts[i].y;\n }\n return Math.abs(a) / 2;\n }\n\n /** 计算多边形质心 */\n static polyCentroid(pts) {\n const n = pts.length;\n let A = 0,\n cx = 0,\n cy = 0;\n for (let i = 0; i < n; i++) {\n const j = (i + 1) % n;\n const cross = pts[i].x * pts[j].y - pts[j].x * pts[i].y;\n A += cross;\n cx += (pts[i].x + pts[j].x) * cross;\n cy += (pts[i].y + pts[j].y) * cross;\n }\n A /= 2;\n return { x: cx / (6 * A), y: cy / (6 * A) };\n }\n\n /**\n * 解析并归一化数据点 (支持对象数组或原始数值数组)\n * 返回 [a, b, c] 比例数组,保证 a+b+c = 1\n */\n static resolveData(pt, sideOrder) {\n let raw = null;\n if (Array.isArray(pt)) {\n if (pt.length >= 3) {\n if (typeof pt[0] === 'object' && pt[0] !== null) {\n if (sideOrder) {\n raw = sideOrder.map(k => {\n const item = pt.find(d => d && d.name === k);\n return item ? item.value : 0;\n });\n } else {\n raw = [pt[0].value, pt[1].value, pt[2].value];\n }\n } else {\n raw = [pt[0], pt[1], pt[2]];\n }\n }\n } else if (pt && pt.value && Array.isArray(pt.value) && pt.value.length >= 3) {\n raw = [pt.value[0], pt.value[1], pt.value[2]];\n }\n\n if (!raw || raw.some((v) => typeof v !== 'number' || isNaN(v))) return null;\n\n const [v1, v2, v3] = raw.map(v => Math.max(0, v || 0));\n const sum = v1 + v2 + v3;\n if (sum <= 1e-9) return [0.3333, 0.3333, 0.3333];\n\n return [v1 / sum, v2 / sum, v3 / sum];\n }\n}\n\n/**\n * TriangleRenderer: Canvas 2D 绘图引擎\n * 职责:负责渲染逻辑,不存储业务状态,仅根据传入的渲染状态(State)进行绘制\n */\nexport class TriangleRenderer {\n constructor(ctx) {\n this.ctx = ctx;\n }\n\n /** 全量渲染入口 */\n render(state) {\n const ctx = this.ctx;\n const { W, H, dpr, scale, tx, ty, option, tri, zones, hoveredPoint } = state;\n\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, W * dpr, H * dpr);\n ctx.fillStyle = option.backgroundColor;\n ctx.fillRect(0, 0, W * dpr, H * dpr);\n\n // 应用 变换矩阵:DPR * (Zoom/Pan)\n ctx.setTransform(scale * dpr, 0, 0, scale * dpr, tx * dpr, ty * dpr);\n\n this.drawTriFill(tri);\n this.drawZones(zones, tri, option);\n this.drawGrid(option, tri);\n this.drawBorder(option, tri);\n this.drawSideLabels(option, tri);\n this.drawSeries(option, tri, hoveredPoint);\n\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n }\n\n drawTriFill(tri) {\n const ctx = this.ctx,\n { top, left, right } = tri;\n ctx.beginPath();\n ctx.moveTo(top.x, top.y);\n ctx.lineTo(left.x, left.y);\n ctx.lineTo(right.x, right.y);\n ctx.closePath();\n ctx.fillStyle = TriangleConfig.triFill;\n ctx.fill();\n }\n\n drawZones(zones, tri, option) {\n const ctx = this.ctx;\n const scale = this.ctx.getTransform().a / (window.devicePixelRatio || 1);\n\n const gAlpha = option.zone?.alpha;\n const colors = option.zone?.colors || option.colors || DEFAULT_COLORS;\n\n // 1. Draw Backgrounds\n zones.forEach((zone, i) => {\n if (!zone.coordinates || !zone.coordinates.length) return;\n ctx.beginPath();\n zone.coordinates.forEach(([a, b, c], j) => {\n const pt = TriangleMath.t2c(a, b, c, tri);\n j === 0 ? ctx.moveTo(pt.x, pt.y) : ctx.lineTo(pt.x, pt.y);\n });\n ctx.closePath();\n\n let baseColor = zone.color || colors[i % colors.length];\n if (gAlpha !== undefined && baseColor !== 'transparent') {\n baseColor = colorToRgba(baseColor, gAlpha);\n }\n ctx.fillStyle = baseColor;\n ctx.fill();\n });\n\n // 2. Draw Borders\n const globalBorderStyle = option.zone?.borderStyle || {};\n zones.forEach((zone, i) => {\n const bStyle = globalBorderStyle;\n if (bStyle.show === false || !zone.coordinates || !zone.coordinates.length) return;\n\n ctx.beginPath();\n zone.coordinates.forEach(([a, b, c], j) => {\n const pt = TriangleMath.t2c(a, b, c, tri);\n j === 0 ? ctx.moveTo(pt.x, pt.y) : ctx.lineTo(pt.x, pt.y);\n });\n ctx.closePath();\n\n let borderColor = bStyle.color || zone.color || colors[i % colors.length];\n if (bStyle.alpha !== undefined && borderColor !== 'transparent') {\n borderColor = colorToRgba(borderColor, bStyle.alpha);\n }\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = (bStyle.width ?? 1.0) * scale;\n\n if (bStyle.type === 'dashed') {\n ctx.setLineDash([4, 4]);\n } else if (bStyle.type === 'dotted') {\n ctx.setLineDash([2, 4]);\n } else {\n ctx.setLineDash([]);\n }\n ctx.stroke();\n });\n ctx.setLineDash([]);\n\n // 3. Draw Labels\n const showLabel = option.showZoneLabel !== false;\n if (!showLabel) return;\n\n const ff = option.grid?.labelStyle?.fontFamily || 'Microsoft YaHei UI, monospace';\n\n const globalLabelStyle = option.zone?.labelStyle || {};\n zones.forEach((zone) => {\n const lStyle = globalLabelStyle;\n if (lStyle.show === false || !zone.name) return;\n\n let centPx;\n const lab = zone.labelAt;\n if (lab && Array.isArray(lab) && lab.length >= 3) {\n centPx = TriangleMath.t2c(lab[0], lab[1], lab[2], tri);\n } else if (zone.coordinates && zone.coordinates.length > 0) {\n // Fallback: calculate geometric center\n const pts = zone.coordinates.map(([a, b, c]) => TriangleMath.t2c(a, b, c, tri));\n centPx = {\n x: pts.reduce((s, p) => s + p.x, 0) / pts.length,\n y: pts.reduce((s, p) => s + p.y, 0) / pts.length\n };\n } else {\n return;\n }\n\n const fs = Math.round((lStyle.fontSize || 11) * scale);\n const fontStyle = lStyle.fontStyle || 'bold';\n ctx.font = `${fontStyle} ${fs}px ${ff}`;\n\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n const text = typeof lStyle.formatter === 'function' ? lStyle.formatter(zone) : zone.name;\n const tw = ctx.measureText(text).width;\n const th = fs;\n\n let lx = centPx.x;\n let ly = centPx.y;\n\n if (lStyle.backgroundColor && lStyle.backgroundColor !== 'transparent') {\n let padX = 4, padY = 4;\n if (Array.isArray(lStyle.padding)) {\n padY = lStyle.padding[0];\n padX = lStyle.padding[1] !== undefined ? lStyle.padding[1] : padY;\n } else if (typeof lStyle.padding === 'number') {\n padX = padY = lStyle.padding;\n }\n padX *= scale;\n padY *= scale;\n\n const radius = (lStyle.borderRadius || 3) * scale;\n const bw = tw + padX * 2;\n const bh = th + padY * 2;\n const bx = lx - bw / 2;\n const by = ly - bh / 2;\n\n ctx.fillStyle = lStyle.backgroundColor;\n ctx.beginPath();\n if (ctx.roundRect) {\n ctx.roundRect(bx, by, bw, bh, radius);\n } else {\n ctx.rect(bx, by, bw, bh);\n }\n ctx.fill();\n }\n\n if (lStyle.textShadow && lStyle.textShadow !== 'none') {\n ctx.shadowColor = lStyle.textShadow;\n ctx.shadowBlur = 4;\n } else {\n ctx.shadowColor = 'transparent';\n ctx.shadowBlur = 0;\n }\n\n ctx.fillStyle = lStyle.color || '#fff';\n ctx.fillText(text, lx, ly);\n\n ctx.shadowBlur = 0;\n ctx.shadowColor = 'transparent';\n });\n ctx.textBaseline = 'alphabetic';\n }\n\n drawBadge(cx, cy, tw, textColor, bgColor) {\n const ctx = this.ctx,\n { badgePadding: pad, badgeHeight: h, badgeRadius: r } = TriangleConfig.ZONE_VIS;\n const w = tw + pad * 2,\n x = cx - w / 2,\n y = cy - h / 2;\n ctx.beginPath();\n if (ctx.roundRect) ctx.roundRect(x, y, w, h, r);\n else ctx.rect(x, y, w, h);\n ctx.fillStyle = bgColor;\n ctx.fill();\n }\n\n drawArrow(fx, fy, tx, ty, color) {\n const ctx = this.ctx,\n dx = tx - fx,\n dy = ty - fy,\n len = Math.hypot(dx, dy);\n if (len < 1) return;\n const ux = dx / len,\n uy = dy / len,\n sz = 7;\n ctx.beginPath();\n ctx.moveTo(tx, ty);\n ctx.lineTo(tx - ux * sz + uy * sz * 0.5, ty - uy * sz - ux * sz * 0.5);\n ctx.lineTo(tx - ux * sz - uy * sz * 0.5, ty - uy * sz + ux * sz * 0.5);\n ctx.closePath();\n ctx.fillStyle = color;\n ctx.fill();\n }\n\n drawGrid(option, tri) {\n if (!option.grid || !option.grid.show) return;\n const ctx = this.ctx;\n const grid = option.grid;\n const steps = grid.steps || 10;\n const majorEvery = grid.majorEvery || 2;\n const lineStyle = grid.lineStyle || { color: 'rgba(255,255,255,0.1)', width: 1, type: 'solid' };\n const majorLineStyle = grid.majorLineStyle || { color: 'rgba(255,255,255,0.2)', width: 1, type: 'solid' };\n\n const scale = this.ctx.getTransform().a / (window.devicePixelRatio || 1);\n\n const getNormal = (p1, p2, inwardPt) => {\n let dx = p2.x - p1.x, dy = p2.y - p1.y;\n const len = Math.hypot(dx, dy);\n dx /= len; dy /= len;\n const n1 = { x: -dy, y: dx }, n2 = { x: dy, y: -dx };\n return ((inwardPt.x - p1.x) * n1.x + (inwardPt.y - p1.y) * n1.y > 0) ? n1 : n2;\n };\n const { top, left, right } = tri;\n const normals = {\n bottom: getNormal(left, right, top),\n left: getNormal(left, top, right),\n right: getNormal(right, top, left)\n };\n\n for (let i = 1; i < steps; i++) {\n const t = i / steps,\n isMajor = i % majorEvery === 0;\n const currentStyle = isMajor ? majorLineStyle : lineStyle;\n\n ctx.strokeStyle = currentStyle.color || 'transparent';\n ctx.lineWidth = (currentStyle.width ?? 1) * scale;\n\n if (currentStyle.type === 'dashed') {\n ctx.setLineDash([4, 4]);\n } else if (currentStyle.type === 'dotted') {\n ctx.setLineDash([2, 4]);\n } else {\n ctx.setLineDash([]);\n }\n const ln = (p1, p2) => {\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n };\n ln(TriangleMath.t2c(t, 1 - t, 0, tri), TriangleMath.t2c(t, 0, 1 - t, tri));\n ln(TriangleMath.t2c(1 - t, t, 0, tri), TriangleMath.t2c(0, t, 1 - t, tri));\n ln(TriangleMath.t2c(1 - t, 0, t, tri), TriangleMath.t2c(0, 1 - t, t, tri));\n this.drawSideTick(i, steps, t, option, tri, isMajor, normals);\n }\n }\n\n drawSideTick(i, steps, t, option, tri, isMajor, normals) {\n const sOpt = option.side || {};\n const tStyle = sOpt.tickStyle || {};\n if (tStyle.show === false) return;\n\n const ctx = this.ctx,\n val = Math.round((i * 100) / steps);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n const tickLen = tStyle.length || 6;\n const tickLineColor = tStyle.lineColor || 'rgba(0,0,0,0.2)';\n const tickColor = tStyle.color || 'rgba(200,220,255)';\n const offset = tStyle.offset !== undefined ? tStyle.offset : 15;\n const ff = tStyle.fontFamily || 'Microsoft YaHei UI, sans-serif';\n const fs = tStyle.fontSize || 14;\n const fw = tStyle.fontWeight || 'normal';\n const font = `${fw} ${fs}px ${ff}`;\n\n const drawLine = (p, nx, ny) => {\n ctx.beginPath();\n ctx.moveTo(p.x, p.y);\n ctx.lineTo(p.x + nx * tickLen, p.y + ny * tickLen);\n ctx.strokeStyle = tickLineColor;\n ctx.lineWidth = 1.5;\n ctx.stroke();\n };\n\n const p0 = TriangleMath.t2c(t, 1 - t, 0, tri);\n drawLine(p0, normals.left.x, normals.left.y);\n if (isMajor) {\n ctx.fillStyle = tickColor;\n ctx.font = font;\n ctx.save();\n ctx.translate(p0.x - offset, p0.y - 8);\n ctx.rotate(-Math.PI / 3);\n ctx.fillText(val + '', 0, 0);\n ctx.restore();\n }\n\n const p2 = TriangleMath.t2c(1 - t, 0, t, tri);\n drawLine(p2, normals.right.x, normals.right.y);\n if (isMajor) {\n ctx.fillStyle = tickColor;\n ctx.font = font;\n ctx.save();\n ctx.translate(p2.x + offset, p2.y - 8);\n ctx.rotate(Math.PI / 3);\n ctx.fillText(val + '', 0, 0);\n ctx.restore();\n }\n\n const p1 = TriangleMath.t2c(0, t, 1 - t, tri);\n drawLine(p1, normals.bottom.x, normals.bottom.y);\n if (isMajor) {\n ctx.fillStyle = tickColor;\n ctx.font = font;\n ctx.fillText(val + '', p1.x, p1.y + offset);\n }\n }\n\n drawBorder(option, tri) {\n const ctx = this.ctx,\n { top, left, right } = tri,\n sOpt = option.side || {};\n const lStyle = sOpt.lineStyle || { color: 'rgba(180,210,255,0.1)', width: 1.5, type: 'solid' };\n const edges = [\n { f: top, t: left },\n { f: top, t: right },\n { f: left, t: right },\n ];\n edges.forEach(({ f, t }) => {\n ctx.beginPath();\n ctx.moveTo(f.x, f.y);\n ctx.lineTo(t.x, t.y);\n ctx.strokeStyle = lStyle.color || 'transparent';\n ctx.lineWidth = lStyle.width || 1;\n if (lStyle.type === 'dashed') ctx.setLineDash([4, 4]);\n else if (lStyle.type === 'dotted') ctx.setLineDash([2, 4]);\n else ctx.setLineDash([]);\n ctx.stroke();\n });\n ctx.setLineDash([]);\n }\n\n drawSideLabels(option, tri) {\n if (option.side?.show === false) return;\n const ctx = this.ctx,\n { top, left, right } = tri,\n sOpt = option.side || {};\n\n const names = sOpt.data || ['A', 'B', 'C'];\n const lStyle = sOpt.labelStyle || {};\n const ff = lStyle.fontFamily || 'Microsoft YaHei UI, sans-serif';\n const fs = lStyle.fontSize || 14;\n const fw = lStyle.fontWeight || 'bold';\n const color = lStyle.color || '#00e5ff';\n const offset = lStyle.offset !== undefined ? lStyle.offset : 40;\n\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillStyle = color;\n ctx.font = `${fw} ${fs}px ${ff}`;\n\n const lMid = { x: (top.x + left.x) / 2, y: (top.y + left.y) / 2 },\n lDx = left.x - top.x,\n lDy = left.y - top.y,\n lLen = Math.hypot(lDx, lDy);\n ctx.save();\n ctx.translate(lMid.x + (-lDy / lLen) * offset, lMid.y + (lDx / lLen) * offset);\n ctx.rotate(Math.atan2(lDy, lDx) + Math.PI);\n ctx.fillText((names[1] || 'B') + ' (%)', 0, 0);\n ctx.restore();\n\n const rMid = { x: (top.x + right.x) / 2, y: (top.y + right.y) / 2 },\n rDx = right.x - top.x,\n rDy = right.y - top.y,\n rLen = Math.hypot(rDx, rDy);\n ctx.save();\n ctx.translate(rMid.x + (rDy / rLen) * offset, rMid.y + (-rDx / rLen) * offset);\n ctx.rotate(Math.atan2(rDy, rDx));\n ctx.fillText((names[2] || 'C') + ' (%)', 0, 0);\n ctx.restore();\n\n ctx.save();\n ctx.translate((left.x + right.x) / 2, (left.y + right.y) / 2 + offset);\n ctx.fillText((names[0] || 'A') + ' (%)', 0, 0);\n ctx.restore();\n }\n\n drawSeries(option, tri, hoveredPoint) {\n const ctx = this.ctx;\n const scale = this.ctx.getTransform().a / (window.devicePixelRatio || 1);\n const ff = 'Microsoft YaHei UI, sans-serif';\n const sideOrder = option.side?.data;\n\n (option.series || []).forEach((s) => {\n const pt = s.data;\n if (!pt || pt.length === 0) return;\n\n const ptName = s.name;\n const ratio = TriangleMath.resolveData(pt, sideOrder);\n if (!ratio) return;\n\n const canvasPt = TriangleMath.t2c(ratio[0], ratio[1], ratio[2], tri);\n const px = canvasPt.x;\n const py = canvasPt.y;\n\n const isHov = hoveredPoint && hoveredPoint.series === s;\n\n const shape = s.shape || 'circle';\n const color = s.color || '#409eff';\n let size = s.size !== undefined ? s.size : 5;\n if (isHov) size *= 1.5;\n\n const globalItemStyle = s.itemStyle || {};\n const borderColor = globalItemStyle.borderColor || '#fff';\n const borderWidth = globalItemStyle.borderWidth !== undefined ? globalItemStyle.borderWidth : 1;\n const opacity = globalItemStyle.opacity !== undefined ? globalItemStyle.opacity : 1;\n\n const globalTextStyle = s.textStyle || {};\n const textShow = globalTextStyle.show !== undefined ? globalTextStyle.show : true;\n const textColor = globalTextStyle.color || color;\n const textFontSize = globalTextStyle.fontSize !== undefined ? globalTextStyle.fontSize : 12;\n const textFontWeight = globalTextStyle.fontWeight || 'normal';\n const textPosition = globalTextStyle.position || 'top';\n const textOffset = globalTextStyle.offset || [0, 0];\n\n const globalGlowStyle = s.glowStyle || {};\n const glowShow = globalGlowStyle.show !== undefined ? globalGlowStyle.show : false;\n const glowColorsOpt = globalGlowStyle.colors;\n const glowBlur = globalGlowStyle.blur !== undefined ? globalGlowStyle.blur : 15;\n const glowStartColor = globalGlowStyle.startColor || color;\n const glowEndColor = globalGlowStyle.endColor || 'transparent';\n const glowCount = globalGlowStyle.count !== undefined ? globalGlowStyle.count : 3;\n const glowDistance = globalGlowStyle.glowDistance !== undefined ? globalGlowStyle.glowDistance : 2;\n\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Glow Style Rendering\n if (glowShow) {\n ctx.shadowColor = glowColorsOpt ? glowColorsOpt[0] : glowStartColor;\n ctx.shadowBlur = glowBlur;\n\n let glowColors = [];\n let layers = glowCount;\n\n if (Array.isArray(glowColorsOpt) && glowColorsOpt.length > 0) {\n glowColors = glowColorsOpt;\n layers = glowColors.length;\n } else {\n for (let i = 0; i < layers; i++) {\n const factor = layers > 1 ? i / (layers - 1) : 0;\n glowColors.push(interpolateColor(glowStartColor, glowEndColor, factor));\n }\n }\n\n for (let i = layers - 1; i >= 0; i--) {\n const glowColor = glowColors[i];\n ctx.save();\n ctx.fillStyle = glowColor;\n ctx.beginPath();\n drawShapePath(ctx, px, py, shape, size, scale, (i + 1) * glowDistance);\n ctx.fill();\n ctx.restore();\n }\n }\n\n // Point Shape Rendering\n ctx.beginPath();\n drawShapePath(ctx, px, py, shape, size, scale, 0);\n\n if (shape === 'ring') {\n ctx.strokeStyle = color;\n ctx.lineWidth = borderWidth * scale;\n ctx.stroke();\n } else {\n ctx.fillStyle = color;\n ctx.fill();\n if (borderWidth > 0) {\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = borderWidth * scale;\n ctx.stroke();\n }\n }\n ctx.restore();\n\n // Text/Label Rendering\n if (textShow && ptName) {\n ctx.save();\n ctx.globalAlpha = opacity;\n ctx.font = `${textFontWeight} ${Math.round(textFontSize * scale)}px ${ff}`;\n ctx.fillStyle = textColor;\n\n let textAlign = 'center';\n let textBaseline = 'middle';\n let tx = px + textOffset[0] * scale;\n let ty = py + textOffset[1] * scale;\n\n let offsetVal = 6 * scale;\n if (shape === 'circle' || shape === 'ring' || shape === 'star' || shape === 'triangle') {\n offsetVal += size * scale;\n } else if (shape === 'square') {\n offsetVal += size * scale / 2;\n }\n\n if (textPosition === 'top') {\n textAlign = 'center';\n textBaseline = 'bottom';\n ty -= offsetVal;\n } else if (textPosition === 'bottom') {\n textAlign = 'center';\n textBaseline = 'top';\n ty += offsetVal;\n } else if (textPosition === 'left') {\n textAlign = 'right';\n textBaseline = 'middle';\n tx -= offsetVal;\n } else if (textPosition === 'right') {\n textAlign = 'left';\n textBaseline = 'middle';\n tx += offsetVal;\n } else if (textPosition === 'center') {\n textAlign = 'center';\n textBaseline = 'middle';\n }\n\n ctx.textAlign = textAlign;\n ctx.textBaseline = textBaseline;\n ctx.fillText(ptName, tx, ty);\n ctx.restore();\n }\n });\n }\n}\n\n/**\n * DuvalTriangle: 顶层管理类\n * 职责:负责 DOM 初始化、Tooltip 管理、状态维护(Zoom/Pan)、响应式 Resize 及事件分发\n */\nexport class DuvalTriangle {\n constructor(containerIdOrEl, option = {}) {\n this.initDOM(containerIdOrEl);\n this.renderer = new TriangleRenderer(this.ctx);\n\n this.state = {\n W: 0,\n H: 0,\n dpr: 1,\n scale: 1,\n tx: 0,\n ty: 0,\n option: {},\n tri: {},\n zones: [],\n hoveredPoint: null,\n };\n\n this._zoom = new ZoomController(option.zoom);\n\n this._bus = new EventBus();\n\n this._initTooltip();\n this.bindEvents();\n\n this.ro = new ResizeObserver(() => this.fitCanvas());\n this.ro.observe(this.container);\n\n this.fitCanvas();\n if (Object.keys(option).length) this.setOption(option);\n }\n\n initDOM(containerIdOrEl) {\n let el = typeof containerIdOrEl === 'string' ? document.getElementById(containerIdOrEl) : containerIdOrEl;\n if (!el) throw new Error('DuvalTriangle: container not found');\n this.container = el.tagName.toLowerCase() === 'canvas' ? el.parentElement || el : el;\n this.canvas = el.tagName.toLowerCase() === 'canvas' ? el : document.createElement('canvas');\n if (el.tagName.toLowerCase() !== 'canvas') {\n this.container.style.position = this.container.style.position || 'relative';\n this.canvas.style.cssText = 'display:block;width:100%;height:100%;cursor:default;';\n this.container.appendChild(this.canvas);\n }\n this.ctx = this.canvas.getContext('2d');\n }\n\n _initTooltip() {\n const tooltipCfg = this.state.option.tooltip || TriangleConfig.tooltip;\n this._tooltip = new DOMTooltip(this.container, {\n tooltipBg: tooltipCfg.backgroundColor || 'rgba(5,13,26,0.95)',\n tooltipTextColor: tooltipCfg.textStyle?.color || '#c8d8e8',\n tooltipPadding: tooltipCfg.padding || 10,\n zoneBorderColor: tooltipCfg.borderColor || '#00e5ff',\n fontFamily: 'monospace',\n });\n this._tooltip.el.style.whiteSpace = 'nowrap';\n this._tooltip.el.style.lineHeight = '1.6';\n }\n\n setOption(option) {\n if (!this.state.option || !Object.keys(this.state.option).length) {\n this.state.option = deepMerge(deepMerge({}, TriangleConfig), option);\n } else {\n deepMerge(this.state.option, option);\n }\n this._normalizeOptions();\n this.computeGeometry();\n this.buildZonePaths();\n this.render();\n }\n\n setSeries(series) {\n this.state.option.series = Array.isArray(series) ? series : [series];\n this.render();\n return this;\n }\n\n on(event, handler) {\n this._bus.on(event, handler);\n return this;\n }\n\n off(event, handler) {\n this._bus.off(event, handler);\n return this;\n }\n\n _normalizeOptions() {\n const opt = this.state.option;\n // Ensure side data exists\n if (!opt.side) opt.side = {};\n if (!opt.side.data || opt.side.data.length < 3) {\n opt.side.data = ['A', 'B', 'C'];\n }\n\n }\n\n computeGeometry() {\n const dpr = window.devicePixelRatio || 1;\n this.state.W = this.canvas.width / dpr;\n this.state.H = this.canvas.height / dpr;\n this.state.dpr = dpr;\n\n const padding = this.state.option.padding ?? 45;\n const grid = this.state.option.grid || {};\n const box = parseGridBox(this.state.W, this.state.H, grid, padding);\n this.state.tri = TriangleMath.computeTri(box);\n }\n\n buildZonePaths() {\n const { option, tri } = this.state;\n const zoneData = option.zone?.data || [];\n this.state.zones = zoneData.map((z) => {\n const nz = { ...z };\n // 预构建 Path2D\n const path = new Path2D();\n const pts = z.coordinates;\n if (!pts) return;\n pts.forEach(([pa, pb, pc], i) => {\n const ppt = TriangleMath.t2c(pa, pb, pc, tri);\n i === 0 ? path.moveTo(ppt.x, ppt.y) : path.lineTo(ppt.x, ppt.y);\n });\n path.closePath();\n nz.path = path;\n\n // 预构建标签位置\n if (z.labelAt) {\n nz.labelPos = { a: z.labelAt[0], b: z.labelAt[1], c: z.labelAt[2] };\n } else {\n const ptsArr = z.coordinates || [];\n const pts = ptsArr.map((p) => TriangleMath.t2c(p[0], p[1], p[2], tri));\n const cen = TriangleMath.polyCentroid(pts);\n const t = TriangleMath.c2t(cen.x, cen.y, tri);\n nz.labelPos = { a: t.a, b: t.b, c: t.c };\n }\n return nz;\n });\n }\n\n fitCanvas() {\n const dpr = window.devicePixelRatio || 1;\n const aW = this.container.clientWidth || 400,\n aH = this.container.clientHeight || 400;\n\n this.canvas.width = Math.round(aW * dpr);\n this.canvas.height = Math.round(aH * dpr);\n // 不再通过内联覆盖宽高,直接继承初始化时的宽高\n this.canvas.style.width = aW + 'px';\n this.canvas.style.height = aH + 'px';\n this.state.scale = 1;\n this.state.tx = 0;\n this.state.ty = 0;\n if (this._zoom) this._zoom.reset();\n if (Object.keys(this.state.option).length) {\n this.computeGeometry();\n this.buildZonePaths();\n this.render();\n }\n }\n\n render() {\n if (!this.state.option) return;\n this.state.scale = this._zoom.zoom;\n this.state.tx = this._zoom.panX;\n this.state.ty = this._zoom.panY;\n this.renderer.render(this.state);\n\n const results = [];\n const sideOrder = this.state.option.side?.data;\n (this.state.option.series || []).forEach((s) => {\n const pt = s.data;\n if (!pt || pt.length === 0) return;\n const ratio = TriangleMath.resolveData(pt, sideOrder);\n if (!ratio) return;\n const zone = this.getZoneAt(ratio[0], ratio[1], ratio[2]);\n results.push({\n series: s,\n zone: zone,\n ratio: ratio\n });\n });\n if (results.length > 0) {\n this._bus.emit('diagnose', results);\n }\n }\n\n bindEvents() {\n const cv = this.canvas;\n\n this._onWheel = (e) => {\n e.preventDefault();\n const rect = cv.getBoundingClientRect();\n const ax = (e.clientX - rect.left) * (this.state.W / rect.width);\n const ay = (e.clientY - rect.top) * (this.state.H / rect.height);\n this._zoom.onWheel(e.deltaY, ax, ay);\n this._bus.emit('zoom', this._zoom.state);\n this.render();\n };\n\n this._onDown = (e) => {\n if (e.button !== 0) return;\n const rect = cv.getBoundingClientRect();\n const scaleX = this.state.W / rect.width;\n const scaleY = this.state.H / rect.height;\n this._zoom.startDrag(e.clientX * scaleX, e.clientY * scaleY);\n cv.style.cursor = 'grabbing';\n };\n\n this._onMove = (e) => {\n const rect = cv.getBoundingClientRect();\n const scaleX = this.state.W / rect.width;\n const scaleY = this.state.H / rect.height;\n if (this._zoom.moveDrag(e.clientX * scaleX, e.clientY * scaleY, 1)) {\n this.render();\n return;\n }\n this.handleMouseMove(e);\n };\n\n this._onUp = () => {\n if (!this._zoom.endDrag()) return;\n cv.style.cursor = this.state.hoveredPoint ? 'pointer' : 'default';\n this._bus.emit('zoom', this._zoom.state);\n };\n\n this._onLeave = () => {\n this.hideTooltip();\n this.state.hoveredPoint = null;\n this._bus.emit('hover', null);\n this.render();\n };\n\n this._onDbl = () => {\n this.zoomReset();\n };\n\n cv.addEventListener('wheel', this._onWheel, { passive: false });\n cv.addEventListener('mousedown', this._onDown);\n cv.addEventListener('mousemove', this._onMove);\n cv.addEventListener('mouseleave', this._onLeave);\n cv.addEventListener('dblclick', this._onDbl);\n cv.addEventListener('click', this.handleClick.bind(this));\n window.addEventListener('mouseup', this._onUp);\n }\n\n handleMouseMove(e) {\n const r = this.canvas.getBoundingClientRect();\n const scaleX = this.state.W / r.width;\n const scaleY = this.state.H / r.height;\n const cx = (e.clientX - r.left) * scaleX;\n const cy = (e.clientY - r.top) * scaleY;\n\n const x = (cx - this._zoom.panX) / this._zoom.zoom;\n const y = (cy - this._zoom.panY) / this._zoom.zoom;\n const { a, b, c } = TriangleMath.c2t(x, y, this.state.tri);\n if (a < -1e-7 || b < -1e-7 || c < -1e-7) {\n this.hideTooltip();\n if (this.state.hoveredPoint !== null) {\n this.state.hoveredPoint = null;\n this.canvas.style.cursor = 'default';\n this.render();\n }\n return;\n }\n\n let nearest = null,\n minDist = 14;\n const sideOrder = this.state.option.side?.data;\n (this.state.option.series || []).forEach((s) => {\n const ptData = s.data;\n if (!ptData) return;\n const ratio = TriangleMath.resolveData(ptData, sideOrder);\n if (!ratio) return;\n const pt = TriangleMath.t2c(...ratio, this.state.tri),\n d = Math.hypot(pt.x - x, pt.y - y);\n if (d < minDist) {\n minDist = d;\n nearest = { series: s, raw: ratio };\n }\n });\n if (nearest !== this.state.hoveredPoint) {\n this.state.hoveredPoint = nearest;\n this.canvas.style.cursor = nearest ? 'pointer' : 'default';\n this.render();\n }\n this.showTooltip(x, y, a, b, c);\n }\n\n handleClick(e) {\n if (this._zoom.isDragging) return;\n const r = this.canvas.getBoundingClientRect();\n const scaleX = this.state.W / r.width;\n const scaleY = this.state.H / r.height;\n const cx = (e.clientX - r.left) * scaleX;\n const cy = (e.clientY - r.top) * scaleY;\n\n const x = (cx - this._zoom.panX) / this._zoom.zoom;\n const y = (cy - this._zoom.panY) / this._zoom.zoom;\n const { a, b, c } = TriangleMath.c2t(x, y, this.state.tri);\n if (a < -1e-7 || b < -1e-7 || c < -1e-7) return;\n const zone = this.getZoneAt(a, b, c);\n this._bus.emit('click', { a, b, c, zone });\n this.canvas.dispatchEvent(\n new CustomEvent('triangle:click', { detail: { a, b, c, zone }, bubbles: true })\n );\n }\n\n showTooltip(x, y, a, b, c) {\n const tOpt = this.state.option.tooltip || {};\n if (tOpt.show === false || !this.state.hoveredPoint) {\n this.hideTooltip();\n return;\n }\n const foundZone = this.getZoneAt(a, b, c);\n const side = this.state.option.side || {};\n const sNames = side.data || ['A', 'B', 'C'];\n\n // 触发外部 hover 事件,对齐五边形返回的内容\n this._bus.emit('hover', {\n ratio: [a, b, c],\n zone: foundZone,\n point: this.state.hoveredPoint?.series || null,\n });\n\n if (tOpt.formatter) {\n const html = tOpt.formatter({\n a, b, c, sNames, zone: foundZone,\n point: this.state.hoveredPoint?.series,\n });\n const docX = x * this._zoom.zoom + this._zoom.panX;\n const docY = y * this._zoom.zoom + this._zoom.panY;\n this._tooltip.show(html, docX, docY, tOpt, {}, foundZone);\n return;\n }\n\n const html = this._defaultTooltipHTML(a, b, c, sNames, foundZone);\n const docX = x * this._zoom.zoom + this._zoom.panX;\n const docY = y * this._zoom.zoom + this._zoom.panY;\n\n // 补偿 canvas 在容器内的偏移\n const canvasRect = this.canvas.getBoundingClientRect();\n const containerRect = this.container.getBoundingClientRect();\n const offsetX = canvasRect.left - containerRect.left;\n const offsetY = canvasRect.top - containerRect.top;\n\n this._tooltip.show(html, docX + offsetX, docY + offsetY, tOpt, {}, foundZone);\n }\n\n hideTooltip() {\n if (this._tooltip) this._tooltip.hide();\n }\n\n getZoneAt(a, b, c) {\n const pt = TriangleMath.t2c(a, b, c, this.state.tri);\n const ctx = this.ctx;\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n const found = (this.state.zones || []).find((z) => z.path && ctx.isPointInPath(z.path, pt.x, pt.y));\n ctx.restore();\n return found;\n }\n\n zoomReset() {\n this.state.scale = 1;\n this.state.tx = 0;\n this.state.ty = 0;\n this.render();\n this._bus.emit('zoom', { scale: this.state.scale, tx: this.state.tx, ty: this.state.ty });\n }\n dispose() {\n this.ro?.disconnect();\n this._tooltip?.dispose();\n this.canvas?.remove();\n window.removeEventListener('mouseup', this._onUp);\n this._bus?.dispose();\n }\n\n /**\n * 默认 tooltip HTML 生成\n * @private\n */\n _defaultTooltipHTML(a, b, c, sNames, zone) {\n const hovered = this.state.hoveredPoint;\n const ptName = hovered?.series?.name || 'Data Point';\n const pointNameStr = `<div style=\"font-size:14px; font-weight:bold; margin-bottom:4px; color:#fff;\">${ptName}</div>`;\n\n const TRIANGLE_TITLES = {\n 'PD': '局部放电',\n 'D1': '低能放电',\n 'D2': '高能放电',\n 'T1': '热故障,t<300℃',\n 'T2': '热故障,300℃<t<700℃',\n 'T3': '热故障,t>700℃',\n 'DT': '热和放电混合故障',\n 'S': '温度<200℃时的杂散气体',\n 'C': '绝缘纸可能碳化',\n 'O': '矿物油过热',\n 'T3-H': '仅矿物油过热',\n 'ND': '正常'\n };\n\n const zoneTitle = zone?.title || zone?.desc || (zone ? TRIANGLE_TITLES[zone.name] : '') || '';\n const zoneStr = zone ? `${zone.name || zone.id || ''} ${zoneTitle}`.trim() : 'Outside';\n const zoneColor = zone ? (zone.color?.replace(/[\\d.]+\\)$/, '1)') || '#fff') : '#fff';\n\n let html = `\n ${pointNameStr}\n <div style=\"color:${zoneColor}; font-size:13px; font-weight:bold; padding-bottom:8px; margin-bottom:8px; border-bottom:1px solid rgba(255,255,255,0.07);\">\n ${zoneStr}\n </div>\n `;\n\n const axisColors = ['#00e5ff', '#ff6b35', '#ffcc02'];\n const item = hovered?.series?.data;\n\n if (true) {\n sNames.forEach((name, i) => {\n const col = axisColors[i % 3];\n\n let rawValStr = '-';\n if (item) {\n if (Array.isArray(item)) {\n rawValStr = item[i] !== undefined ? item[i] : '-';\n } else if (typeof item === 'object') {\n if (item.value && Array.isArray(item.value)) {\n rawValStr = item.value[i] !== undefined ? item.value[i] : '-';\n } else if (item[name] !== undefined) {\n rawValStr = item[name];\n }\n }\n }\n\n html += `\n <div style=\"display:flex; align-items:center; margin-bottom:6px; font-size:13px;\">\n <span style=\"display:inline-block; width:8px; height:8px; border-radius:50%; background-color:${col}; margin-right:8px;\"></span>\n <span style=\"color:#cbd5e1; flex-grow:1;\">${name}</span>\n <span style=\"color:#fff; font-weight:bold; margin-left:20px;\">${rawValStr}</span>\n </div>\n `;\n });\n }\n\n return html;\n }\n}\n\nfunction parseRgba(color) {\n const cleaned = color.trim().toLowerCase();\n if (cleaned.startsWith('#')) {\n let hex = cleaned.slice(1);\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n const a = hex.length === 8 ? parseInt(hex.substring(6, 8), 16) / 255 : 1;\n return [r, g, b, a];\n }\n const m = cleaned.match(/rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\)/);\n if (m) {\n return [\n parseInt(m[1], 10),\n parseInt(m[2], 10),\n parseInt(m[3], 10),\n m[4] !== undefined ? parseFloat(m[4]) : 1\n ];\n }\n if (cleaned === 'transparent') return [0, 0, 0, 0];\n return [255, 255, 255, 1];\n}\n\nfunction colorToRgba(color, alpha = 1) {\n const [r, g, b, a] = parseRgba(color);\n return `rgba(${r},${g},${b},${a * alpha})`;\n}\n\nfunction interpolateColor(c1, c2, factor) {\n const [r1, g1, b1, a1] = parseRgba(c1);\n const [r2, g2, b2, a2] = parseRgba(c2);\n const r = Math.round(r1 + (r2 - r1) * factor);\n const g = Math.round(g1 + (g2 - g1) * factor);\n const b = Math.round(b1 + (b2 - b1) * factor);\n const a = a1 + (a2 - a1) * factor;\n return `rgba(${r},${g},${b},${a})`;\n}\n\n\n\n\n","/**\n * DGA 三比值法 核心逻辑模块 \n * 包含: ThreeRatioConfig 配置, DGAScale 工具类, Renderer3D 渲染类, ThreeRatioChart 组件类\n */\nimport { parseGridBox, deepMerge, EventBus, DEFAULT_COLORS } from './utils.js';\n\nimport { THREE_RADIO_ZONES } from './zones.js';\n\n// 核心配置中心:包含故障诊断规则、视觉样式及交互参数\nexport const ThreeRatioConfig = Object.freeze({\n colors: DEFAULT_COLORS,\n // 故障区域定义(用于诊断逻辑与 3D/2D 绘图)\n ZONES: THREE_RADIO_ZONES,\n\n // 坐标轴固定配置(X: C2H4/C2H6, Y: CH4/H2, Z: C2H2/C2H4)\n AXES: {\n x: { color: '#ff9a3c', label: 'X (C₂H₄/C₂H₆)' },\n y: { color: '#4ac8ff', label: 'Y (CH₄/H₂)' },\n z: { color: '#70e870', label: 'Z (C₂H₂/C₂H₄)' },\n },\n\n // 绘图主题配置(深浅两色)\n THEMES: {\n dark: {\n wallFillAlpha: 0.05, // 立方体墙面填充透明度\n wallGridAlpha: '40', // 墙面网格线 Alpha (Hex)\n wallEdgeAlpha: '50', // 墙面边缘 Alpha (Hex)\n outerGrid: 'rgba(100,150,220,0.10)', // 外部辅助网格\n plane2dGrid: 'rgba(100,150,220,0.20)', // 2D 投影网格\n plane2dAxis: 'rgba(120,160,220,0.50)', // 2D 投影轴线\n plane2dLabel: 'rgba(150,180,220,0.60)', // 2D 区域文字标签颜色\n tickAlpha: 'cc', // 刻度文字 Alpha\n pointStroke: 'rgba(255,255,255,0.55)', // 样本点边缘描边\n },\n light: {\n wallFillAlpha: 0.06,\n wallGridAlpha: '28',\n wallEdgeAlpha: '55',\n outerGrid: 'rgba(80,120,200,0.12)',\n plane2dGrid: 'rgba(80,120,200,0.18)',\n plane2dAxis: 'rgba(80,120,200,0.45)',\n plane2dLabel: 'rgba(60,100,180,0.65)',\n tickAlpha: 'bb',\n pointStroke: 'rgba(0,0,0,0.25)',\n },\n },\n\n // 2D 投影平面视角配置\n PLANES: {\n xz: {\n hAxis: 'x',\n vAxis: 'z',\n hLabel: 'X C₂H₄/C₂H₆(热故障)',\n vLabel: 'Z C₂H₂/C₂H₄(高能放电)',\n bgColor: {\n dark: 'rgba(180,120,60,0.06)',\n light: 'rgba(180,100,40,0.05)',\n },\n },\n yz: {\n hAxis: 'y',\n vAxis: 'z',\n hLabel: 'Y CH₄/H₂(低能放电)',\n vLabel: 'Z C₂H₂/C₂H₄(高能放电)',\n bgColor: {\n dark: 'rgba(60,160,180,0.06)',\n light: 'rgba(40,140,160,0.05)',\n },\n },\n xy: {\n hAxis: 'x',\n vAxis: 'y',\n hLabel: 'X C₂H₄/C₂H₆(热故障)',\n vLabel: 'Y CH₄/H₂(低能放电)',\n bgColor: { dark: 'rgba(60,100,200,0.06)', light: 'rgba(40,80,180,0.05)' },\n },\n },\n\n TICKS: { vals: [0, 1 / 3, 2 / 3, 1], labels: ['0', '0.1', '1.0', '10'] }, // 刻度映射\n CAM: { elev: -20, yaw: 115 }, // 初始相机仰角、偏航角\n PROJ: { fov: 4.0, scaleK: 0.45, cx: 0.48, cy: 0.52 }, // 投影及中心偏移参数\n PAD2D: { l: 70, r: 30, t: 50, b: 60 }, // 2D 投影边距\n DRAG: {\n rotYSens: 0.45,\n rotXSens: 0.28,\n rotXMin: -70,\n rotXMax: 85,\n zoomMin: 0.3,\n zoomMax: 4.0,\n zoomIn: 1.08,\n zoomOut: 0.92,\n }, // 交互灵敏度与限制\n TWEEN: { step: 0.045 }, // 视角切换动画步长\n POINT: {\n defaultSize: 7,\n defaultColor: '#aaaaaa',\n glowAlpha: 0.25,\n glowRadius: 2.2,\n hlOffset: 0.35,\n }, // 样本点视觉参数\n ZONE_VIS: { fillAlpha: 0.25, labelAlpha: 0.9 }, // 3D 区域填充透明度(玻璃块效果)\n UNKNOWN: { name: '未分类(需综合判断)', color: '#888899' }, // 无法匹配诊断规则时的默认项\n TEXT_STYLE: {\n fontSize: 14,\n fontFamily: 'Segoe UI, Courier New',\n fontWeight: 'normal',\n },\n});\n\n/**\n * DGAScale: 提供原始三比值与单位立方体坐标(0-1)之间的映射\n */\nexport class DGAScale {\n /**\n * 将原始三比值数值转换为 0-1 的归一化坐标 (非等比例分段对数变换)\n * 变换规则:[0, 0.1]->[0, 1/3], [0.1, 1]->[1/3, 2/3], [1, 10]->[2/3, 1]\n */\n static realToU(v) {\n if (v <= 0) return 0;\n if (v <= 0.1) return v / 0.3;\n if (v <= 1) return 1 / 3 + (Math.log10(v) + 1) / 3;\n if (v <= 10) return 2 / 3 + Math.log10(v) / 3;\n return 1;\n }\n /** 将归一化单位值还原为原始比值 */\n static uToReal(u) {\n if (u <= 0) return 0;\n if (u <= 1 / 3) return u * 0.3;\n if (u <= 2 / 3) return Math.pow(10, (u - 1 / 3) * 3 - 1);\n return Math.pow(10, (u - 2 / 3) * 3);\n }\n /** 格式化数值输出 */\n static formatVal(v) {\n return v < 0.01 ? v.toFixed(4) : v.toFixed(3);\n }\n}\n\n/**\n * Renderer3D: Canvas 2D 实现的轻量级 3D 渲染器\n * 负责投影计算、场景裁剪及各类视觉元素的绘制\n */\nexport class Renderer3D {\n constructor(ctx, W, H, opts = {}) {\n this.ctx = ctx;\n this.opts = opts;\n this.layout = opts.layout ?? 'fill';\n this.resize(W, H);\n this.updateOptions(opts);\n }\n\n /** 更新渲染配置 */\n updateOptions(opts = {}) {\n this.opts = { ...this.opts, ...opts };\n if (opts.layout !== undefined || opts.grid !== undefined) {\n if (opts.layout !== undefined) {\n this.layout = opts.layout;\n }\n this.resize(this.W, this.H);\n }\n const themeName = this.opts.theme ?? 'dark';\n this.theme = ThreeRatioConfig.THEMES[themeName] ?? ThreeRatioConfig.THEMES.dark;\n this.themeName = themeName;\n this.zone = this.processZones(this.opts.zone ?? ThreeRatioConfig.ZONES);\n\n // 初始化 wall 和 axis 的默认配置并与 opts 进行合并\n const defaultWall = {\n show: true,\n fill: { show: true, alpha: this.theme.wallFillAlpha, colors: { xy: undefined, xz: undefined, yz: undefined } },\n grid: { show: true, lineStyle: { lineWidth: 0.6, alpha: parseInt(this.theme.wallGridAlpha, 16) / 255, type: 'solid' } },\n border: { show: true, lineStyle: { lineWidth: 0.8, alpha: parseInt(this.theme.wallEdgeAlpha, 16) / 255, type: 'solid' } }\n };\n\n const defaultAxis = {\n show: true,\n lineStyle: { lineWidth: 1.8, arrowSize: 9 },\n labelStyle: { show: true, fontSize: 14, fontWeight: 'bold', distance: 16 },\n tickLabelStyle: { show: true, fontSize: 12, color: 'rgba(255, 255, 255, 0.8)' },\n data: {\n x: { name: ThreeRatioConfig.AXES.x.label, color: ThreeRatioConfig.AXES.x.color },\n y: { name: ThreeRatioConfig.AXES.y.label, color: ThreeRatioConfig.AXES.y.color },\n z: { name: ThreeRatioConfig.AXES.z.label, color: ThreeRatioConfig.AXES.z.color }\n }\n };\n\n const defaultPlane2D = {\n show: true,\n fade3DAlpha: 0.03,\n grid: {\n show: true,\n backgroundColor: undefined,\n lineStyle: { lineWidth: 0.5, alpha: 0.2, type: 'solid' }\n },\n axis: {\n show: true,\n lineStyle: { lineWidth: 1.5, alpha: 0.9 },\n labelStyle: { show: true, fontSize: 13, distance: 25 },\n tickLabelStyle: { show: true, fontSize: 11, distance: 8 }\n },\n zone: {\n show: true,\n alpha: 0.75,\n borderStyle: { show: true, width: 1.4 }\n }\n };\n\n this.opts.wall = deepMerge(defaultWall, this.opts.wall || {});\n this.opts.axis = deepMerge(defaultAxis, this.opts.axis || {});\n this.opts.plane2D = deepMerge(defaultPlane2D, this.opts.plane2D || {});\n }\n\n /** 预计算区域数据 */\n processZones(zonesOpt) {\n let zonesData = [];\n let globalLabelStyle = {};\n let gAlpha = undefined;\n let gBorder = {};\n let colors = this.opts.colors || ThreeRatioConfig.colors || DEFAULT_COLORS;\n \n if (zonesOpt && typeof zonesOpt === 'object' && Array.isArray(zonesOpt.data)) {\n zonesData = zonesOpt.data;\n globalLabelStyle = zonesOpt.labelStyle || {};\n gAlpha = zonesOpt.alpha;\n gBorder = zonesOpt.borderStyle || {};\n if (zonesOpt.colors) colors = zonesOpt.colors;\n } else {\n zonesData = ThreeRatioConfig.ZONES;\n }\n\n return zonesData.map((d, i) => {\n let baseColor = d.color || colors[i % colors.length];\n if (gAlpha !== undefined && baseColor !== 'transparent') {\n baseColor = colorToRgba(baseColor, gAlpha);\n }\n \n const [r, g, b] = parseRgba(baseColor);\n\n const lblStyle = globalLabelStyle;\n const labelColor = lblStyle.color || baseColor;\n\n let fontParts = [];\n if (lblStyle.fontWeight) fontParts.push(lblStyle.fontWeight);\n if (lblStyle.fontSize) fontParts.push(lblStyle.fontSize + 'px');\n if (lblStyle.fontFamily) fontParts.push(lblStyle.fontFamily);\n const fontStr = fontParts.length > 0 ? fontParts.join(' ') : null;\n\n const bStyle = gBorder;\n let edgeStr = bStyle.color || baseColor;\n if (bStyle.alpha !== undefined && edgeStr !== 'transparent') {\n edgeStr = colorToRgba(edgeStr, bStyle.alpha);\n }\n\n const p1 = d.coordinates && d.coordinates[0] ? d.coordinates[0] : [0, 0, 0];\n const p2 = d.coordinates && d.coordinates[1] ? d.coordinates[1] : [0, 0, 0];\n\n return {\n ...d,\n fillBase: `rgba(${r},${g},${b},`,\n edgeStr,\n x0: DGAScale.realToU(p1[0]),\n x1: DGAScale.realToU(p2[0]),\n y0: DGAScale.realToU(p1[1]),\n y1: DGAScale.realToU(p2[1]),\n z0: DGAScale.realToU(p1[2]),\n z1: DGAScale.realToU(p2[2]),\n labelColor,\n labelFontStr: fontStr\n };\n });\n }\n\n /** 获取配置的字体样式 */\n getFont(key) {\n const base = ThreeRatioConfig.TEXT_STYLE;\n const custom = this.opts.textStyle?.[key] ?? this.opts.textStyle ?? {};\n const size = custom.fontSize ?? base.fontSize;\n const family = custom.fontFamily ?? base.fontFamily;\n const weight = custom.fontWeight ?? (key === 'axis' || key === 'zone' ? 'bold' : base.fontWeight);\n return `${weight} ${size}px ${family}`;\n }\n\n /** 更新渲染器主题 */\n setTheme(name) {\n this.updateOptions({ theme: name });\n }\n\n /** 画布尺寸更新回调 */\n resize(W, H) {\n this.W = W;\n this.H = H;\n const grid = this.opts.grid;\n const hasGridMargin = grid && (grid.left !== undefined || grid.right !== undefined || grid.top !== undefined || grid.bottom !== undefined);\n\n // 根据 layout 模式计算有效显示区域\n if (hasGridMargin) {\n const box = parseGridBox(W, H, grid, 0);\n this.renderW = box.availW;\n this.renderH = box.availH;\n this.offsetX = box.left;\n this.offsetY = box.top;\n } else if (this.layout === 'square') {\n const S = Math.min(W, H);\n this.renderW = S;\n this.renderH = S;\n this.offsetX = (W - S) / 2;\n this.offsetY = (H - S) / 2;\n } else {\n this.renderW = W;\n this.renderH = H;\n this.offsetX = 0;\n this.offsetY = 0;\n }\n this.CX = this.offsetX + this.renderW * ThreeRatioConfig.PROJ.cx;\n this.CY = this.offsetY + this.renderH * ThreeRatioConfig.PROJ.cy;\n }\n\n /**\n * 核心投影函数:将 0-1 坐标系的 3D 点映射为 2D 屏幕画布坐标\n * 逻辑:平移中心 -> 执行绕 X, Y 轴旋转矩阵 -> 应用视场角(FOV)进行透视缩放 -> 映射至屏幕中心\n */\n proj(dx, dy, dz) {\n const cx = dx - 0.5,\n cy = dy - 0.5,\n cz = dz - 0.5;\n const RX = (this.cam.rotX * Math.PI) / 180,\n RY = (this.cam.rotY * Math.PI) / 180;\n const cosX = Math.cos(RX),\n sinX = Math.sin(RX);\n const cosY = Math.cos(RY),\n sinY = Math.sin(RY);\n // 旋转变换\n const x1 = cx * cosY + cy * sinY,\n z1 = -cx * sinY + cy * cosY;\n const y1 = cz * cosX - z1 * sinX,\n z2 = cz * sinX + z1 * cosX;\n // 透视缩放 (基于渲染区域的较小边)\n const sc = Math.min(this.renderW, this.renderH) * ThreeRatioConfig.PROJ.scaleK * this.cam.zoomFactor;\n const fov = ThreeRatioConfig.PROJ.fov,\n pz = z2 + fov;\n return {\n x: this.CX + (x1 / pz) * sc * fov,\n y: this.CY - (y1 / pz) * sc * fov,\n depth: z2,\n };\n }\n\n /** 判断法向量是否背向相机 (Backface Culling) */\n isBackface(nx, ny, nz) {\n const RX = (this.cam.rotX * Math.PI) / 180,\n RY = (this.cam.rotY * Math.PI) / 180;\n const cosX = Math.cos(RX), sinX = Math.sin(RX);\n const cosY = Math.cos(RY), sinY = Math.sin(RY);\n\n // 应用相同的旋转矩阵\n const x1 = nx * cosY + ny * sinY;\n const z1 = -nx * sinY + ny * cosY;\n const y1 = nz * cosX - z1 * sinX;\n const z2 = nz * sinX + z1 * cosX;\n\n return z2 > 0; // z正方向是朝向屏幕内部(远离相机)\n }\n\n /**\n * 渲染主循环\n * @param {Object} cam 相机状态对象\n * @param {Array} points 样本点数组\n * @param {string} view 当前视图 ID ('3d', 'xz' 等)\n * @param {number} flat 扁平化程度 (0-1), 用于 3D 转换 2D 平面的视觉过度\n */\n draw(cam, points, view, flat) {\n const ctx = this.ctx;\n const dpr = window.devicePixelRatio || 1;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, this.W, this.H);\n this.cam = cam;\n const fadeTarget = this.opts.plane2D?.fade3DAlpha ?? 0.03;\n const d3a = 1 - flat * (1 - fadeTarget); // 3D 元素的整体透明度过渡\n\n ctx.globalAlpha = d3a;\n this.drawWalls(d3a); // 绘制底/侧面背景\n this.drawGrid(d3a); // 绘制网格辅助线\n this.drawZones(d3a); // 绘制诊断区域\n this.drawAxes(d3a); // 绘制坐标轴\n this.drawTickLabels(d3a); // 绘制刻度数值\n\n // 样本点渲染(按深度排序以解决 Z-fighting 问题)\n const pts = Array.isArray(points) ? points : [];\n [...pts]\n .sort(\n (a, b) =>\n this.proj(DGAScale.realToU(a.position.x), DGAScale.realToU(a.position.y), DGAScale.realToU(a.position.z)).depth -\n this.proj(DGAScale.realToU(b.position.x), DGAScale.realToU(b.position.y), DGAScale.realToU(b.position.z)).depth\n )\n .forEach((p) => this.drawPoint3D(p, d3a));\n\n ctx.globalAlpha = 1;\n // 如果处于 2D 视图状态,且开启了 plane2D 显示,则叠加 2D 专业投影层\n if (flat > 0 && this.opts.plane2D.show) this.draw2DOverlay(view, flat, pts);\n }\n\n // 基础绘制\n face(pts4, fill, stroke) {\n const ctx = this.ctx,\n pp = pts4.map((c) => this.proj(...c));\n ctx.beginPath();\n ctx.moveTo(pp[0].x, pp[0].y);\n for (let i = 1; i < pp.length; i++) ctx.lineTo(pp[i].x, pp[i].y);\n ctx.closePath();\n if (fill) {\n ctx.fillStyle = fill;\n ctx.fill();\n }\n if (stroke) {\n ctx.strokeStyle = stroke;\n ctx.lineWidth = 0.8;\n ctx.stroke();\n }\n }\n\n line(a, b) {\n const ctx = this.ctx;\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n ctx.stroke();\n }\n\n box(x0, x1, y0, y1, z0, z1, fill, edge) {\n const faces = [\n { f: [[x0, y0, z0], [x1, y0, z0], [x1, y1, z0], [x0, y1, z0]], n: [0, 0, -1] },\n { f: [[x0, y0, z1], [x1, y0, z1], [x1, y1, z1], [x0, y1, z1]], n: [0, 0, 1] },\n { f: [[x0, y0, z0], [x1, y0, z0], [x1, y0, z1], [x0, y0, z1]], n: [0, -1, 0] },\n { f: [[x0, y1, z0], [x1, y1, z0], [x1, y1, z1], [x0, y1, z1]], n: [0, 1, 0] },\n { f: [[x0, y0, z0], [x0, y1, z0], [x0, y1, z1], [x0, y0, z1]], n: [-1, 0, 0] },\n { f: [[x1, y0, z0], [x1, y1, z0], [x1, y1, z1], [x1, y0, z1]], n: [1, 0, 0] },\n ];\n\n faces\n .filter(({ n }) => !this.isBackface(n[0], n[1], n[2]))\n .map(({ f }) => ({\n f,\n d: f.reduce((s, c) => s + this.proj(...c).depth, 0) / f.length,\n }))\n .sort((a, b) => a.d - b.d)\n .forEach(({ f }) => this.face(f, fill, edge));\n }\n\n drawWalls(d3a = 1) {\n const ctx = this.ctx;\n const wallOpt = this.opts.wall;\n if (!wallOpt.show) return;\n\n const ax = this.opts.axis.data;\n const tv = ThreeRatioConfig.TICKS.vals;\n\n const walls = [\n { // X-Z 面 (底层底面通常认为是 z=0 或 y=0)\n pts: [[0, 0, 0], [1, 0, 0], [1, 0, 1], [0, 0, 1]],\n color: wallOpt.fill.colors.xz || ax.x.color,\n segs: (t) => [[this.proj(t, 0, 0), this.proj(t, 0, 1)], [this.proj(0, 0, t), this.proj(1, 0, t)]],\n gridColor: ax.x.color\n },\n { // Y-Z 面\n pts: [[0, 0, 0], [0, 1, 0], [0, 1, 1], [0, 0, 1]],\n color: wallOpt.fill.colors.yz || ax.y.color,\n segs: (t) => [[this.proj(0, t, 0), this.proj(0, t, 1)], [this.proj(0, 0, t), this.proj(0, 1, t)]],\n gridColor: ax.y.color\n },\n { // X-Y 面\n pts: [[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]],\n color: wallOpt.fill.colors.xy || ax.z.color,\n segs: (t) => [[this.proj(t, 0, 0), this.proj(t, 1, 0)], [this.proj(0, t, 0), this.proj(1, t, 0)]],\n gridColor: ax.z.color\n },\n ];\n\n // 绘制墙面填充\n if (wallOpt.fill.show) {\n ctx.globalAlpha = wallOpt.fill.alpha * d3a;\n walls.forEach((w) => this.face(w.pts, w.color));\n ctx.globalAlpha = d3a;\n }\n\n // 绘制墙面网格\n if (wallOpt.grid.show) {\n ctx.lineWidth = wallOpt.grid.lineStyle.lineWidth;\n ctx.globalAlpha = wallOpt.grid.lineStyle.alpha * d3a;\n // 简单支持 dashed\n if (wallOpt.grid.lineStyle.type === 'dashed') ctx.setLineDash([4, 4]);\n else if (wallOpt.grid.lineStyle.type === 'dotted') ctx.setLineDash([2, 2]);\n else ctx.setLineDash([]);\n\n walls.forEach(({ gridColor, segs }) => {\n ctx.strokeStyle = gridColor;\n tv.forEach((t) => segs(t).forEach(([a, b]) => this.line(a, b)));\n });\n ctx.setLineDash([]);\n ctx.globalAlpha = d3a;\n }\n\n // 绘制墙面边框\n if (wallOpt.border.show) {\n ctx.lineWidth = wallOpt.border.lineStyle.lineWidth;\n ctx.globalAlpha = wallOpt.border.lineStyle.alpha * d3a;\n if (wallOpt.border.lineStyle.type === 'dashed') ctx.setLineDash([4, 4]);\n else if (wallOpt.border.lineStyle.type === 'dotted') ctx.setLineDash([2, 2]);\n else ctx.setLineDash([]);\n\n walls.forEach(({ pts, gridColor }) => {\n ctx.strokeStyle = gridColor;\n pts.forEach((p, i) => this.line(this.proj(...p), this.proj(...pts[(i + 1) % pts.length])));\n });\n ctx.setLineDash([]);\n ctx.globalAlpha = d3a;\n }\n }\n\n drawGrid(d3a = 1) {\n const ctx = this.ctx;\n ctx.globalAlpha = d3a;\n ctx.strokeStyle = this.theme.outerGrid;\n ctx.lineWidth = 0.4;\n ThreeRatioConfig.TICKS.vals.forEach((t) => {\n this.line(this.proj(1, t, 0), this.proj(1, t, 1));\n this.line(this.proj(1, 0, t), this.proj(1, 1, t));\n });\n }\n\n drawZones(d3a) {\n const ctx = this.ctx,\n vis = ThreeRatioConfig.ZONE_VIS;\n [...this.zone]\n .sort(\n (a, b) =>\n this.proj((a.x0 + a.x1) / 2, (a.y0 + a.y1) / 2, (a.z0 + a.z1) / 2).depth -\n this.proj((b.x0 + b.x1) / 2, (b.y0 + b.y1) / 2, (b.z0 + b.z1) / 2).depth\n )\n .forEach((z) => {\n ctx.globalAlpha = d3a;\n const fA = z.fillAlpha !== undefined ? z.fillAlpha : vis.fillAlpha;\n this.box(z.x0, z.x1, z.y0, z.y1, z.z0, z.z1, z.fillBase + fA + ')', z.edgeStr);\n if (d3a > 0.05) {\n ctx.globalAlpha = d3a * vis.labelAlpha;\n const pp = this.proj((z.x0 + z.x1) / 2, (z.y0 + z.y1) / 2, (z.z0 + z.z1) / 2);\n ctx.font = z.labelFontStr || this.getFont('zone');\n ctx.textAlign = 'center';\n ctx.fillStyle = z.labelColor;\n ctx.fillText(z.name, pp.x, pp.y);\n }\n ctx.globalAlpha = d3a;\n });\n }\n\n drawAxes(d3a = 1) {\n const ctx = this.ctx;\n ctx.globalAlpha = d3a;\n const axisOpt = this.opts.axis;\n if (!axisOpt.show) return;\n\n [\n { from: [0, 0, 0], to: [1.18, 0, 0], lp: [1.22, 0, 0], ...axisOpt.data.x },\n { from: [0, 0, 0], to: [0, 1.18, 0], lp: [0, 1.22, 0], ...axisOpt.data.y },\n { from: [0, 0, 0], to: [0, 0, 1.22], lp: [0, 0, 1.28], ...axisOpt.data.z },\n ].forEach((ax) => {\n const f = this.proj(...ax.from),\n t = this.proj(...ax.to);\n ctx.beginPath();\n ctx.moveTo(f.x, f.y);\n ctx.lineTo(t.x, t.y);\n ctx.strokeStyle = ax.color;\n ctx.lineWidth = axisOpt.lineStyle.lineWidth;\n ctx.stroke();\n\n if (axisOpt.lineStyle.arrowSize > 0) {\n const dx = t.x - f.x,\n dy = t.y - f.y,\n len = Math.hypot(dx, dy) || 1,\n ux = dx / len,\n uy = dy / len,\n as = axisOpt.lineStyle.arrowSize;\n ctx.beginPath();\n ctx.moveTo(t.x, t.y);\n ctx.lineTo(t.x - ux * as + uy * (as / 2.25), t.y - uy * as - ux * (as / 2.25));\n ctx.lineTo(t.x - ux * as - uy * (as / 2.25), t.y - uy * as + ux * (as / 2.25));\n ctx.closePath();\n ctx.fillStyle = ax.color;\n ctx.fill();\n }\n\n if (axisOpt.labelStyle.show) {\n // Adjust endpoint for distance\n const dx = t.x - f.x, dy = t.y - f.y;\n const len = Math.hypot(dx, dy) || 1;\n const lx = t.x + (dx / len) * axisOpt.labelStyle.distance;\n const ly = t.y + (dy / len) * axisOpt.labelStyle.distance;\n\n ctx.fillStyle = ax.color;\n ctx.font = `${axisOpt.labelStyle.fontWeight} ${axisOpt.labelStyle.fontSize}px ${this.opts.textStyle?.fontFamily || ThreeRatioConfig.TEXT_STYLE.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(ax.name, lx, ly);\n }\n });\n }\n\n drawTickLabels(d3a = 1) {\n const ctx = this.ctx;\n ctx.globalAlpha = d3a;\n const { vals, labels } = ThreeRatioConfig.TICKS,\n ta = this.theme.tickAlpha;\n ctx.font = this.getFont('tick');\n vals.forEach((t, i) => {\n let p = this.proj(t, 0, 0);\n ctx.fillStyle = ThreeRatioConfig.AXES.x.color + ta;\n ctx.textAlign = 'center';\n ctx.fillText(labels[i], p.x, p.y + 13);\n p = this.proj(0, t, 0);\n ctx.fillStyle = ThreeRatioConfig.AXES.y.color + ta;\n ctx.textAlign = 'left';\n ctx.fillText(labels[i], p.x + 7, p.y + 4);\n p = this.proj(0, 0, t);\n ctx.fillStyle = ThreeRatioConfig.AXES.z.color + ta;\n ctx.textAlign = 'right';\n ctx.fillText(labels[i], p.x - 7, p.y + 4);\n });\n ctx.textAlign = 'center';\n }\n\n drawPoint3D(p, alpha) {\n const ux = DGAScale.realToU(p.position.x),\n uy = DGAScale.realToU(p.position.y),\n uz = DGAScale.realToU(p.position.z);\n this.drawPointAt(this.proj(ux, uy, uz), p, alpha);\n }\n\n drawPointAt(pos, p, alpha = 1) {\n const ctx = this.ctx,\n pv = ThreeRatioConfig.POINT;\n const px = pos.x ?? pos.cx,\n py = pos.y ?? pos.cy;\n\n const r = p.itemStyle?.radius ?? pv.defaultSize;\n const c = p.itemStyle?.color ?? p.color;\n const lbl = p.name;\n const textStyle = p.textStyle || {};\n const hasGlowStyle = p.glowStyle !== undefined;\n const glowStyle = p.glowStyle || {};\n\n if (hasGlowStyle && glowStyle.show !== false) {\n let glowColors = [];\n let layers = 3;\n let dist = glowStyle.glowDistance !== undefined ? glowStyle.glowDistance : 4;\n const baseColor = glowStyle.color ?? c;\n\n if (Array.isArray(glowStyle.colors) && glowStyle.colors.length > 0) {\n glowColors = glowStyle.colors;\n layers = glowColors.length;\n } else {\n const startColor = glowStyle.startColor || colorToRgba(baseColor, 0.15);\n const endColor = glowStyle.endColor || 'transparent';\n layers = glowStyle.count !== undefined ? parseInt(glowStyle.count, 10) : 3;\n glowColors = [];\n for (let i = 0; i < layers; i++) {\n const factor = layers > 1 ? i / (layers - 1) : 0;\n glowColors.push(interpolateColor(startColor, endColor, factor));\n }\n }\n\n for (let i = layers - 1; i >= 0; i--) {\n const glowColor = glowColors[i];\n ctx.save();\n ctx.fillStyle = glowColor;\n ctx.beginPath();\n ctx.arc(px, py, r + (i + 1) * dist, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n }\n }\n\n ctx.globalAlpha = alpha;\n ctx.beginPath();\n ctx.arc(px, py, r, 0, Math.PI * 2);\n const g = ctx.createRadialGradient(px - r * pv.hlOffset, py - r * pv.hlOffset, 1, px, py, r);\n g.addColorStop(0, 'rgba(255,255,255,0.9)');\n g.addColorStop(0.4, c + 'ee');\n g.addColorStop(1, c + '88');\n ctx.fillStyle = g;\n ctx.fill();\n ctx.strokeStyle = this.theme.pointStroke;\n ctx.lineWidth = 1.3;\n ctx.stroke();\n ctx.restore();\n\n if (lbl) {\n ctx.font = textStyle.bold\n ? `bold ${textStyle.fontSize || 12}px ${textStyle.fontFamily || 'sans-serif'}`\n : `${textStyle.fontSize || 12}px ${textStyle.fontFamily || 'sans-serif'}`;\n ctx.fillStyle = textStyle.color ?? p.color;\n ctx.textAlign = 'left';\n ctx.fillText(lbl, px + r + 3, py - 2);\n }\n }\n\n draw2DOverlay(view, alpha, points) {\n const plane = ThreeRatioConfig.PLANES[view];\n if (!plane) return;\n const ctx = this.ctx,\n th = this.theme,\n opt2d = this.opts.plane2D,\n axOpt = this.opts.axis.data;\n\n ctx.save();\n ctx.globalAlpha = alpha;\n\n // 废弃绝对的 PAD2D,但若未开启自定义网格边距,为了防止2D文字被裁切,需要给予一个默认的边界保护\n let left = this.offsetX,\n top = this.offsetY,\n right = this.offsetX + this.renderW,\n bottom = this.offsetY + this.renderH;\n\n const grid = this.opts.grid || {};\n const hasGridMargin = grid.left !== undefined || grid.right !== undefined || grid.top !== undefined || grid.bottom !== undefined;\n if (!hasGridMargin) {\n const pad = ThreeRatioConfig.PAD2D || { l: 70, r: 30, t: 50, b: 60 };\n left = pad.l;\n top = pad.t;\n right = this.W - pad.r;\n bottom = this.H - pad.b;\n }\n\n // 强制将 2D 投影区域转换为居中的正方形\n const availW = right - left;\n const availH = bottom - top;\n const sqSize = Math.min(availW, availH);\n const cx = left + availW / 2;\n const cy = top + availH / 2;\n left = cx - sqSize / 2;\n right = cx + sqSize / 2;\n top = cy - sqSize / 2;\n bottom = cy + sqSize / 2;\n\n const { vals, labels } = ThreeRatioConfig.TICKS;\n const u2c = (h, v) => ({\n cx: left + h * (right - left),\n cy: bottom - v * (bottom - top),\n });\n const themeName = this.themeName ?? 'dark';\n\n // 绘制背景\n if (opt2d.grid.show) {\n ctx.fillStyle = opt2d.grid.backgroundColor ?? (plane.bgColor[themeName] ?? plane.bgColor.dark);\n ctx.fillRect(left, top, right - left, bottom - top);\n }\n\n // 绘制区域 (Zones)\n if (opt2d.zone.show) {\n this.zone.forEach((z) => {\n const [h0, h1] = [z[plane.hAxis + '0'], z[plane.hAxis + '1']];\n const [v0, v1] = [z[plane.vAxis + '0'], z[plane.vAxis + '1']];\n const p0 = u2c(h0, v0),\n p1 = u2c(h1, v1),\n pw = p1.cx - p0.cx,\n ph = p0.cy - p1.cy;\n\n const fA = z.fillAlpha !== undefined ? z.fillAlpha : opt2d.zone.alpha;\n ctx.fillStyle = z.fillBase + fA + ')';\n ctx.fillRect(p0.cx, p1.cy, pw, ph);\n\n if (opt2d.zone.borderStyle.show) {\n ctx.strokeStyle = z.edgeStr;\n ctx.lineWidth = opt2d.zone.borderStyle.width ?? 1.4;\n ctx.strokeRect(p0.cx, p1.cy, pw, ph);\n }\n\n const mx = (p0.cx + p1.cx) / 2,\n my = (p0.cy + p1.cy) / 2;\n ctx.font = z.labelFontStr || this.getFont('zone');\n ctx.textAlign = 'center';\n ctx.fillStyle = z.labelColor;\n \n // 支持 formatter 回调\n const globalLabelStyle = this.opts.zone?.labelStyle || {};\n const text = typeof globalLabelStyle.formatter === 'function' ? globalLabelStyle.formatter(z) : z.name;\n \n ctx.fillText(text, mx, my + 4);\n });\n }\n\n // 绘制网格线 (Grid)\n if (opt2d.grid.show) {\n ctx.strokeStyle = opt2d.grid.lineStyle.color || th.plane2dGrid;\n ctx.lineWidth = opt2d.grid.lineStyle.lineWidth;\n ctx.globalAlpha = alpha * opt2d.grid.lineStyle.alpha;\n\n if (opt2d.grid.lineStyle.type === 'dashed') ctx.setLineDash([4, 4]);\n else if (opt2d.grid.lineStyle.type === 'dotted') ctx.setLineDash([2, 2]);\n else ctx.setLineDash([]);\n\n vals.forEach((v) => {\n const ph = u2c(v, 0).cx,\n pv = u2c(0, v).cy;\n ctx.beginPath();\n ctx.moveTo(ph, top);\n ctx.lineTo(ph, bottom);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(left, pv);\n ctx.lineTo(right, pv);\n ctx.stroke();\n });\n ctx.setLineDash([]);\n ctx.globalAlpha = alpha;\n }\n\n // 绘制坐标轴 (Axis)\n if (opt2d.axis.show) {\n const hColor = axOpt[plane.hAxis].color;\n const vColor = axOpt[plane.vAxis].color;\n\n ctx.lineWidth = opt2d.axis.lineStyle.lineWidth;\n ctx.globalAlpha = alpha * opt2d.axis.lineStyle.alpha;\n\n // 横轴\n ctx.strokeStyle = hColor;\n ctx.beginPath();\n ctx.moveTo(left, bottom);\n ctx.lineTo(right + 10, bottom); // arrow extra\n ctx.stroke();\n\n // 纵轴\n ctx.strokeStyle = vColor;\n ctx.beginPath();\n ctx.moveTo(left, bottom);\n ctx.lineTo(left, top - 10); // arrow extra\n ctx.stroke();\n\n ctx.globalAlpha = alpha;\n const fontFam = this.opts.textStyle?.fontFamily || ThreeRatioConfig.TEXT_STYLE.fontFamily;\n\n // 刻度数值\n if (opt2d.axis.tickLabelStyle.show) {\n ctx.font = `${opt2d.axis.tickLabelStyle.fontSize}px ${fontFam}`;\n const dist = opt2d.axis.tickLabelStyle.distance;\n vals.forEach((v, i) => {\n ctx.fillStyle = hColor;\n ctx.textAlign = 'center';\n ctx.fillText(labels[i], u2c(v, 0).cx, bottom + dist + opt2d.axis.tickLabelStyle.fontSize / 2);\n ctx.fillStyle = vColor;\n ctx.textAlign = 'right';\n ctx.fillText(labels[i], left - dist + 2, u2c(0, v).cy + opt2d.axis.tickLabelStyle.fontSize / 3);\n });\n }\n\n // 轴标签\n if (opt2d.axis.labelStyle.show) {\n ctx.font = `bold ${opt2d.axis.labelStyle.fontSize}px ${fontFam}`;\n const dist = opt2d.axis.labelStyle.distance;\n\n ctx.textAlign = 'center';\n ctx.fillStyle = hColor;\n ctx.fillText(axOpt[plane.hAxis].name, (left + right) / 2, bottom + dist + opt2d.axis.labelStyle.fontSize);\n\n ctx.save();\n ctx.translate(left - dist - opt2d.axis.labelStyle.fontSize, (top + bottom) / 2);\n ctx.rotate(-Math.PI / 2);\n ctx.fillStyle = vColor;\n ctx.fillText(axOpt[plane.vAxis].name, 0, 0);\n ctx.restore();\n }\n }\n\n // 绘制散点\n points.forEach((p) => {\n const pos = u2c(DGAScale.realToU(p.position[plane.hAxis]), DGAScale.realToU(p.position[plane.vAxis]));\n this.drawPointAt(pos, p, alpha);\n });\n\n ctx.restore();\n }\n}\n\n/**\n * ThreeRatioChart: 顶层组件类\n * 负责业务状态管理、DOM 构建、动画控制及事件分发\n */\nexport class ThreeRatioChart {\n static VIEWS = {\n '3d': { rotX: () => ThreeRatioConfig.CAM.elev, rotY: () => ThreeRatioConfig.CAM.yaw },\n xz: { rotX: 0, rotY: 0 },\n yz: { rotX: 0, rotY: 90 },\n xy: { rotX: 90, rotY: 0 },\n };\n\n /**\n * 构造函数\n * @param {string|HTMLElement} container 容器选择器或元素\n * @param {Object} opts 配置项\n * @param {string} opts.initialView 初始视角 (默认 '3d')\n * @param {string} opts.theme 初始主题 ('dark' | 'light')\n */\n constructor(container, opts = {}) {\n this.series = [];\n this.opts = opts;\n this.cam = {\n rotX: ThreeRatioConfig.CAM.elev,\n rotY: ThreeRatioConfig.CAM.yaw,\n zoomFactor: 1.0,\n };\n this.view = opts.initialView ?? '3d';\n this.layout = opts.layout ?? 'fill';\n this.drag = { active: false, lastX: 0, lastY: 0 };\n this.tween = {\n from: { rotX: 0, rotY: 0 },\n to: { rotX: 0, rotY: 0 },\n t: 1,\n };\n this.animId = null;\n this.pinchDist = null;\n this._bus = new EventBus();\n\n container = typeof container === 'string' ? document.querySelector(container) : container;\n if (!container) throw new Error('ThreeRatioChart: container not found');\n this.buildDOM(container);\n\n this.renderer = new Renderer3D(this.ctx, this.W, this.H, opts);\n this.bindEvents();\n this.applyView();\n this.render();\n }\n\n\n\n /**\n * 设置图表配置(主要用于更新数据或视角)\n * @param {Object} opt\n */\n setOption(opt) {\n if (!opt) return;\n this.opts = { ...this.opts, ...opt };\n if (opt.zone || opt.textStyle || opt.theme || opt.wallColors || opt.layout !== undefined || opt.grid !== undefined || opt.axis !== undefined || opt.wall !== undefined || opt.plane2D !== undefined) {\n this.renderer.updateOptions({\n zone: this.opts.zone,\n textStyle: this.opts.textStyle,\n theme: this.opts.theme,\n wallColors: this.opts.wallColors,\n layout: this.opts.layout,\n grid: this.opts.grid,\n axis: this.opts.axis,\n wall: this.opts.wall,\n plane2D: this.opts.plane2D,\n });\n }\n if (opt.series !== undefined) {\n const arr = Array.isArray(opt.series) ? opt.series : [opt.series];\n this.series = arr.map((p) => ({\n name: p.name ?? '',\n color: p.color ?? ThreeRatioConfig.POINT.defaultColor,\n itemStyle: p.itemStyle ?? {},\n textStyle: p.textStyle ?? {},\n glowStyle: p.glowStyle,\n position: p.position ?? { x: 0, y: 0, z: 0 },\n }));\n this.emit('dataChange', [...this.series]);\n this.render();\n }\n if (opt.view && opt.view !== this.view) this.setView(opt.view);\n return this;\n }\n\n setSeries(series) {\n return this.setOption({ series });\n }\n\n /**\n * 切换视图角度(包含平滑补间动画)\n * @param {string} v 视图 ID\n */\n setView(v) {\n if (!ThreeRatioChart.VIEWS[v]) return;\n this.view = v;\n cancelAnimationFrame(this.animId);\n const tgt = this.getViewTarget(v);\n this.tween = {\n from: { rotX: this.cam.rotX, rotY: this.cam.rotY },\n to: tgt,\n t: 0,\n };\n this.cv.style.cursor = v === '3d' ? 'grab' : 'default';\n this.runTween();\n this._bus.emit('viewChange', v);\n }\n\n /** 切换主题渲染 */\n setTheme(name) {\n this.renderer.setTheme(name);\n this.render();\n }\n\n /**\n * 诊断逻辑:根据输入的三比值 X, Y, Z 判断所属故障区域\n * @returns {Array} 匹配到的诊断区域信息数组\n */\n diagnose(x, y, z) {\n if (!this.renderer) return [{ ...(this.opts.unknown ?? ThreeRatioConfig.UNKNOWN) }];\n const hits = this.renderer.zone\n .filter((r) => {\n if (!r.coordinates || r.coordinates.length < 2) return false;\n const p1 = r.coordinates[0];\n const p2 = r.coordinates[1];\n return x >= p1[0] && x < p2[0] && y >= p1[1] && y < p2[1] && z >= p1[2] && z < p2[2];\n })\n .map((r) => ({ name: r.name, title: r.title, color: r.color || '#fff' }));\n return hits.length ? hits : [{ ...(this.opts.unknown ?? ThreeRatioConfig.UNKNOWN) }];\n }\n\n on(event, handler) {\n this._bus.on(event, handler);\n return this;\n }\n\n off(event, handler) {\n this._bus.off(event, handler);\n return this;\n }\n\n emit(event, ...args) {\n this._bus.emit(event, ...args);\n }\n\n render() {\n if (!this.renderer || !this.ctx) return;\n this.renderer.draw(this.cam, this.series, this.view, this.flatness());\n \n // 渲染完成后触发 diagnose 事件,与 Pentagon/Etra/Triangle 统一\n const results = [];\n this.series.forEach((s) => {\n if (s.position) {\n const zone = this.diagnose(s.position.x, s.position.y, s.position.z);\n results.push({\n series: s,\n zone: zone.length ? zone[0] : null,\n position: s.position\n });\n }\n });\n if (results.length > 0) {\n this._bus.emit('diagnose', results);\n }\n }\n\n dispose() {\n cancelAnimationFrame(this.animId);\n this.resizeObs?.disconnect();\n this.cv?.remove();\n window.removeEventListener('mousemove', this.onMouseMove);\n window.removeEventListener('mouseup', this.onMouseUp);\n this._bus?.dispose();\n }\n\n // 内部方法\n getViewTarget(v) {\n const d = ThreeRatioChart.VIEWS[v];\n return {\n rotX: typeof d.rotX === 'function' ? d.rotX() : d.rotX,\n rotY: typeof d.rotY === 'function' ? d.rotY() : d.rotY,\n };\n }\n\n applyView() {\n if (this.view !== '3d') {\n const t = this.getViewTarget(this.view);\n this.cam.rotX = t.rotX;\n this.cam.rotY = t.rotY;\n this.cv.style.cursor = 'default';\n }\n }\n\n flatness() {\n if (this.view === '3d') return 0;\n const t = this.getViewTarget(this.view);\n return Math.max(0, 1 - (Math.abs(this.cam.rotX - t.rotX) + Math.abs(this.cam.rotY - t.rotY)) / 30);\n }\n\n runTween() {\n this.tween.t = Math.min(1, this.tween.t + ThreeRatioConfig.TWEEN.step);\n const e = ((t) => (t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2))(this.tween.t);\n this.cam.rotX = this.tween.from.rotX + (this.tween.to.rotX - this.tween.from.rotX) * e;\n this.cam.rotY = this.tween.from.rotY + (this.tween.to.rotY - this.tween.from.rotY) * e;\n this.render();\n if (this.tween.t < 1) this.animId = requestAnimationFrame(() => this.runTween());\n }\n\n buildDOM(container) {\n const dpr = window.devicePixelRatio || 1;\n const rect = container.getBoundingClientRect();\n this.W = rect.width > 0 ? Math.round(rect.width) : 600;\n this.H = rect.height > 0 ? Math.round(rect.height) : 540;\n this.cv = document.createElement('canvas');\n this.cv.className = 'trc-canvas';\n this.cv.width = this.W * dpr;\n this.cv.height = this.H * dpr;\n this.cv.style.cssText = 'width:100%;height:100%;display:block;touch-action:none;';\n this.ctx = this.cv.getContext('2d');\n container.appendChild(this.cv);\n this.resizeObs = new ResizeObserver((entries) => {\n const { width, height } = entries[0].contentRect;\n if (width > 0 && height > 0) {\n const dpr = window.devicePixelRatio || 1;\n this.W = Math.round(width);\n this.H = Math.round(height);\n this.cv.width = this.W * dpr;\n this.cv.height = this.H * dpr;\n this.renderer?.resize(this.W, this.H);\n this.render();\n }\n });\n this.resizeObs.observe(container);\n }\n\n bindEvents() {\n const d = ThreeRatioConfig.DRAG,\n cv = this.cv;\n cv.addEventListener('mousedown', (e) => {\n if (this.view !== '3d') return;\n this.drag = { active: true, lastX: e.clientX, lastY: e.clientY };\n cv.style.cursor = 'grabbing';\n cancelAnimationFrame(this.animId);\n });\n this.onMouseMove = (e) => {\n if (!this.drag.active || this.view !== '3d') return;\n this.cam.rotY += (e.clientX - this.drag.lastX) * d.rotYSens;\n this.cam.rotX = Math.max(\n d.rotXMin,\n Math.min(d.rotXMax, this.cam.rotX + (e.clientY - this.drag.lastY) * d.rotXSens)\n );\n this.drag.lastX = e.clientX;\n this.drag.lastY = e.clientY;\n this.render();\n };\n this.onMouseUp = () => {\n this.drag.active = false;\n if (this.view === '3d') cv.style.cursor = 'grab';\n };\n window.addEventListener('mousemove', this.onMouseMove);\n window.addEventListener('mouseup', this.onMouseUp);\n cv.addEventListener(\n 'touchstart',\n (e) => {\n if (this.view !== '3d') return;\n this.drag = {\n active: true,\n lastX: e.touches[0].clientX,\n lastY: e.touches[0].clientY,\n };\n if (e.touches.length === 2)\n this.pinchDist = Math.hypot(\n e.touches[0].clientX - e.touches[1].clientX,\n e.touches[0].clientY - e.touches[1].clientY\n );\n },\n { passive: true }\n );\n cv.addEventListener(\n 'touchmove',\n (e) => {\n if (this.view !== '3d') return;\n if (e.touches.length === 2 && this.pinchDist !== null) {\n const dist = Math.hypot(\n e.touches[0].clientX - e.touches[1].clientX,\n e.touches[0].clientY - e.touches[1].clientY\n );\n this.cam.zoomFactor = Math.max(\n d.zoomMin,\n Math.min(d.zoomMax, (this.cam.zoomFactor * dist) / this.pinchDist)\n );\n this.pinchDist = dist;\n this.render();\n } else if (this.drag.active && e.touches.length === 1) {\n this.cam.rotY += (e.touches[0].clientX - this.drag.lastX) * d.rotYSens;\n this.cam.rotX = Math.max(\n d.rotXMin,\n Math.min(d.rotXMax, this.cam.rotX + (e.touches[0].clientY - this.drag.lastY) * d.rotXSens)\n );\n this.drag.lastX = e.touches[0].clientX;\n this.drag.lastY = e.touches[0].clientY;\n this.render();\n }\n },\n { passive: true }\n );\n cv.addEventListener(\n 'touchend',\n (e) => {\n if (e.touches.length < 2) this.pinchDist = null;\n if (e.touches.length === 0) this.drag.active = false;\n },\n { passive: true }\n );\n cv.addEventListener(\n 'wheel',\n (e) => {\n if (this.view !== '3d') return;\n e.preventDefault();\n this.cam.zoomFactor = Math.max(\n d.zoomMin,\n Math.min(d.zoomMax, this.cam.zoomFactor * (e.deltaY > 0 ? d.zoomOut : d.zoomIn))\n );\n this.render();\n },\n { passive: false }\n );\n }\n}\n\nfunction parseRgba(color) {\n const cleaned = color.trim().toLowerCase();\n if (cleaned.startsWith('#')) {\n let hex = cleaned.slice(1);\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n const a = hex.length === 8 ? parseInt(hex.substring(6, 8), 16) / 255 : 1;\n return [r, g, b, a];\n }\n const m = cleaned.match(/rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\)/);\n if (m) {\n return [\n parseInt(m[1], 10),\n parseInt(m[2], 10),\n parseInt(m[3], 10),\n m[4] !== undefined ? parseFloat(m[4]) : 1\n ];\n }\n if (cleaned === 'transparent') return [0, 0, 0, 0];\n return [255, 255, 255, 1];\n}\n\nfunction colorToRgba(color, alpha) {\n const [r, g, b, a] = parseRgba(color);\n return `rgba(${r},${g},${b},${alpha !== undefined ? alpha : a})`;\n}\n\nfunction interpolateColor(c1, c2, factor) {\n const [r1, g1, b1, a1] = parseRgba(c1);\n const [r2, g2, b2, a2] = parseRgba(c2);\n const r = Math.round(r1 + (r2 - r1) * factor);\n const g = Math.round(g1 + (g2 - g1) * factor);\n const b = Math.round(b1 + (b2 - b1) * factor);\n const a = a1 + (a2 - a1) * factor;\n return `rgba(${r},${g},${b},${a})`;\n}\n","/**\n * DGA 平面多边形类 (ETRA Chart)\n * 二维平面坐标系区域判定及渲染图表组件,通过对数缩放支持不同范围数据的展示。\n */\nimport { inPoly, hexToRgba, deepMerge, EventBus, ZoomController, DOMTooltip, parseGridBox, drawShapePath, DEFAULT_COLORS } from './utils.js';\nimport { ETRA_ZONES_A } from './zones.js';\n\n/** 将颜色转换为带有透明度的 RGBA 格式 */\nfunction colorToRgba(color, alpha) {\n if (!color) return `rgba(0,0,0,${alpha})`;\n if (color.startsWith('#')) return hexToRgba(color, alpha);\n if (color.startsWith('rgb')) {\n return color.replace(/rgb(a)?\\(([^)]+)\\)/, (m, a, content) => {\n const parts = content.split(',');\n const r = parts[0].trim();\n const g = parts[1].trim();\n const b = parts[2].trim();\n return `rgba(${r},${g},${b},${alpha})`;\n });\n }\n return color;\n}\n\n/** 图表默认配置项 */\nconst DEFAULTS = {\n colors: DEFAULT_COLORS,\n theme: 'light',\n backgroundColor: 'transparent',\n grid: {\n left: 72, right: 20, top: 20, bottom: 56,\n lineStyle: { type: 'solid', width: 0.4, color: null },\n majorLineStyle: { type: 'solid', width: 0.8, color: null }\n },\n zone: {\n data: ETRA_ZONES_A,\n alpha: 0.75,\n labelStyle: { show: true, fontSize: 12, borderRadius: 4 },\n borderStyle: { show: true, stroke: 1, type: 'solid', color: null }\n },\n xAxis: {\n title: '',\n min: -2, max: 3, // 以10为底的对数范围 (例如 -2 表示 10^-2 = 0.01)\n labelStyle: { fontSize: 11, fontWeight: 'normal', offsetX: 0, offsetY: 0, color: null, scientific: true, formatter: null },\n lineStyle: { show: true, stroke: 1.5, type: 'solid', color: null },\n titleStyle: { fontSize: 13, color: null, fontWeight: 'normal', align: 'center', offsetX: 0, offsetY: 0 }\n },\n yAxis: {\n title: '',\n min: -3, max: 3, // 以10为底的对数范围\n labelStyle: { fontSize: 11, fontWeight: 'normal', offsetX: 0, offsetY: 0, color: null, scientific: true, formatter: null },\n lineStyle: { show: true, stroke: 1.5, type: 'solid', color: null },\n titleStyle: { fontSize: 13, color: null, fontWeight: 'normal', align: 'center', offsetX: 0, offsetY: 0 }\n },\n tooltip: { show: true, formatter: null },\n series: []\n};\n\n/** 主题颜色配置 (浅色/深色) */\nconst THEME = {\n light: {\n backgroundColor: '#ffffff',\n text: '#333333',\n textSecondary: '#666666',\n gridLine: 'rgba(0,0,0,0.12)',\n gridLineMajor: 'rgba(0,0,0,0.22)',\n axisLine: 'rgba(0,0,0,0.5)',\n zoneBorder: 'rgba(0,0,0,0.35)',\n zoneLabelBg: 'rgba(255,255,255,0.75)',\n tooltipBg: 'rgba(255,255,255,0.95)',\n tooltipBorder: 'rgba(0,0,0,0.15)',\n tooltipTextColor: '#222222'\n },\n dark: {\n backgroundColor: '#1a1a2e',\n text: 'rgba(255,255,255,0.85)',\n textSecondary: 'rgba(255,255,255,0.5)',\n gridLine: 'rgba(255,255,255,0.08)',\n gridLineMajor: 'rgba(255,255,255,0.18)',\n axisLine: 'rgba(255,255,255,0.55)',\n zoneBorder: 'rgba(255,255,255,0.3)',\n zoneLabelBg: 'rgba(0,0,0,0.5)',\n tooltipBg: 'rgba(20,20,40,0.95)',\n tooltipBorder: 'rgba(255,255,255,0.15)',\n tooltipTextColor: 'rgba(255,255,255,0.9)'\n }\n};\n\n/** 将对数值格式化为 10 的幂次方字符串格式,例如 2 -> 10² */\nfunction fmtLog(v) {\n const e = Math.round(v);\n const sup = String(e).split('').map(c =>\n ({ '-': '⁻', '0': '⁰', '1': '¹', '2': '²', '3': '³', '4': '⁴', '5': '⁵', '6': '⁶', '7': '⁷', '8': '⁸', '9': '⁹' }[c] || c)\n ).join('');\n return '10' + sup;\n}\n\n/** ETRA 图表核心类 */\nexport class ETRAChart {\n /** 构造函数,初始化容器、合并配置并绑定事件 */\n constructor(container, option = {}) {\n if (typeof container === 'string') {\n container = document.querySelector(container);\n }\n if (!container) throw new Error('[ETRAChart] Container element not found');\n\n this._container = container;\n this._opt = deepMerge(deepMerge({}, DEFAULTS), option);\n this._bus = new EventBus();\n\n this._initDOM();\n\n // 统一组件\n this._zoom = new ZoomController(this._opt.zoom || {});\n\n this._tooltipRenderer = new DOMTooltip(this._container, this._theme);\n\n this._hoverZone = null;\n this._hoverPoint = null;\n\n // 监听容器尺寸变化\n if (typeof ResizeObserver !== 'undefined') {\n this._ro = new ResizeObserver(() => this.resize());\n this._ro.observe(this._container);\n }\n\n // 鼠标缩放和悬浮判定交互事件\n this._onWheel = (e) => {\n e.preventDefault();\n const rect = this._canvas.getBoundingClientRect();\n const ax = e.clientX - rect.left;\n const ay = e.clientY - rect.top;\n this._zoom.onWheel(e.deltaY, ax, ay);\n this._bus.emit('zoom', this._zoom.state);\n this._render();\n };\n\n this._onDown = (e) => {\n if (e.button !== 0) return;\n this._zoom.startDrag(e.clientX, e.clientY);\n this._canvas.style.cursor = 'grabbing';\n };\n\n this._onMove = (e) => {\n const rect = this._canvas.getBoundingClientRect();\n if (this._zoom.moveDrag(e.clientX, e.clientY, 1)) {\n this._render();\n return;\n }\n if (!this._coordMap || !this._drawnPoints) return;\n \n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n const { panX, panY, zoom } = this._zoom;\n const rawX = (mouseX - panX) / zoom;\n const rawY = (mouseY - panY) / zoom;\n\n let found = null;\n let minDist = Infinity;\n for (const pt of this._drawnPoints) {\n const dist = Math.hypot(rawX - pt.px, rawY - pt.py);\n const size = pt.series.size || 6;\n if (dist < size * 2 + 5 && dist < minDist) {\n minDist = dist;\n found = pt;\n }\n }\n if (found !== this._hoverPoint) {\n this._hoverPoint = found;\n this._render();\n if (found) {\n this._canvas.style.cursor = 'pointer';\n this._bus.emit('hover', found);\n } else {\n this._canvas.style.cursor = 'default';\n this._bus.emit('hover', null);\n }\n }\n };\n\n this._onUp = () => {\n if (!this._zoom.endDrag()) return;\n this._canvas.style.cursor = this._hoverPoint ? 'pointer' : 'default';\n this._bus.emit('zoom', this._zoom.state);\n };\n\n this._onLeave = () => {\n if (this._hoverPoint) {\n this._hoverPoint = null;\n this._canvas.style.cursor = 'default';\n this._render();\n this._bus.emit('hover', null);\n }\n };\n\n this._onDbl = () => {\n this._zoom.reset();\n this._bus.emit('zoom', this._zoom.state);\n this._render();\n };\n\n const cv = this._canvas;\n cv.addEventListener('wheel', this._onWheel, { passive: false });\n cv.addEventListener('mousedown', this._onDown);\n cv.addEventListener('mousemove', this._onMove);\n cv.addEventListener('mouseleave', this._onLeave);\n cv.addEventListener('dblclick', this._onDbl);\n window.addEventListener('mouseup', this._onUp);\n\n this._render();\n }\n\n /** 静态工厂方法,快速初始化图表实例 */\n static init(container, option) {\n return new ETRAChart(container, option);\n }\n\n /** 获取当前匹配的主题配置 */\n get _theme() {\n return THEME[this._opt.theme] || THEME.light;\n }\n\n /** 初始化 DOM 结构,创建内部 Canvas 画布 */\n _initDOM() {\n this._container.style.position = 'relative';\n this._container.style.overflow = 'hidden';\n\n this._canvas = document.createElement('canvas');\n this._canvas.style.display = 'block';\n this._canvas.style.width = '100%';\n this._canvas.style.height = '100%';\n this._container.appendChild(this._canvas);\n\n this._ctx = this._canvas.getContext('2d');\n }\n\n /** 设置或更新图表配置项,并触发重绘 */\n setOption(option) {\n this._opt = deepMerge(this._opt, option);\n if (option.series !== undefined) {\n this._opt.series = Array.isArray(option.series) ? option.series : [option.series];\n }\n this._coordMap = null;\n if (this._canvas && this._canvas.width > 0) this._render();\n return this;\n }\n\n /** 单独更新数据系列并重绘 */\n setSeries(series) {\n this._opt.series = Array.isArray(series) ? series : [series];\n this._render();\n return this;\n }\n\n /**\n * 诊断指定的坐标数据,返回命中的区域\n * @param {number} x - 原始或对数 X 坐标 (取决于实际的 logScale 配置)\n * @param {number} y - 原始或对数 Y 坐标\n * @returns {object|null} - 命中的故障区域对象\n */\n diagnose(x, y) {\n if (!this._opt.zone || !this._opt.zone.data) return null;\n for (const zone of this._opt.zone.data) {\n if (zone.coordinates && inPoly(x, y, zone.coordinates)) {\n return zone;\n }\n }\n return null;\n }\n\n /** 绑定事件监听器 (如 hover, zoom, diagnose) */\n on(event, handler) {\n this._bus.on(event, handler);\n return this;\n }\n\n /** 移除指定的事件监听器 */\n off(event, handler) {\n this._bus.off(event, handler);\n return this;\n }\n\n /** 强制触发图表尺寸重新计算并重绘 */\n resize() {\n this._render();\n return this;\n }\n\n /** 销毁图表实例,解绑事件清理 DOM 和内存 */\n dispose() {\n if (this._ro) this._ro.disconnect();\n this._tooltipRenderer.dispose();\n if (this._canvas && this._canvas.parentNode) {\n this._canvas.parentNode.removeChild(this._canvas);\n }\n this._bus.dispose();\n window.removeEventListener('mouseup', this._onUp);\n }\n\n /** 计算当前画布物理尺寸和图表可用绘图网格范围 */\n _dims() {\n const rect = this._container.getBoundingClientRect();\n const W = rect.width || 600;\n const H = rect.height || 400;\n\n const dpr = window.devicePixelRatio || 1;\n if (this._canvas.width !== Math.round(W * dpr) || this._canvas.height !== Math.round(H * dpr)) {\n this._canvas.width = Math.round(W * dpr);\n this._canvas.height = Math.round(H * dpr);\n }\n\n const box = parseGridBox(W, H, this._opt.grid, 0);\n return { W, H, box, dpr };\n }\n\n /** 核心主渲染流程 */\n _render() {\n const { W, H, box, dpr } = this._dims();\n const ctx = this._ctx;\n if (!ctx) return;\n\n const th = this._theme;\n const opt = this._opt;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, W, H);\n\n const bgColor = opt.backgroundColor || th.backgroundColor || 'transparent';\n if (bgColor && bgColor !== 'transparent') {\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, W, H);\n }\n\n // 坐标系范围定义\n const xMin = opt.xAxis.min;\n const xMax = opt.xAxis.max;\n const yMin = opt.yAxis.min;\n const yMax = opt.yAxis.max;\n\n const plotW = box.availW;\n const plotH = box.availH;\n const gL = box.left;\n const gT = box.top;\n\n const toPixX = (logVal) => gL + ((logVal - xMin) / (xMax - xMin)) * plotW;\n const toPixY = (logVal) => gT + ((yMax - logVal) / (yMax - yMin)) * plotH;\n \n // 保存映射函数和参数,供鼠标悬浮碰撞检测时复用\n this._coordMap = { xMin, xMax, yMin, yMax, plotW, plotH, gL, gT, toPixX, toPixY };\n\n // 保存上下文状态以应用缩放变换\n ctx.save();\n\n // 将缩放变换应用到图表各个元素 (网格、区域、坐标系内元素)\n this._zoom.applyTransform(ctx);\n\n this._drawGrid(ctx, toPixX, toPixY, th, opt);\n this._drawZones(ctx, toPixX, toPixY, th, opt);\n \n const results = this._drawSeries(ctx, toPixX, toPixY, th, opt);\n\n // 坐标轴在缩放上下文中绘制,实现刻度和平移联动\n this._drawAxes(ctx, toPixX, toPixY, th, opt, W, H, gL, gT, plotW, plotH);\n\n ctx.restore();\n\n // 更新悬浮提示框 (Tooltip)\n if (opt.tooltip.show && this._hoverPoint) {\n const hp = this._hoverPoint;\n const px = toPixX(hp.logX) * this._zoom.zoom + this._zoom.panX;\n const py = toPixY(hp.logY) * this._zoom.zoom + this._zoom.panY;\n \n let html = '';\n if (typeof opt.tooltip.formatter === 'function') {\n html = opt.tooltip.formatter({\n series: hp.series,\n logX: hp.logX,\n logY: hp.logY,\n rawX: Math.pow(10, hp.logX),\n rawY: Math.pow(10, hp.logY),\n zone: hp.zone\n });\n } else {\n html = this._defaultTooltipHTML(hp, opt);\n }\n this._tooltipRenderer.show(html, px, py, opt.tooltip, th, hp.zone);\n } else {\n this._tooltipRenderer.hide();\n }\n\n if (results.length > 0) this._bus.emit('diagnose', results);\n }\n\n /** 绘制背景对数网格(主网格和次级网格) */\n _drawGrid(ctx, toPixX, toPixY, th, opt) {\n const xMin = opt.xAxis.min;\n const xMax = opt.xAxis.max;\n const yMin = opt.yAxis.min;\n const yMax = opt.yAxis.max;\n const gL = this._coordMap.gL;\n const gT = this._coordMap.gT;\n const plotW = this._coordMap.plotW;\n const plotH = this._coordMap.plotH;\n\n const glStyle = opt.grid.lineStyle || {};\n const majorColor = glStyle.color || th.gridLineMajor;\n const minorColor = th.gridLine;\n\n // X 轴网格 (垂直线)\n for (let lx = Math.ceil(xMin); lx <= Math.floor(xMax); lx++) {\n const px = toPixX(lx);\n \n // Major\n ctx.beginPath();\n ctx.moveTo(px, gT);\n ctx.lineTo(px, gT + plotH);\n ctx.strokeStyle = majorColor;\n ctx.lineWidth = glStyle.width || 0.4;\n if (glStyle.type === 'dashed') ctx.setLineDash([4, 3]);\n else ctx.setLineDash([]);\n ctx.stroke();\n\n // Minor\n ctx.setLineDash([]);\n ctx.strokeStyle = minorColor;\n ctx.lineWidth = 0.25;\n for (let sub = 2; sub <= 9; sub++) {\n const lxm = lx + Math.log10(sub);\n if (lxm > xMax) break;\n const pxm = toPixX(lxm);\n ctx.beginPath();\n ctx.moveTo(pxm, gT);\n ctx.lineTo(pxm, gT + plotH);\n ctx.stroke();\n }\n }\n\n // Y 轴网格 (水平线)\n for (let ly = Math.ceil(yMin); ly <= Math.floor(yMax); ly++) {\n const py = toPixY(ly);\n \n // Major\n ctx.beginPath();\n ctx.moveTo(gL, py);\n ctx.lineTo(gL + plotW, py);\n ctx.strokeStyle = majorColor;\n ctx.lineWidth = glStyle.width || 0.4;\n if (glStyle.type === 'dashed') ctx.setLineDash([4, 3]);\n else ctx.setLineDash([]);\n ctx.stroke();\n\n // Minor\n ctx.setLineDash([]);\n ctx.strokeStyle = minorColor;\n ctx.lineWidth = 0.25;\n for (let sub = 2; sub <= 9; sub++) {\n const lym = ly + Math.log10(sub);\n if (lym > yMax) break;\n const pym = toPixY(lym);\n ctx.beginPath();\n ctx.moveTo(gL, pym);\n ctx.lineTo(gL + plotW, pym);\n ctx.stroke();\n }\n }\n }\n\n /** 绘制诊断区域多边形及其文本标签 */\n _drawZones(ctx, toPixX, toPixY, th, opt) {\n const zoneOpt = opt.zone;\n if (!zoneOpt || !zoneOpt.data) return;\n\n const gAlpha = zoneOpt.alpha;\n const colors = zoneOpt.colors || opt.colors || DEFAULT_COLORS;\n\n for (let i = 0; i < zoneOpt.data.length; i++) {\n const zone = zoneOpt.data[i];\n if (!zone.coordinates || zone.coordinates.length < 3) continue;\n\n ctx.beginPath();\n zone.coordinates.forEach((p, j) => {\n const px = toPixX(p[0]);\n const py = toPixY(p[1]);\n if (j === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n });\n ctx.closePath();\n\n // 区域背景颜色填充\n let baseColor = zone.color || colors[i % colors.length];\n if (gAlpha !== undefined && baseColor !== 'transparent') {\n baseColor = colorToRgba(baseColor, gAlpha);\n }\n ctx.fillStyle = baseColor;\n ctx.fill();\n\n // 区域边框线绘制\n if (zoneOpt.borderStyle.show) {\n let borderColor = zoneOpt.borderStyle.color || baseColor;\n if (zoneOpt.borderStyle.alpha !== undefined && borderColor !== 'transparent') {\n borderColor = colorToRgba(borderColor, zoneOpt.borderStyle.alpha);\n }\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = zoneOpt.borderStyle.width ?? 1.0;\n if (zoneOpt.borderStyle.type === 'dashed') ctx.setLineDash([5, 3]);\n else ctx.setLineDash([]);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n // 区域中心文字标签绘制\n if (zoneOpt.labelStyle.show && zone.name) {\n let sumX = 0, sumY = 0;\n zone.coordinates.forEach(p => { sumX += toPixX(p[0]); sumY += toPixY(p[1]); });\n const cx = sumX / zone.coordinates.length;\n const cy = sumY / zone.coordinates.length;\n\n // 松散限制标签坐标,防止完全超出图表区边界\n const gL = this._coordMap.gL;\n const gT = this._coordMap.gT;\n const plotW = this._coordMap.plotW;\n const plotH = this._coordMap.plotH;\n\n const lx = Math.max(gL + 4, Math.min(gL + plotW - 4, cx));\n const ly = Math.max(gT + 4, Math.min(gT + plotH - 4, cy));\n\n const fs = zoneOpt.labelStyle.fontSize || 12;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n \n const label = typeof zoneOpt.labelStyle.formatter === 'function' ? zoneOpt.labelStyle.formatter(zone) : zone.name;\n ctx.font = `${zoneOpt.labelStyle.fontWeight || '500'} ${fs}px system-ui, sans-serif`;\n ctx.fillStyle = zoneOpt.labelStyle.color || th.text;\n ctx.fillText(label, lx, ly);\n }\n }\n }\n\n _drawAxes(ctx, toPixX, toPixY, th, opt, W, H, gL, gT, plotW, plotH) {\n const xMin = opt.xAxis.min;\n const xMax = opt.xAxis.max;\n const yMin = opt.yAxis.min;\n const yMax = opt.yAxis.max;\n\n // 外边框绘制\n ctx.beginPath();\n ctx.rect(gL, gT, plotW, plotH);\n ctx.strokeStyle = th.axisLine;\n ctx.lineWidth = 1;\n ctx.stroke();\n\n const xLabelColor = opt.xAxis.labelStyle.color || th.textSecondary;\n const yLabelColor = opt.yAxis.labelStyle.color || th.textSecondary;\n\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n \n // 绘制 X 轴刻度标签文字\n for (let lx = Math.ceil(xMin); lx <= Math.floor(xMax); lx++) {\n const px = toPixX(lx);\n const xls = opt.xAxis.labelStyle;\n ctx.font = `${xls.fontWeight || 'normal'} ${xls.fontSize || 11}px system-ui, sans-serif`;\n ctx.fillStyle = xLabelColor;\n const text = typeof xls.formatter === 'function' \n ? xls.formatter(lx, Math.pow(10, lx)) \n : (xls.scientific === false ? String(Number(Math.pow(10, lx).toPrecision(4))) : fmtLog(lx));\n ctx.fillText(text, px + (xls.offsetX || 0), gT + plotH + 16 + (xls.offsetY || 0));\n }\n\n // 绘制 Y 轴刻度标签文字\n ctx.textAlign = 'right';\n for (let ly = Math.ceil(yMin); ly <= Math.floor(yMax); ly++) {\n const py = toPixY(ly);\n const yls = opt.yAxis.labelStyle;\n ctx.font = `${yls.fontWeight || 'normal'} ${yls.fontSize || 11}px system-ui, sans-serif`;\n ctx.fillStyle = yLabelColor;\n const text = typeof yls.formatter === 'function' \n ? yls.formatter(ly, Math.pow(10, ly)) \n : (yls.scientific === false ? String(Number(Math.pow(10, ly).toPrecision(4))) : fmtLog(ly));\n ctx.fillText(text, gL - 6 + (yls.offsetX || 0), py + (yls.offsetY || 0));\n }\n\n // 绘制 X 轴标题\n if (opt.xAxis.title) {\n const xts = opt.xAxis.titleStyle;\n const alignMap = { left: gL, center: gL + plotW / 2, right: gL + plotW };\n const tx = (alignMap[xts.align] || alignMap.center) + (xts.offsetX || 0);\n const ty = gT + plotH + 38 + (xts.offsetY || 0);\n \n ctx.textAlign = xts.align === 'left' ? 'left' : xts.align === 'right' ? 'right' : 'center';\n ctx.font = `${xts.fontWeight || 'normal'} ${xts.fontSize || 13}px system-ui, sans-serif`;\n ctx.fillStyle = xts.color || th.text;\n ctx.fillText(opt.xAxis.title, tx, ty);\n }\n\n // 绘制 Y 轴标题\n if (opt.yAxis.title) {\n const yts = opt.yAxis.titleStyle;\n const alignMap = { left: gT + plotH, center: gT + plotH / 2, right: gT };\n const ty_base = alignMap[yts.align] || alignMap.center;\n const tx = 14 + (yts.offsetX || 0);\n const ty = ty_base + (yts.offsetY || 0);\n \n ctx.save();\n ctx.translate(tx, ty);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = yts.align === 'left' ? 'right' : yts.align === 'right' ? 'left' : 'center';\n ctx.font = `${yts.fontWeight || 'normal'} ${yts.fontSize || 13}px system-ui, sans-serif`;\n ctx.fillStyle = yts.color || th.text;\n ctx.fillText(opt.yAxis.title, 0, 0);\n ctx.restore();\n }\n }\n\n /** 绘制所有数据点,并进行区域碰撞检测诊断 */\n _drawSeries(ctx, toPixX, toPixY, th, opt) {\n const results = [];\n \n for (const s of opt.series || []) {\n let logX = 0, logY = 0;\n\n // 归一化支持一维数组格式数据: data: [x, y]\n if (Array.isArray(s.data) && s.data.length >= 2) {\n const valX = typeof s.data[0] === 'object' ? s.data[0].value : s.data[0];\n const valY = typeof s.data[1] === 'object' ? s.data[1].value : s.data[1];\n logX = s.logScale === false ? valX : Math.log10(valX || 1e-9);\n logY = s.logScale === false ? valY : Math.log10(valY || 1e-9);\n } \n // 兼容自定义对象格式 {dataX, dataY}\n else if (s.dataX !== undefined && s.dataY !== undefined) {\n logX = s.logScale === false ? s.dataX : Math.log10(s.dataX || 1e-9);\n logY = s.logScale === false ? s.dataY : Math.log10(s.dataY || 1e-9);\n } else {\n continue;\n }\n\n const px = toPixX(logX);\n const py = toPixY(logY);\n\n // 判定数据点落在哪一个诊断区域中\n let matchZone = null;\n if (opt.zone && opt.zone.data) {\n for (const zone of opt.zone.data) {\n if (zone.coordinates && inPoly(logX, logY, zone.coordinates)) {\n matchZone = zone;\n break;\n }\n }\n }\n\n results.push({ series: s, zone: matchZone, logX, logY, px, py });\n\n const color = s.color || '#00e5ff';\n let size = s.size || 6;\n const shape = s.shape || 'circle';\n const isHover = this._hoverPoint && this._hoverPoint.series === s;\n if (isHover) size *= 1.5;\n\n ctx.save();\n ctx.translate(px, py);\n\n // 数据点发光特效 (Glow)\n const gs = s.glowStyle || {};\n if (gs.show || (isHover && gs.show !== false)) {\n ctx.shadowColor = gs.color || hexToRgba(color, 0.8);\n ctx.shadowBlur = gs.blur || 15;\n }\n\n ctx.fillStyle = color;\n ctx.strokeStyle = s.itemStyle?.borderColor || 'none';\n ctx.lineWidth = s.itemStyle?.borderWidth || 0;\n\n if (ctx.strokeStyle === 'none' || !s.itemStyle?.borderColor) ctx.lineWidth = 0;\n\n ctx.beginPath();\n drawShapePath(ctx, 0, 0, shape, size, 1, 0);\n\n ctx.fill();\n if (ctx.lineWidth > 0) ctx.stroke();\n\n // 数据点关联文本标签\n const ts = s.textStyle;\n if (ts && ts.show && s.name) {\n ctx.shadowBlur = 0; // 禁用文字的阴影,避免糊化\n const posOffsets = {\n top: [0, -(size + 6)], bottom: [0, size + 12],\n left: [-(size + 6), 4], right: [size + 6, 4]\n };\n const [ox, oy] = posOffsets[ts.position] || posOffsets.top;\n \n ctx.textAlign = ts.position === 'left' ? 'right' : ts.position === 'right' ? 'left' : 'center';\n ctx.textBaseline = 'middle';\n ctx.font = `${ts.fontWeight || 'normal'} ${ts.fontSize || 12}px system-ui, sans-serif`;\n ctx.fillStyle = ts.color || color;\n ctx.fillText(s.name, ox, oy);\n }\n\n ctx.restore();\n }\n\n this._drawnPoints = results;\n return results;\n }\n\n /** 生成默认的浮窗 (Tooltip) HTML 结构 */\n _defaultTooltipHTML(hp, opt) {\n const s = hp.series;\n const rawX = Math.pow(10, hp.logX).toPrecision(4);\n const rawY = Math.pow(10, hp.logY).toPrecision(4);\n const xTitle = opt.xAxis.title || 'X';\n const yTitle = opt.yAxis.title || 'Y';\n const ptName = s?.name || hp.name || 'Data Point';\n const pointNameStr = `<div style=\"font-size:14px; font-weight:bold; margin-bottom:4px; color:#fff;\">${ptName}</div>`;\n const zoneStr = hp.zone ? `${hp.zone.name || ''} ${hp.zone.title || hp.zone.desc || ''}`.trim() : 'Outside';\n const zoneColor = hp.zone ? (hp.zone.color || '#fff') : '#fff';\n\n return `\n ${pointNameStr}\n <div style=\"color:${zoneColor}; font-size:13px; font-weight:bold; padding-bottom:8px; margin-bottom:8px; border-bottom:1px solid rgba(255,255,255,0.07);\">\n ${zoneStr}\n </div>\n <div style=\"display:flex; align-items:center; margin-bottom:6px; font-size:13px;\">\n <span style=\"display:inline-block; width:8px; height:8px; border-radius:50%; background-color:#00e5ff; margin-right:8px;\"></span>\n <span style=\"color:#cbd5e1; flex-grow:1;\">${xTitle}</span>\n <span style=\"color:#fff; font-weight:bold; margin-left:20px;\">${rawX}</span>\n </div>\n <div style=\"display:flex; align-items:center; margin-bottom:6px; font-size:13px;\">\n <span style=\"display:inline-block; width:8px; height:8px; border-radius:50%; background-color:#ff6b35; margin-right:8px;\"></span>\n <span style=\"color:#cbd5e1; flex-grow:1;\">${yTitle}</span>\n <span style=\"color:#fff; font-weight:bold; margin-left:20px;\">${rawY}</span>\n </div>\n `;\n }\n}"],"names":["DEFAULT_COLORS","EventBus","ev","fn","f","d","ZoomController","cfg","deltaY","ax","ay","dir","nz","rat","cx","cy","scale","was","ctx","hexToRgba","hex","alpha","h","r","g","b","deepMerge","target","source","k","sv","inPoly","px","py","poly","inside","j","xi","yi","xj","yj","DOMTooltip","container","theme","tt","textStyle","padding","p","html","x","y","tooltipOpt","zone","bw","bc","rect","tw","th","left","top","parseGridBox","W","H","grid","defaultPadding","parse","val","max","def","right","bottom","availW","availH","drawShapePath","shape","size","offset","radius","inn","a","i","side","rx","ry","TRIANGLE_ZONES_1","TRIANGLE_ZONES_4","TRIANGLE_ZONES_5","PENTAGON_ZONES_1","PENTAGON_ZONES_2","ETRA_ZONES_A","ETRA_ZONES_B","THREE_RADIO_ZONES","computedPercent","values","nums","v","total","sum","n","pct","_pentagonRatioToDoc","H2","C2H2","C2H4","CH4","C2H6","vals","s","ratio","R","angles","_inPentagonPoly","DiagnosticTools","ch4","c2h4","c2h2","h2","c2h6","pt","last","colorToRgba","color","m","content","parts","_PentagonCoord","verts","bx","by","dx","dy","len2","t","t2","v0","v1","v2","denom","l0","l1","l2","tot","ang","_","polyPoint","vx","vy","data","gasOrder","isObj","item","decimals","__publicField","PentagonCoord","_ThemeManager","ThemeManager","ZoneRenderer","zoneOpt","S","gLabel","gBorder","gAlpha","colors","z","pts","baseColor","bStyle","borderColor","ff","lStyle","lx","ly","fs","fontStyle","text","padX","padY","bh","GridRenderer","vertexOpt","gridOpt","_a","lineStyle","lw","lc","lt","globalDist","style","dist","distOffset","fontWeight","fontSize","parseRgba","cleaned","interpolateColor","c1","c2","factor","r1","g1","b1","a1","r2","g2","b2","a2","PointRenderer","series","hoverPoint","results","ptName","docX","docY","globalItemStyle","borderWidth","opacity","globalTextStyle","textShow","textColor","textFontSize","textFontWeight","textPosition","textOffset","globalGlowStyle","glowShow","glowColorsOpt","glowBlur","glowStartColor","glowEndColor","glowCount","glowDistance","glowColors","layers","glowColor","textAlign","textBaseline","tx","ty","offsetVal","_DuvalPentagon","option","defaultLabelStyle","opt","_b","c","hoveredPoint","minDistance","pr","showTooltip","hr","dpr","w","box","gas","bgColor","resList","res","hx","hy","vertexData","rawData","pointNameStr","zoneStr","zoneColor","key","_c","_d","col","rawValStr","found","DuvalPentagon","TriangleConfig","TriangleMath","triH","startX","startY","tri","T","L","A","cross","sideOrder","raw","v3","TriangleRenderer","state","zones","_e","_f","globalBorderStyle","globalLabelStyle","centPx","lab","pad","fx","fy","len","ux","uy","sz","steps","majorEvery","majorLineStyle","getNormal","p1","p2","inwardPt","n1","n2","normals","isMajor","currentStyle","ln","tStyle","tickLen","tickLineColor","tickColor","font","drawLine","nx","ny","p0","sOpt","names","fw","lMid","lDx","lDy","lLen","rMid","rDx","rDy","rLen","canvasPt","isHov","DuvalTriangle","containerIdOrEl","el","tooltipCfg","event","handler","zoneData","path","pa","pb","pc","ppt","cen","aW","aH","cv","scaleX","scaleY","e","nearest","minDist","ptData","tOpt","foundZone","sNames","canvasRect","containerRect","offsetX","offsetY","hovered","TRIANGLE_TITLES","zoneTitle","axisColors","name","ThreeRatioConfig","DGAScale","u","Renderer3D","opts","themeName","defaultWall","defaultAxis","defaultPlane2D","zonesOpt","zonesData","lblStyle","labelColor","fontParts","fontStr","edgeStr","base","custom","family","dz","cz","RX","RY","cosX","sinX","cosY","sinY","x1","z1","y1","z2","sc","fov","pz","cam","points","view","flat","fadeTarget","d3a","pts4","fill","stroke","pp","x0","y0","z0","edge","wallOpt","tv","walls","gridColor","segs","vis","fA","axisOpt","as","labels","ta","uz","pos","pv","lbl","hasGlowStyle","glowStyle","startColor","endColor","plane","opt2d","axOpt","sqSize","u2c","h0","h1","pw","ph","mx","my","hColor","vColor","fontFam","_ThreeRatioChart","arr","tgt","hits","args","entries","width","height","ThreeRatioChart","DEFAULTS","THEME","fmtLog","ETRAChart","mouseX","mouseY","panX","panY","zoom","rawX","rawY","xMin","xMax","yMin","yMax","plotW","plotH","gL","gT","toPixX","logVal","toPixY","hp","glStyle","majorColor","minorColor","sub","lxm","pxm","lym","pym","sumX","sumY","label","xLabelColor","yLabelColor","xls","yls","xts","alignMap","yts","ty_base","logX","logY","valX","valY","matchZone","isHover","gs","ts","posOffsets","ox","oy","xTitle","yTitle"],"mappings":"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"}
|