@syhr/dga-charts 1.0.0 → 1.0.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","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?.item;\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 {Object} opts 配置项\r\n * @param {string|HTMLElement} opts.container 容器选择器或元素\r\n * @param {string} opts.initialView 初始视角 (默认 '3d')\r\n * @param {string} opts.theme 初始主题 ('dark' | 'light')\r\n */\r\n constructor(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 const container = typeof opts.container === 'string' ? document.querySelector(opts.container) : opts.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 static init(selector, opts = {}) {\r\n return new ThreeRatioChart({ container: selector, ...opts });\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 destroy() {\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","lineStyle","lw","lc","lt","globalDist","_a","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","c","_b","hoveredPoint","minDistance","pr","showTooltip","hr","dpr","w","box","gas","bgColor","resList","res","hx","hy","vertexData","rawData","pointNameStr","zoneStr","zoneColor","key","col","_d","_c","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","selector","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.cjs","sources":["../src/utils.js","../src/zones.js","../src/pentagon.js","../src/triangle.js","../src/three-ratio.js","../src/etra.js"],"sourcesContent":["/**\r\n * DGA 图表核心工具库 (Utils)\r\n * 包含: 通用事件总线 EventBus、缩放交互 ZoomController、\r\n * DOM 原生悬浮提示框 DOMTooltip、颜色计算、数学判定等公用辅助函数\r\n */\r\nexport const DEFAULT_COLORS = [\r\n '#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de',\r\n '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'\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","/**\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","/**\r\n * DGA Duval 五边形类 (Pentagon Chart)\r\n * 包含: DuvalPentagon 核心图表组件类、多边形数学映射计算与 Canvas 渲染逻辑\r\n * 用于变压器溶解气体分析的故障诊断\r\n */\r\nimport { inPoly, hexToRgba, deepMerge, EventBus, ZoomController, DOMTooltip, parseGridBox, drawShapePath, DEFAULT_COLORS } 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 alpha: 0.75,\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 width: 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 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 width: 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 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 : [];\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 if (!data[i].coordinates || !data[i].coordinates.length) continue;\r\n const poly = data[i].coordinates.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 : [];\r\n const gLabel = zoneOpt.labelStyle || {};\r\n const gBorder = zoneOpt.borderStyle || {};\r\n const gAlpha = zoneOpt.alpha;\r\n const colors = zoneOpt.colors || theme.colors || DEFAULT_COLORS;\r\n\r\n // 1. 绘制背景区域\r\n data.forEach((z, i) => {\r\n if (!z.coordinates || !z.coordinates.length) return;\r\n const pts = z.coordinates.map((p) => PentagonCoord.polyToCanvas(p, cx, cy, R));\r\n ctx.beginPath();\r\n pts.forEach(([x, y], j) => (j === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\r\n ctx.closePath();\r\n\r\n let baseColor = z.color || colors[i % colors.length];\r\n if (gAlpha !== undefined && baseColor !== 'transparent') {\r\n baseColor = colorToRgba(baseColor, gAlpha);\r\n }\r\n ctx.fillStyle = baseColor;\r\n ctx.fill();\r\n });\r\n\r\n // 2. 绘制边框\r\n data.forEach((z, i) => {\r\n const bStyle = gBorder;\r\n if (bStyle.show === false || !z.coordinates || !z.coordinates.length) return;\r\n\r\n const pts = z.coordinates.map((p) => PentagonCoord.polyToCanvas(p, cx, cy, R));\r\n ctx.beginPath();\r\n pts.forEach(([x, y], j) => (j === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\r\n ctx.closePath();\r\n\r\n let borderColor = bStyle.color || z.color || colors[i % colors.length];\r\n if (bStyle.alpha !== undefined && borderColor !== 'transparent') {\r\n borderColor = colorToRgba(borderColor, bStyle.alpha);\r\n }\r\n ctx.strokeStyle = borderColor;\r\n ctx.lineWidth = bStyle.width ?? 1.0;\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;\r\n if (lStyle.show === false || !z.name) continue;\r\n\r\n const pts = z.coordinates ? z.coordinates.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 = typeof lStyle.formatter === 'function' ? lStyle.formatter(z) : 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 colors: DEFAULT_COLORS,\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 }\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\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 (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 /**\r\n * 诊断指定的比值数据,返回命中的区域\r\n * @param {number[]} ratio - 五个比值数据数组\r\n * @returns {object|null} - 命中的故障区域对象\r\n */\r\n diagnose(ratio) {\r\n const { cx, cy, R } = this._dims();\r\n return ZoneRenderer.diagnose(ratio, this._opt.zone, cx, cy, R);\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) {\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) {\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._hoverPoint) {\r\n let hx = 0, hy = 0;\r\n [hx, hy] = PentagonCoord.polyToCanvas(this._hoverRatio, cx, cy, R);\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 const ptName = hoverPoint?.name || 'Data Point';\r\n const pointNameStr = `<div style=\"font-size:14px; font-weight:bold; margin-bottom:4px; color:#fff;\">${ptName}</div>`;\r\n\r\n const zoneStr = zone ? `${zone.name || ''} ${zone.title || ''}`.trim() : '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, EventBus, parseGridBox, drawShapePath, DEFAULT_COLORS } 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 colors: DEFAULT_COLORS,\r\n zone: { data: TRIANGLE_ZONES_1, alpha: 0.75 },\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 const gAlpha = option.zone?.alpha;\r\n const colors = option.zone?.colors || option.colors || DEFAULT_COLORS;\r\n\r\n // 1. Draw Backgrounds\r\n zones.forEach((zone, i) => {\r\n if (!zone.coordinates || !zone.coordinates.length) return;\r\n ctx.beginPath();\r\n zone.coordinates.forEach(([a, b, c], j) => {\r\n const pt = TriangleMath.t2c(a, b, c, tri);\r\n j === 0 ? ctx.moveTo(pt.x, pt.y) : ctx.lineTo(pt.x, pt.y);\r\n });\r\n ctx.closePath();\r\n\r\n let baseColor = zone.color || colors[i % colors.length];\r\n if (gAlpha !== undefined && baseColor !== 'transparent') {\r\n baseColor = colorToRgba(baseColor, gAlpha);\r\n }\r\n ctx.fillStyle = baseColor;\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, i) => {\r\n const bStyle = globalBorderStyle;\r\n if (bStyle.show === false || !zone.coordinates || !zone.coordinates.length) return;\r\n\r\n ctx.beginPath();\r\n zone.coordinates.forEach(([a, b, c], j) => {\r\n const pt = TriangleMath.t2c(a, b, c, tri);\r\n j === 0 ? ctx.moveTo(pt.x, pt.y) : ctx.lineTo(pt.x, pt.y);\r\n });\r\n ctx.closePath();\r\n\r\n let borderColor = bStyle.color || zone.color || colors[i % colors.length];\r\n if (bStyle.alpha !== undefined && borderColor !== 'transparent') {\r\n borderColor = colorToRgba(borderColor, bStyle.alpha);\r\n }\r\n ctx.strokeStyle = borderColor;\r\n ctx.lineWidth = (bStyle.width ?? 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 = globalLabelStyle;\r\n if (lStyle.show === false || !zone.name) return;\r\n\r\n let centPx;\r\n const lab = zone.labelAt;\r\n if (lab && Array.isArray(lab) && lab.length >= 3) {\r\n centPx = TriangleMath.t2c(lab[0], lab[1], lab[2], tri);\r\n } else if (zone.coordinates && zone.coordinates.length > 0) {\r\n // Fallback: calculate geometric center\r\n const pts = zone.coordinates.map(([a, b, c]) => TriangleMath.t2c(a, b, c, tri));\r\n centPx = {\r\n x: pts.reduce((s, p) => s + p.x, 0) / pts.length,\r\n y: pts.reduce((s, p) => s + p.y, 0) / pts.length\r\n };\r\n } else {\r\n return;\r\n }\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 = typeof lStyle.formatter === 'function' ? lStyle.formatter(zone) : zone.name;\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 || '#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._bus = new EventBus();\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 setSeries(series) {\r\n this.state.option.series = Array.isArray(series) ? series : [series];\r\n this.render();\r\n return this;\r\n }\r\n\r\n on(event, handler) {\r\n this._bus.on(event, handler);\r\n return this;\r\n }\r\n\r\n off(event, handler) {\r\n this._bus.off(event, handler);\r\n return this;\r\n }\r\n\r\n _normalizeOptions() {\r\n const opt = this.state.option;\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 }\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 const pts = z.coordinates;\r\n if (!pts) return;\r\n pts.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 ptsArr = z.coordinates || [];\r\n const pts = ptsArr.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 if (!this.state.option) return;\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 const results = [];\r\n const sideOrder = this.state.option.side?.data;\r\n (this.state.option.series || []).forEach((s) => {\r\n const pt = s.data;\r\n if (!pt || pt.length === 0) return;\r\n const ratio = TriangleMath.resolveData(pt, sideOrder);\r\n if (!ratio) return;\r\n const zone = this.getZoneAt(ratio[0], ratio[1], ratio[2]);\r\n results.push({\r\n series: s,\r\n zone: zone,\r\n ratio: ratio\r\n });\r\n });\r\n if (results.length > 0) {\r\n this._bus.emit('diagnose', results);\r\n }\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 this._bus.emit('zoom', this._zoom.state);\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 this._bus.emit('zoom', this._zoom.state);\r\n };\r\n\r\n this._onLeave = () => {\r\n this.hideTooltip();\r\n this.state.hoveredPoint = null;\r\n this._bus.emit('hover', null);\r\n this.render();\r\n };\r\n\r\n this._onDbl = () => {\r\n this.zoomReset();\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 this._bus.emit('click', { a, b, c, zone });\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) {\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 this._bus.emit('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 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 zoomReset() {\r\n this.state.scale = 1;\r\n this.state.tx = 0;\r\n this.state.ty = 0;\r\n this.render();\r\n this._bus.emit('zoom', { scale: this.state.scale, tx: this.state.tx, ty: this.state.ty });\r\n }\r\n dispose() {\r\n this.ro?.disconnect();\r\n this._tooltip?.dispose();\r\n this.canvas?.remove();\r\n window.removeEventListener('mouseup', this._onUp);\r\n this._bus?.dispose();\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 ptName = hovered?.series?.name || 'Data Point';\r\n const pointNameStr = `<div style=\"font-size:14px; font-weight:bold; margin-bottom:4px; color:#fff;\">${ptName}</div>`;\r\n\r\n const TRIANGLE_TITLES = {\r\n 'PD': '局部放电',\r\n 'D1': '低能放电',\r\n 'D2': '高能放电',\r\n 'T1': '热故障,t<300℃',\r\n 'T2': '热故障,300℃<t<700℃',\r\n 'T3': '热故障,t>700℃',\r\n 'DT': '热和放电混合故障',\r\n 'S': '温度<200℃时的杂散气体',\r\n 'C': '绝缘纸可能碳化',\r\n 'O': '矿物油过热',\r\n 'T3-H': '仅矿物油过热',\r\n 'ND': '正常'\r\n };\r\n\r\n const zoneTitle = zone?.title || zone?.desc || (zone ? TRIANGLE_TITLES[zone.name] : '') || '';\r\n const zoneStr = zone ? `${zone.name || zone.id || ''} ${zoneTitle}`.trim() : 'Outside';\r\n const zoneColor = zone ? (zone.color?.replace(/[\\d.]+\\)$/, '1)') || '#fff') : '#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 const axisColors = ['#00e5ff', '#ff6b35', '#ffcc02'];\r\n const item = hovered?.series?.data;\r\n\r\n if (true) {\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, EventBus, DEFAULT_COLORS } 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 colors: DEFAULT_COLORS,\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.75,\r\n borderStyle: { show: true, width: 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 let gAlpha = undefined;\r\n let gBorder = {};\r\n let colors = this.opts.colors || ThreeRatioConfig.colors || DEFAULT_COLORS;\r\n \r\n if (zonesOpt && typeof zonesOpt === 'object' && Array.isArray(zonesOpt.data)) {\r\n zonesData = zonesOpt.data;\r\n globalLabelStyle = zonesOpt.labelStyle || {};\r\n gAlpha = zonesOpt.alpha;\r\n gBorder = zonesOpt.borderStyle || {};\r\n if (zonesOpt.colors) colors = zonesOpt.colors;\r\n } else {\r\n zonesData = ThreeRatioConfig.ZONES;\r\n }\r\n\r\n return zonesData.map((d, i) => {\r\n let baseColor = d.color || colors[i % colors.length];\r\n if (gAlpha !== undefined && baseColor !== 'transparent') {\r\n baseColor = colorToRgba(baseColor, gAlpha);\r\n }\r\n \r\n const [r, g, b] = parseRgba(baseColor);\r\n\r\n const lblStyle = globalLabelStyle;\r\n const labelColor = lblStyle.color || baseColor;\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 const bStyle = gBorder;\r\n let edgeStr = bStyle.color || baseColor;\r\n if (bStyle.alpha !== undefined && edgeStr !== 'transparent') {\r\n edgeStr = colorToRgba(edgeStr, bStyle.alpha);\r\n }\r\n\r\n const p1 = d.coordinates && d.coordinates[0] ? d.coordinates[0] : [0, 0, 0];\r\n const p2 = d.coordinates && d.coordinates[1] ? d.coordinates[1] : [0, 0, 0];\r\n\r\n return {\r\n ...d,\r\n fillBase: `rgba(${r},${g},${b},`,\r\n edgeStr,\r\n x0: DGAScale.realToU(p1[0]),\r\n x1: DGAScale.realToU(p2[0]),\r\n y0: DGAScale.realToU(p1[1]),\r\n y1: DGAScale.realToU(p2[1]),\r\n z0: DGAScale.realToU(p1[2]),\r\n z1: DGAScale.realToU(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 const dpr = window.devicePixelRatio || 1;\r\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\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.width ?? 1.4;\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 \r\n // 支持 formatter 回调\r\n const globalLabelStyle = this.opts.zone?.labelStyle || {};\r\n const text = typeof globalLabelStyle.formatter === 'function' ? globalLabelStyle.formatter(z) : z.name;\r\n \r\n ctx.fillText(text, 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._bus = new EventBus();\r\n\r\n container = typeof container === 'string' ? document.querySelector(container) : container;\r\n if (!container) throw new Error('ThreeRatioChart: container not found');\r\n 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 return this;\r\n }\r\n\r\n setSeries(series) {\r\n return this.setOption({ series });\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._bus.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) => {\r\n if (!r.coordinates || r.coordinates.length < 2) return false;\r\n const p1 = r.coordinates[0];\r\n const p2 = r.coordinates[1];\r\n return x >= p1[0] && x < p2[0] && y >= p1[1] && y < p2[1] && z >= p1[2] && z < p2[2];\r\n })\r\n .map((r) => ({ name: r.name, title: r.title, color: r.color || '#fff' }));\r\n return hits.length ? hits : [{ ...(this.opts.unknown ?? ThreeRatioConfig.UNKNOWN) }];\r\n }\r\n\r\n on(event, handler) {\r\n this._bus.on(event, handler);\r\n return this;\r\n }\r\n\r\n off(event, handler) {\r\n this._bus.off(event, handler);\r\n return this;\r\n }\r\n\r\n emit(event, ...args) {\r\n this._bus.emit(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 // 渲染完成后触发 diagnose 事件,与 Pentagon/Etra/Triangle 统一\r\n const results = [];\r\n this.series.forEach((s) => {\r\n if (s.position) {\r\n const zone = this.diagnose(s.position.x, s.position.y, s.position.z);\r\n results.push({\r\n series: s,\r\n zone: zone.length ? zone[0] : null,\r\n position: s.position\r\n });\r\n }\r\n });\r\n if (results.length > 0) {\r\n this._bus.emit('diagnose', results);\r\n }\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 this._bus?.dispose();\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 dpr = window.devicePixelRatio || 1;\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 * dpr;\r\n this.cv.height = this.H * dpr;\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 const dpr = window.devicePixelRatio || 1;\r\n this.W = Math.round(width);\r\n this.H = Math.round(height);\r\n this.cv.width = this.W * dpr;\r\n this.cv.height = this.H * dpr;\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","/**\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","lineStyle","lw","lc","lt","globalDist","_a","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","c","_b","hoveredPoint","minDistance","pr","showTooltip","hr","dpr","w","box","gas","bgColor","resList","res","hx","hy","vertexData","rawData","pointNameStr","zoneStr","zoneColor","key","col","_d","_c","rawValStr","found","DuvalPentagon","TriangleConfig","TriangleMath","triH","startX","startY","tri","T","L","A","cross","sideOrder","raw","v3","TriangleRenderer","state","zones","globalBorderStyle","_e","globalLabelStyle","_f","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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"}