@syhr/dga-charts 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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 * 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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"}
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":["/**\n * DGA 图表核心工具库 (Utils)\n * 包含: 通用事件总线 EventBus、缩放交互 ZoomController、\n * DOM 原生悬浮提示框 DOMTooltip、颜色计算、数学判定等公用辅助函数\n */\nexport const DEFAULT_COLORS = [\n '#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de',\n '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'\n];\n\nexport class EventBus {\n constructor() {\n this._h = Object.create(null);\n }\n on(ev, fn) {\n (this._h[ev] || (this._h[ev] = [])).push(fn);\n return this;\n }\n off(ev, fn) {\n if (!fn) {\n delete this._h[ev];\n return this;\n }\n if (this._h[ev]) this._h[ev] = this._h[ev].filter((f) => f !== fn);\n return this;\n }\n emit(ev, d) {\n (this._h[ev] || []).slice().forEach((fn) => fn(d));\n return this;\n }\n dispose() {\n this._h = Object.create(null);\n }\n}\n\n/**\n * 通用缩放和平移控制器\n */\nexport class ZoomController {\n constructor(cfg = {}) {\n this.zoom = 1;\n this.panX = 0;\n this.panY = 0;\n this._min = cfg.min ?? 0.3;\n this._max = cfg.max ?? 6;\n this._step = cfg.step ?? 0.12;\n this._dragging = false;\n this._dragStart = null;\n this._panStart = null;\n }\n onWheel(deltaY, ax, ay) {\n const dir = deltaY < 0 ? 1 : -1;\n const nz = Math.min(this._max, Math.max(this._min, this.zoom * (1 + dir * this._step)));\n const rat = nz / this.zoom;\n this.panX = ax - rat * (ax - this.panX);\n this.panY = ay - rat * (ay - this.panY);\n this.zoom = nz;\n return this;\n }\n startDrag(cx, cy) {\n this._dragging = true;\n this._dragStart = { x: cx, y: cy };\n this._panStart = { x: this.panX, y: this.panY };\n }\n moveDrag(cx, cy, scale) {\n if (!this._dragging) return false;\n this.panX = this._panStart.x + (cx - this._dragStart.x) * scale;\n this.panY = this._panStart.y + (cy - this._dragStart.y) * scale;\n return true;\n }\n endDrag() {\n const was = this._dragging;\n this._dragging = false;\n return was;\n }\n reset() {\n this.zoom = 1;\n this.panX = 0;\n this.panY = 0;\n return this;\n }\n get isDragging() {\n return this._dragging;\n }\n get state() {\n return { zoom: this.zoom, panX: this.panX, panY: this.panY };\n }\n applyTransform(ctx) {\n ctx.translate(this.panX, this.panY);\n ctx.scale(this.zoom, this.zoom);\n }\n}\n\n/**\n * 将 hex 颜色转换为 rgba\n * @param {string} hex \n * @param {number} alpha \n * @returns {string}\n */\nexport function hexToRgba(hex, alpha) {\n const h = hex.replace('#', '');\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n return `rgba(${r},${g},${b},${alpha})`;\n}\n\n/**\n * 深度合并对象\n * @param {object} target \n * @param {object} source \n * @returns {object}\n */\nexport function deepMerge(target, source) {\n for (const k of Object.keys(source)) {\n const sv = source[k];\n if (sv !== null && typeof sv === 'object' && !Array.isArray(sv)) {\n target[k] = target[k] && typeof target[k] === 'object' ? target[k] : {};\n deepMerge(target[k], sv);\n } else {\n target[k] = sv;\n }\n }\n return target;\n}\n\n/**\n * 射线法判断点是否在多边形内\n * @param {number} px \n * @param {number} py \n * @param {number[][]} poly \n * @returns {boolean}\n */\nexport function inPoly(px, py, poly) {\n let inside = false;\n for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n const [xi, yi] = poly[i],\n [xj, yj] = poly[j];\n if (yi > py !== yj > py && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi) inside = !inside;\n }\n return inside;\n}\n\n/**\n * 通用 DOM 悬浮提示框\n */\nexport class DOMTooltip {\n constructor(container, theme) {\n this.container = container;\n this.el = document.createElement('div');\n this.el.style.position = 'absolute';\n this.el.style.pointerEvents = 'none';\n this.el.style.display = 'none';\n this.el.style.zIndex = '9999';\n this.el.style.transition = 'left 0.1s, top 0.1s';\n \n // 确保容器至少有 relative 定位\n const compStyle = window.getComputedStyle(container);\n if (compStyle.position === 'static') {\n container.style.position = 'relative';\n }\n \n container.appendChild(this.el);\n this.updateTheme(theme);\n }\n\n updateTheme(theme) {\n if (!theme) return;\n const tt = theme.tooltip || {};\n const textStyle = tt.textStyle || {};\n this.el.style.backgroundColor = tt.backgroundColor || theme.tooltipBg || 'rgba(6,13,31,0.93)';\n this.el.style.color = textStyle.color || theme.tooltipTextColor || '#c8ddf0';\n\n let padding = tt.padding !== undefined ? tt.padding : (theme.tooltipPadding || 10);\n if (typeof padding === 'number') {\n this.el.style.padding = `${padding}px`;\n } else if (Array.isArray(padding)) {\n this.el.style.padding = padding.map(p => `${p}px`).join(' ');\n } else {\n this.el.style.padding = padding + 'px';\n }\n\n this.el.style.borderRadius = '5px';\n this.el.style.border = `1px solid ${theme.zoneBorderColor || 'rgba(255,255,255,0.25)'}`;\n this.el.style.boxShadow = '0 0 10px rgba(0,0,0,0.45)';\n this.el.style.fontFamily = theme.fontFamily || 'Rajdhani, sans-serif';\n this.el.style.fontSize = textStyle.fontSize !== undefined ? (typeof textStyle.fontSize === 'number' ? `${textStyle.fontSize}px` : textStyle.fontSize) : '12px';\n }\n\n show(html, x, y, tooltipOpt = {}, theme = {}, zone = null) {\n this.el.innerHTML = html;\n this.el.style.display = 'block';\n\n // 1. 背景色\n this.el.style.backgroundColor = tooltipOpt.backgroundColor || theme.tooltipBg || 'rgba(6,13,31,0.93)';\n\n // 2. 边框\n const bw = tooltipOpt.borderWidth !== undefined ? (typeof tooltipOpt.borderWidth === 'number' ? `${tooltipOpt.borderWidth}px` : tooltipOpt.borderWidth) : '1px';\n const bc = tooltipOpt.borderColor || (zone ? zone.borderColor || theme.zoneBorderColor || zone.color : 'rgba(255,255,255,0.25)');\n this.el.style.border = `${bw} solid ${bc}`;\n\n // 3. 内边距\n if (tooltipOpt.padding !== undefined) {\n if (typeof tooltipOpt.padding === 'number') {\n this.el.style.padding = `${tooltipOpt.padding}px`;\n } else if (Array.isArray(tooltipOpt.padding)) {\n this.el.style.padding = tooltipOpt.padding.map(p => `${p}px`).join(' ');\n } else {\n this.el.style.padding = tooltipOpt.padding;\n }\n } else {\n this.el.style.padding = (theme.tooltipPadding || 10) + 'px';\n }\n\n // 4. 文字样式\n const textStyle = tooltipOpt.textStyle || {};\n this.el.style.color = textStyle.color || theme.tooltipTextColor || '#c8ddf0';\n this.el.style.fontStyle = textStyle.fontStyle || '';\n this.el.style.fontWeight = textStyle.fontWeight || textStyle.fontStyle || '';\n this.el.style.fontSize = textStyle.fontSize !== undefined ? (typeof textStyle.fontSize === 'number' ? `${textStyle.fontSize}px` : textStyle.fontSize) : '12px';\n this.el.style.fontFamily = theme.fontFamily || 'Rajdhani, sans-serif';\n\n // 简单边缘检测\n const rect = this.container.getBoundingClientRect();\n const tw = this.el.offsetWidth;\n const th = this.el.offsetHeight;\n\n let left = x + 15;\n let top = y - th / 2;\n\n if (left + tw > rect.width) {\n left = x - tw - 15;\n }\n if (top < 0) top = 0;\n if (top + th > rect.height) top = rect.height - th;\n\n this.el.style.left = left + 'px';\n this.el.style.top = top + 'px';\n }\n\n hide() {\n this.el.style.display = 'none';\n }\n\n dispose() {\n if (this.el && this.el.parentNode) {\n this.el.parentNode.removeChild(this.el);\n }\n }\n}\n\n/**\n * 解析 ECharts 风格的 grid 边距模型\n * 支持数值 (像素) 和字符串百分比 (如 '10%')\n */\nexport function parseGridBox(W, H, grid = {}, defaultPadding = 45) {\n const parse = (val, max, def) => {\n if (val === undefined || val === null) return def;\n if (typeof val === 'string' && val.endsWith('%')) return (parseFloat(val) / 100) * max;\n return parseFloat(val) || 0;\n };\n\n const left = parse(grid.left, W, defaultPadding);\n const right = parse(grid.right, W, defaultPadding);\n const top = parse(grid.top, H, defaultPadding);\n const bottom = parse(grid.bottom, H, defaultPadding);\n\n const availW = Math.max(0, W - left - right);\n const availH = Math.max(0, H - top - bottom);\n const cx = left + availW / 2;\n const cy = top + availH / 2;\n\n return { left, right, top, bottom, availW, availH, cx, cy };\n}\n\n/**\n * 绘制各种形状的数据点路径\n * 支持: circle, ring, star, triangle, diamond, square, rect\n */\nexport function drawShapePath(ctx, px, py, shape, size, scale = 1, offset = 0) {\n const radius = (size + offset) * scale;\n\n if (shape === 'circle' || shape === 'ring') {\n ctx.arc(px, py, radius, 0, Math.PI * 2);\n } else if (shape === 'star') {\n const inn = radius * 0.42;\n for (let k = 0; k < 10; k++) {\n const a = (k * Math.PI) / 5 - Math.PI / 2;\n const r = k % 2 === 0 ? radius : inn;\n k === 0\n ? ctx.moveTo(px + r * Math.cos(a), py + r * Math.sin(a))\n : ctx.lineTo(px + r * Math.cos(a), py + r * Math.sin(a));\n }\n ctx.closePath();\n } else if (shape === 'triangle') {\n for (let i = 0; i < 3; i++) {\n const a = -Math.PI / 2 + (i * 2 * Math.PI) / 3;\n const x = px + radius * Math.cos(a);\n const y = py + radius * Math.sin(a);\n i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n }\n ctx.closePath();\n } else if (shape === 'diamond') {\n ctx.moveTo(px, py - radius);\n ctx.lineTo(px + radius, py);\n ctx.lineTo(px, py + radius);\n ctx.lineTo(px - radius, py);\n ctx.closePath();\n } else if (shape === 'square' || shape === 'rect') {\n const side = (size + offset) * 2 * scale;\n const rx = px - side / 2;\n const ry = py - side / 2;\n ctx.rect(rx, ry, side, side);\n } else {\n ctx.arc(px, py, radius, 0, Math.PI * 2);\n }\n}\n","/**\n * DGA 核心诊断规则库 (Zones Constants)\n * 包含所有图表的出厂默认故障区域定义(多边形顶点坐标、颜色及标识名)\n * 如:三角形区域、五边形区域、三比值空间区块、ETRA 平面区域\n */\nexport const TRIANGLE_ZONES_1 = [\n {\n name: 'PD', color: '#A0DC99',\n coordinates: [[1, 0, 0], [0.95, 0.05, 0], [0.95, 0, 0.05]]\n },\n {\n name: 'D1', color: '#77A3FC',\n coordinates: [[0.85, 0.15, 0], [0, 1, 0], [0, 0.75, 0.25], [0.6, 0.15, 0.25]]\n },\n {\n name: 'D2', color: '#E3F2FF',\n coordinates: [[0, 0.75, 0.25], [0, 0.28, 0.72], [0.32, 0.28, 0.40], [0.45, 0.15, 0.40], [0.6, 0.15, 0.25]]\n },\n {\n name: 'T1', color: '#CBE4FD',\n coordinates: [[0.95, 0.05, 0], [0.85, 0.05, 0.1], [0.9, 0, 0.1], [0.95, 0, 0.05]]\n },\n {\n name: 'T2', color: '#56AD4A',\n coordinates: [[0.85, 0.05, 0.1], [0.45, 0.05, 0.50], [0.5, 0, 0.5], [0.9, 0, 0.1]]\n },\n {\n name: 'T3', color: '#5490FF',\n coordinates: [[0.5, 0, 0.5], [0.35, 0.15, 0.50], [0, 0.15, 0.85], [0, 0, 1]]\n },\n {\n name: 'DT', color: '#313CFF',\n coordinates: [[0.95, 0.05, 0], [0.85, 0.15, 0], [0.45, 0.15, 0.40], [0.32, 0.28, 0.40], [0, 0.28, 0.72], [0, 0.15, 0.85], [0.35, 0.15, 0.50], [0.45, 0.05, 0.50]]\n },\n];\n\nexport const TRIANGLE_ZONES_4 = [\n {\n name: 'PD', color: '#A0DC99',\n coordinates: [[0.975, 0, 0.025], [0.955, 0.02, 0.025], [0.83, 0.02, 0.15], [0.85, 0, 0.15]]\n },\n {\n name: 'S', color: '#313CFF',\n coordinates: [[1, 0, 0], [0.45, 0.55, 0], [0.08, 0.52, 0.40], [0.08, 0.30, 0.62], [0.15, 0.30, 0.55], [0.15, 0.25, 0.60], [0.4, 0.25, 0.35], [0.65, 0, 0.35], [0.85, 0, 0.15], [0.83, 0.02, 0.15], [0.955, 0.02, 0.025], [0.975, 0, 0.025]]\n },\n {\n name: 'C', color: '#3587FF',\n coordinates: [[0.65, 0, 0.35], [0.4, 0.25, 0.35], [0.15, 0.25, 0.60], [0.15, 0.30, 0.55], [0, 0.3, 0.7], [0, 0, 1]]\n },\n {\n name: 'O', color: '#6AA4FF',\n coordinates: [[0.08, 0.92, 0], [0, 1, 0], [0, 0.3, 0.7], [0.08, 0.3, 0.62]]\n },\n {\n name: 'ND', color: '#BEE1FD',\n coordinates: [[0.45, 0.55, 0], [0.08, 0.92, 0], [0.08, 0.52, 0.40],]\n },\n];\n\nexport const TRIANGLE_ZONES_5 = [\n {\n name: 'PD', color: '#A0DC99',\n coordinates: [[0.85, 0.15, 0], [0.83, 0.15, 0.02], [0.96, 0.02, 0.02], [0.98, 0.02, 0]]\n },\n {\n name: 'T2', color: '#56AD4A',\n coordinates: [[0.9, 0, 0.1], [0.65, 0, 0.35], [0.525, 0.125, 0.35], [0.775, 0.125, 0.1]]\n },\n\n {\n name: 'S', color: '#313CFF',\n coordinates: [[0.85, 0.15, 0], [0.35, 0.65, 0], [0.25, 0.65, 0.1], [0.75, 0.15, 0.1],]\n },\n {\n name: 'C', color: '#3587FF',\n coordinates: [[0.6, 0.3, 0.1], [0, 0.3, 0.7], [0.15, 0.15, 0.7], [0.35, 0.15, 0.5], [0.375, 0.125, 0.5], [0.775, 0.125, 0.1]]\n },\n {\n name: 'O', color: '#6AA4FF',\n coordinates: [[1, 0, 0], [0.98, 0.02, 0], [0.96, 0.02, 0.02], [0.83, 0.15, 0.02], [0.85, 0.15, 0], [0, 1, 0], [0, 0.9, 0.1], [0.35, 0.55, 0.1], [0.45, 0.55, 0], [0.85, 0.15, 0], [0.75, 0.15, 0.1], [0.9, 0, 0.1]]\n },\n {\n name: 'T3-H', color: '#77A3FC',\n coordinates: [[0.35, 0.3, 0.35], [0, 0.65, 0.35], [0, 0, 1], [0.65, 0, 0.35], [0.525, 0.125, 0.35], [0.375, 0.125, 0.5], [0.35, 0.15, 0.5], [0.15, 0.15, 0.7], [0, 0.3, 0.7]],\n labelAt: [0.1, 0.42, 0.48]\n },\n {\n name: 'ND', color: '#E3F2FF',\n coordinates: [[0.6, 0.3, 0.1], [0, 0.9, 0.1], [0, 0.65, 0.35], [0.35, 0.3, 0.35]]\n },\n];\n\nexport const PENTAGON_ZONES_1 = [\n {\n name: 'PD',\n title: '电晕型局部放电',\n color: '#A0DC99',\n coordinates: [\n [0, 33],\n [-1, 33],\n [-1, 24.5],\n [0, 24.5],\n ],\n },\n {\n name: 'D1',\n title: '低能量放电或火花型局部放电',\n color: '#81ADFF',\n coordinates: [\n [0, 40],\n [38, 12],\n [32, -6.1],\n [4, 16],\n [0, 1.5],\n ],\n },\n {\n name: 'D2',\n title: '高能量放电',\n color: '#E3F2FF',\n coordinates: [\n [4, 16],\n [32, -6.1],\n [24.3, -30],\n [0, -3],\n [0, 1.5],\n ],\n },\n {\n name: 'T3',\n title: '过热故障,t>700℃',\n color: '#5490FF',\n coordinates: [\n [0, -3],\n [24.3, -30],\n [23.5, -32.4],\n [1, -32.4],\n [-6, -4],\n ],\n },\n {\n name: 'T2',\n title: '过热故障,300℃<t<700℃',\n color: '#56AD4A',\n coordinates: [\n [-6, -4],\n [1, -32.4],\n [-22.5, -32.4],\n ],\n },\n {\n name: 'T1',\n title: '过热故障,t<300℃',\n color: '#CBE4FD',\n coordinates: [\n [-6, -4],\n [-22.5, -32.4],\n [-23.5, -32.4],\n [-35, 3],\n [0, 1.5],\n [0, -3],\n ],\n },\n {\n name: 'S',\n title: '温度<200℃时的杂散气体',\n color: '#2735FF',\n coordinates: [\n [0, 1.5],\n [-35, 3.1],\n [-38, 12.4],\n [0, 40],\n [0, 33],\n [-1, 33],\n [-1, 24.5],\n [0, 24.5],\n ],\n },\n];\n\nexport const PENTAGON_ZONES_2 = [\n {\n \"name\": \"PD\",\n \"title\": \"电晕型局部放电\",\n \"color\": \"#A0DC99\",\n \"coordinates\": [\n [0, 33],\n [-1, 33],\n [-1, 24.5],\n [0, 24.5]\n ]\n },\n {\n \"name\": \"D1\",\n \"title\": \"低能量放电或火花型局部放电\",\n \"color\": \"#81ADFF\",\n \"coordinates\": [\n [0, 40],\n [38, 12],\n [32, -6.1],\n [4, 16],\n [0, 1.5]\n ]\n },\n {\n \"name\": \"D2\",\n \"title\": \"高能量放电\",\n \"color\": \"#E3F2FF\",\n \"coordinates\": [\n [4, 16],\n [32, -6.1],\n [24.3, -30],\n [0, -3],\n [0, 1.5]\n ]\n },\n {\n \"name\": \"S\",\n \"title\": \"温度<200℃时的杂散气体\",\n \"color\": \"#2735FF\",\n \"coordinates\": [\n [0, 1.5],\n [-35, 3.1],\n [-38, 12.4],\n [0, 40],\n [0, 33],\n [-1, 33],\n [-1, 24.5],\n [0, 24.5]\n ]\n },\n {\n \"name\": \"T3-H\",\n \"title\": \"——仅矿物油过热\",\n \"color\": \"#25A53D\",\n \"coordinates\": [\n [0, -3],\n [24.3, -30],\n [23.5, -32.4],\n [2.5, -32.4],\n [-3.5, -3]\n ]\n },\n {\n \"name\": \"C\",\n \"title\": \"绝缘纸可能碳化\",\n \"color\": \"#3587FF\",\n \"coordinates\": [\n [-3.5, -3],\n [2.5, -32.4],\n [-21.5, -32.4],\n [-11, -8]\n ]\n },\n {\n \"name\": \"O\",\n \"title\": \"过热温度<250℃,绝缘纸不碳化\",\n \"color\": \"#6AA4FF\",\n \"coordinates\": [\n [-3.5, -3],\n [-11, -8],\n [-21.5, -32.4],\n [-23.5, -32.4],\n [-35, 3.1],\n [0, 1.5],\n [0, -3]\n ]\n }\n];\n\nexport const ETRA_ZONES_A = [\n {\n name: 'D1/PD', title: '局部放电',\n color: '#51b4c8',\n coordinates: [[-2, 3], [3, 3], [3, 0], [-2, 0]] // Y >= 1 (logY >= 0), full X\n },\n {\n name: 'T3/DT', title: '高温热故障/放电+热',\n color: '#fe9d37',\n coordinates: [[-2, 0], [3, 0], [3, -2], [-2, -2]] // -2 <= logY <= 0, full X\n },\n {\n name: 'T1', title: '过热故障,t<300℃',\n color: '#df4d41',\n coordinates: [[-2, -2], [0, -2], [0, -3], [-2, -3]]\n },\n {\n name: 'T2', title: '过热故障,300℃<t<700℃',\n color: '#458be6',\n coordinates: [[0, -2], [0.4, -2], [0.4, -3], [0, -3]]\n },\n {\n name: 'T3', title: '过热故障,t>700℃',\n color: '#8c2fae',\n coordinates: [[0.4, -2], [3, -2], [3, -3], [0.4, -3]]\n }\n];\n\nexport const ETRA_ZONES_B = [\n {\n name: 'D2', title: '高能放电',\n color: '#63a856',\n // Y >= 10 AND X >= 10 → logY>=1, logX>=1\n coordinates: [[-2, 3], [3, 3], [3, 0], [1, 0], [1, 1], [-2, 1]]\n },\n {\n name: 'D1', title: '低能放电',\n color: '#f16335',\n // L-shape: Y>=1 AND X<10\n // = (logY in [0,3], logX in [-2,1])\n coordinates: [[-2, 1], [1, 1], [1, 0], [-2, 0]]\n },\n {\n name: 'PD', title: '局部放电',\n color: '#53b7cc',\n coordinates: [[-2, 0], [0, 0], [0, -2], [-2, -2]]\n },\n {\n name: 'T3/DT', title: '高温热/放电+热',\n color: '#fe9d37',\n coordinates: [[0, 0], [3, 0], [3, -2], [0, -2]]\n },\n {\n name: 'T1', title: '过热故障,t<300℃',\n color: '#df4d41',\n coordinates: [[-2, -2], [0, -2], [0, -3], [-2, -3]]\n },\n {\n name: 'T2', title: '过热故障,300℃<t<700℃',\n color: '#458be6',\n coordinates: [[0, -2], [0.4, -2], [0.4, -3], [0, -3]]\n },\n {\n name: 'T3', title: '过热故障,t>700℃',\n color: '#8c2fae',\n coordinates: [[0.4, -2], [3, -2], [3, -3], [0.4, -3]]\n }\n];\nexport const THREE_RADIO_ZONES = [\n {\n name: 'PD', title: '电晕型局部放电',\n color: '#09FAFF',\n coordinates: [[0, 0, 0], [0.2, 0.1, 0.01]], // 结束坐标点\n },\n {\n name: 'T1', title: '过热故障,t<300℃',\n color: '#EC9B9A',\n coordinates: [[0, 1, 0], [1, 10, 0.01]],\n },\n {\n name: 'T2', title: '过热故障,300℃<t<700℃',\n color: '#A0C9F5',\n coordinates: [[1, 1, 0], [4, 10, 0.1]],\n },\n {\n name: 'T3', title: '过热故障,t>700℃',\n color: '#CA677B',\n coordinates: [[4, 1, 0], [10, 10, 0.2]],\n },\n {\n name: 'D1', title: '低能量放电火花型局部放电',\n color: '#FF7B16',\n coordinates: [[1, 0.1, 1], [10, 0.5, 10]],\n },\n {\n name: 'D2', title: '高能量放电',\n color: '#48FF16',\n coordinates: [[2, 0.1, 0.6], [10, 1, 2.5]],\n },\n];\nexport function computedPercent(values) {\n if (!Array.isArray(values)) return [];\n const nums = values.map(v => Math.max(Number(v) || 0, 0));\n const total = nums.reduce((sum, n) => sum + n, 0);\n if (total === 0) return nums.map(() => 0);\n return nums.map(n => {\n const pct = (n / total) * 100;\n return Math.round(pct * 100) / 100;\n });\n}\n\nfunction _pentagonRatioToDoc(H2, C2H2, C2H4, CH4, C2H6) {\n const vals = [H2, C2H2, C2H4, CH4, C2H6].map(v => Math.max(0, Number(v) || 0));\n const total = vals.reduce((s, v) => s + v, 0);\n if (total <= 0) return null;\n const ratio = vals.map(v => v / total);\n const R = 40;\n const angles = [90, 18, -54, -126, 162];\n let x = 0, y = 0;\n for (let i = 0; i < 5; i++) {\n const a = angles[i] * Math.PI / 180;\n x += ratio[i] * R * Math.cos(a);\n y += ratio[i] * R * Math.sin(a);\n }\n return { x, y, ratio };\n}\n\nfunction _inPentagonPoly(px, py, poly) {\n let inside = false;\n for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n const [xi, yi] = poly[i], [xj, yj] = poly[j];\n if ((yi > py) !== (yj > py) && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi) {\n inside = !inside;\n }\n }\n return inside;\n}\n\nexport const DiagnosticTools = {\n duvalTriangle1: (CH4, C2H4, C2H2) => {\n const total = CH4 + C2H4 + C2H2;\n if (total <= 0) return { code: \"INVALID\", label: \"无效输入\" };\n const [ch4, c2h4, c2h2] = computedPercent([CH4, C2H4, C2H2]);\n if (ch4 >= 98) return { code: \"PD\", label: \"局部放电\" };\n if (c2h4 >= 23 && c2h2 <= 13) return { code: \"D1\", label: \"低能放电\" };\n if (c2h4 >= 23 && c2h4 <= 40 && c2h2 >= 13 && c2h2 <= 29) return { code: \"D2\", label: \"高能放电\" };\n if (c2h2 <= 4 && c2h4 <= 20) return { code: \"T1\", label: \"热故障(t < 300℃)\" };\n if (c2h2 <= 4 && c2h4 > 20 && c2h4 <= 50) return { code: \"T2\", label: \"热故障(300℃ < t < 700℃)\" };\n if (c2h2 <= 15 && c2h4 >= 50) return { code: \"T3\", label: \"热故障(t > 700℃)\" };\n return { code: \"ND\", label: \"区域未定义\" };\n },\n duvalTriangle4: (H2, C2H6, CH4) => {\n const total = H2 + C2H6 + CH4;\n if (total <= 0) return { code: \"INVALID\", label: \"无效输入\" };\n const [h2, c2h6, ch4] = computedPercent([H2, C2H6, CH4]);\n if (c2h6 >= 1 && ch4 >= 2 && ch4 <= 15) return { code: \"PD\", label: \"电晕型局部放电\" };\n if (h2 <= 9 && c2h6 >= 24 && c2h6 <= 46 && ch4 <= 36) return { code: \"S\", label: '温度<200℃时的杂散气体' };\n if (h2 <= 9 && c2h6 <= 30) return { code: \"O\", label: \"过热温度<250℃,绝缘纸不碳化\" };\n if (c2h6 >= 24 && c2h6 <= 30 && ch4 >= 36) return { code: \"C\", label: \"绝缘纸可能碳化\" };\n return { code: \"ND\", label: \"区域未定义\" };\n },\n duvalTriangle5: (CH4, C2H4, C2H6) => {\n const total = CH4 + C2H4 + C2H6;\n if (total <= 0) return { code: \"INVALID\", label: \"无效输入\" };\n const [ch4, c2h4, c2h6] = computedPercent([CH4, C2H4, C2H6]);\n if (ch4 >= 85 && ch4 <= 100 && c2h6 >= 0 && c2h6 <= 15) return { code: \"PD\", label: \"电晕型局部放电\" };\n if ((c2h4 >= 35 && c2h4 <= 100 && c2h6 >= 0 && c2h6 <= 14) ||\n (c2h4 >= 35 && c2h4 <= 70 && c2h6 >= 30 && c2h6 <= 75)) return { code: \"T3\", label: \"高温过热故障(t > 700℃)\" };\n if (c2h4 >= 10 && c2h4 <= 35 && c2h6 >= 0 && c2h6 <= 12) return { code: \"T2\", label: \"中温过热故障(t > 300℃)\" };\n if (c2h4 >= 10 && c2h4 <= 70 && c2h6 >= 12 && c2h6 <= 30) return { code: \"C\", label: \"绝缘纸碳化故障\" };\n if (c2h4 <= 10 && c2h6 >= 15 && c2h6 <= 54) return { code: \"S\", label: \"矿物油杂散气体(低温过热 90℃~200℃)\" };\n if (c2h4 <= 10 && (c2h6 <= 15 || c2h6 >= 54)) return { code: \"O\", label: \"过热故障\" };\n return { code: \"ND\", label: \"区域未定义\" };\n },\n duvalPentagon1: (H2, CH4, C2H2, C2H4, C2H6) => {\n const pt = _pentagonRatioToDoc(H2, C2H2, C2H4, CH4, C2H6);\n if (!pt) return { code: 'INVALID', label: '无效输入', desc: '', color: '' };\n const { x, y } = pt;\n for (let i = 0; i < PENTAGON_ZONES_1.length - 1; i++) {\n const zone = PENTAGON_ZONES_1[i];\n if (_inPentagonPoly(x, y, zone.poly)) {\n return { code: zone.name, label: zone.title, desc: zone.desc, color: zone.color };\n }\n }\n const last = PENTAGON_ZONES_1[PENTAGON_ZONES_1.length - 1];\n return { code: last.name, label: last.title, desc: last.desc, color: last.color };\n },\n duvalPentagon2: (H2, CH4, C2H2, C2H4, C2H6) => {\n const pt = _pentagonRatioToDoc(H2, C2H2, C2H4, CH4, C2H6);\n if (!pt) return { code: 'INVALID', label: '无效输入', desc: '', color: '' };\n const { x, y } = pt;\n for (let i = 0; i < PENTAGON_ZONES_2.length - 1; i++) {\n const zone = PENTAGON_ZONES_2[i];\n if (_inPentagonPoly(x, y, zone.poly)) {\n return { code: zone.name, label: zone.title, desc: zone.desc, color: zone.color };\n }\n }\n const last = PENTAGON_ZONES_2[PENTAGON_ZONES_2.length - 1];\n return { code: last.name, label: last.title, desc: last.desc, color: last.color };\n },\n};\n","/**\n * DGA Duval 五边形类 (Pentagon Chart)\n * 包含: DuvalPentagon 核心图表组件类、多边形数学映射计算与 Canvas 渲染逻辑\n * 用于变压器溶解气体分析的故障诊断\n */\nimport { inPoly, hexToRgba, deepMerge, EventBus, ZoomController, DOMTooltip, parseGridBox, drawShapePath, DEFAULT_COLORS } from './utils.js';\n\nfunction colorToRgba(color, alpha) {\n if (!color) return `rgba(0,0,0,${alpha})`;\n if (color.startsWith('#')) {\n return hexToRgba(color, alpha);\n }\n if (color.startsWith('rgb')) {\n return color.replace(/rgb(a)?\\(([^)]+)\\)/, (m, a, content) => {\n const parts = content.split(',');\n const r = parts[0].trim();\n const g = parts[1].trim();\n const b = parts[2].trim();\n return `rgba(${r},${g},${b},${alpha})`;\n });\n }\n return color;\n}\n\n/**\n * PentagonCoord — 坐标系核心\n * 提供 doc 坐标(文献原始)、ratio 向量(归一化比例)和 canvas 坐标(渲染内部)之间的转换\n *\n * * 两种坐标系:\n *\n * ① \"doc 坐标\"(文献原始)\n * R = 40,数学坐标(Y 向上),中心 (0, 0)\n * H2 顶点 = (0, 40),C2H2 = (38.04, 12.36) ...\n * 优点:与 Duval 2002 论文完全一致,直接可读\n *\n * ② \"ratio 向量\"(归一化比例)\n * [H2%, C2H2%, C2H4%, CH4%, C2H6%],合计 = 1\n * 优点:坐标系无关,可自定义 gasOrder/R/cx/cy\n *\n * ③ \"canvas 坐标\"(渲染内部,外部不感知)\n * R = S*0.385,canvas 坐标(Y 向下),中心 (cx, cy)\n * 仅在 draw 函数内部使用,外部 API 不暴露\n *\n * 关系:\n * doc → ratio → canvas\n * doc ← ratio ← canvas\n *\n * poly 字段支持两种格式(通过元素长度自动识别):\n * 长度 2 → doc 坐标 [x, y] 例:[24.3, -30]\n * 长度 5 → ratio 向量 [r0,r1,r2,r3,r4] 例:[0,0.05,0.95,0,0]\n *\n * series.data 支持两种格式:\n * 对象格式(气体浓度):{ H2: 120, C2H2: 5, ... }\n * doc 坐标格式: { x: 24.3, y: -30 }\n */\nexport class PentagonCoord {\n // doc 坐标系参数(固定)\n static DOC_R = 40;\n // 顶点角度(数学坐标,顺时针,H2 在顶部=90°)\n static DOC_ANGLES = [90, 18, -54, -126, 162]; // 度\n\n /**\n * 将 doc 坐标(R=40,Y向上)转换为归一化 ratio 向量\n * @param {number} x - doc 坐标系 x\n * @param {number} y - doc 坐标系 y\n * @returns {number[]|null} - 长度为5的 ratio 向量,或 null(如果在五边形外)\n */\n static docToRatio(x, y) {\n const R = PentagonCoord.DOC_R;\n const ang = PentagonCoord.DOC_ANGLES;\n const verts = ang.map((d) => {\n const a = (d * Math.PI) / 180;\n return [R * Math.cos(a), R * Math.sin(a)];\n });\n\n // 顶点精确匹配\n for (let i = 0; i < 5; i++) {\n if (Math.hypot(x - verts[i][0], y - verts[i][1]) < 0.5) {\n const r = [0, 0, 0, 0, 0];\n r[i] = 1;\n return r;\n }\n }\n\n // 边上精确插值\n for (let i = 0; i < 5; i++) {\n const j = (i + 1) % 5;\n const [ax, ay] = verts[i],\n [bx, by] = verts[j];\n const dx = bx - ax,\n dy = by - ay;\n const len2 = dx * dx + dy * dy;\n if (len2 < 1e-10) continue;\n const t = ((x - ax) * dx + (y - ay) * dy) / len2;\n if (t >= -1e-6 && t <= 1 + 1e-6) {\n const dist = Math.abs((y - ay) * dx - (x - ax) * dy) / Math.sqrt(len2);\n if (dist < 0.15) {\n const t2 = Math.max(0, Math.min(1, t));\n const r = [0, 0, 0, 0, 0];\n r[i] = 1 - t2;\n r[j] = t2;\n return r;\n }\n }\n }\n\n // 内部点:三角扇重心坐标(放宽 eps)\n for (let i = 0; i < 5; i++) {\n const v0 = [0, 0],\n v1 = verts[i],\n v2 = verts[(i + 1) % 5];\n const denom = (v1[1] - v2[1]) * (v0[0] - v2[0]) + (v2[0] - v1[0]) * (v0[1] - v2[1]);\n if (Math.abs(denom) < 1e-10) continue;\n const l0 = ((v1[1] - v2[1]) * (x - v2[0]) + (v2[0] - v1[0]) * (y - v2[1])) / denom;\n const l1 = ((v2[1] - v0[1]) * (x - v2[0]) + (v0[0] - v2[0]) * (y - v2[1])) / denom;\n const l2 = 1 - l0 - l1;\n if (l0 >= -0.01 && l1 >= -0.01 && l2 >= -0.01) {\n const r = new Array(5).fill(l0 / 5);\n r[i] += l1;\n r[(i + 1) % 5] += l2;\n const tot = r.reduce((s, v) => s + Math.max(0, v), 0);\n return r.map((v) => Math.max(0, v) / tot);\n }\n }\n return null;\n }\n\n /**\n * 将归一化 ratio 向量转换为 doc 坐标\n * @param {number[]} ratio - 长度为5的 ratio 向量\n * @returns {number[]} - [x, y] doc 坐标\n */\n static ratioToDoc(ratio) {\n const R = PentagonCoord.DOC_R;\n const ang = PentagonCoord.DOC_ANGLES;\n let x = 0,\n y = 0;\n for (let i = 0; i < 5; i++) {\n const a = (ang[i] * Math.PI) / 180;\n x += ratio[i] * R * Math.cos(a);\n y += ratio[i] * R * Math.sin(a);\n }\n return [x, y];\n }\n\n /**\n * 将 canvas 像素坐标转换为归一化 ratio 向量\n * @param {number} px - canvas 像素坐标 x\n * @param {number} py - canvas 像素坐标 y\n * @param {number} cx - 五边形中心 x\n * @param {number} cy - 五边形中心 y\n * @param {number} R - 五边形半径\n * @returns {number[]|null} - ratio 向量或 null\n */\n static canvasToRatio(px, py, cx, cy, R) {\n const verts = Array.from({ length: 5 }, (_, i) => PentagonCoord.canvasVertex(i, cx, cy, R));\n if (!inPoly(px, py, verts)) return null;\n\n for (let i = 0; i < 5; i++) {\n const v0 = [cx, cy],\n v1 = verts[i],\n v2 = verts[(i + 1) % 5];\n const denom = (v1[1] - v2[1]) * (v0[0] - v2[0]) + (v2[0] - v1[0]) * (v0[1] - v2[1]);\n if (Math.abs(denom) < 1e-10) continue;\n const l0 = ((v1[1] - v2[1]) * (px - v2[0]) + (v2[0] - v1[0]) * (py - v2[1])) / denom;\n const l1 = ((v2[1] - v0[1]) * (px - v2[0]) + (v0[0] - v2[0]) * (py - v2[1])) / denom;\n const l2 = 1 - l0 - l1;\n if (l0 >= -1e-9 && l1 >= -1e-9 && l2 >= -1e-9) {\n const r = new Array(5).fill(l0 / 5);\n r[i] += l1;\n r[(i + 1) % 5] += l2;\n const tot = r.reduce((s, v) => s + Math.max(0, v), 0);\n return r.map((v) => Math.max(0, v) / tot);\n }\n }\n return null;\n }\n\n // canvas 顶点坐标(Y 向下,从顶部 12 点顺时针)\n static canvasVertex(i, cx, cy, R) {\n const a = -Math.PI / 2 + (i * 2 * Math.PI) / 5;\n return [cx + R * Math.cos(a), cy + R * Math.sin(a)];\n }\n\n // doc 坐标 → canvas 坐标(直接线性映射)\n static docToCanvas(x, y, cx, cy, R) {\n return [\n cx + (x / PentagonCoord.DOC_R) * R,\n cy - (y / PentagonCoord.DOC_R) * R, // Y 轴反转\n ];\n }\n\n // poly 统一解析 → canvas 点数组\n static polyToCanvas(polyPoint, cx, cy, R) {\n if (polyPoint.length === 2) {\n return PentagonCoord.docToCanvas(polyPoint[0], polyPoint[1], cx, cy, R);\n }\n let x = 0,\n y = 0;\n for (let i = 0; i < 5; i++) {\n const [vx, vy] = PentagonCoord.canvasVertex(i, cx, cy, R);\n x += polyPoint[i] * vx;\n y += polyPoint[i] * vy;\n }\n return [x, y];\n }\n /**\n * 将任意格式的 series.data 解析为归一化 ratio 向量\n * @param {object|number[]} data - 待解析的数据\n * @param {string[]} gasOrder - 气体顺序\n * @returns {number[]|null} - ratio 向量或 null\n */\n static resolveData(data, gasOrder) {\n if (!data) return null;\n\n if (Array.isArray(data)) {\n const isObj = data.length > 0 && data[0] && typeof data[0] === 'object';\n let vals;\n if (isObj && gasOrder) {\n vals = gasOrder.map(k => {\n const item = data.find(d => d.name === k);\n return Math.max(0, (item ? item.value : 0) || 0);\n });\n } else {\n vals = data.map((v) => Math.max(0, v || 0));\n }\n const total = vals.reduce((s, v) => s + v, 0);\n if (total <= 1e-9) return null;\n return vals.map((v) => v / total);\n }\n\n if ('x' in data && 'y' in data) {\n return PentagonCoord.docToRatio(data.x, data.y);\n }\n\n return null;\n }\n\n // ratio → doc 坐标字符串(调试/显示用)\n static ratioToDocStr(ratio, decimals = 1) {\n const [x, y] = PentagonCoord.ratioToDoc(ratio);\n return `(${x.toFixed(decimals)}, ${y.toFixed(decimals)})`;\n }\n}\n\n/**\n * ThemeManager — 主题管理系统\n * 内置 DARK/LIGHT 主题,并支持用户通过 setOption 覆盖任意字段\n */\nexport class ThemeManager {\n static DARK = {\n backgroundColor: 'transparent', // 画布背景色\n pointStyle: {\n itemStyle: {\n shape: 'circle',\n radius: 3,\n color: '#00e5ff',\n borderColor: '#ffffff',\n borderWidth: 0.5,\n },\n textStyle: {\n show: false,\n fontSize: 11,\n color: '#00e5ff',\n position: 'top',\n }\n },\n vertex: {\n show: true,\n labelStyle: {\n color: '#01FFE1',\n fontStyle: 'normal',\n fontWeight: 'bold',\n fontSize: 14,\n }\n },\n grid: {\n show: false,\n lineStyle: {\n lineType: 'solid',\n lineWidth: 1.0,\n lineColor: 'rgba(0, 229, 255, 0.15)',\n }\n },\n zone: {\n alpha: 0.75,\n labelStyle: {\n show: true,\n color: '#ffffff',\n fontStyle: 'bold',\n fontSize: 12,\n letterSpacing: 0,\n textShadow: 'rgba(0,0,0,0.85)',\n padding: [4, 8],\n borderRadius: 4,\n backgroundColor: 'transparent'\n },\n borderStyle: {\n show: true,\n width: 1.0,\n type: 'solid',\n color: 'rgba(255, 255, 255, 0.25)'\n }\n },\n tooltip: {\n show: true,\n backgroundColor: 'rgba(6, 13, 31, 0.93)',\n textStyle: {\n color: '#c8ddf0',\n fontStyle: '',\n fontWeight: '',\n fontSize: 12,\n },\n padding: 10\n },\n fontFamily: 'Rajdhani, sans-serif', // 全局字体\n };\n\n static LIGHT = {\n backgroundColor: 'transparent', // 画布背景色\n pointStyle: {\n itemStyle: {\n shape: 'circle',\n radius: 3,\n color: '#1d4ed8',\n borderColor: '#ffffff',\n borderWidth: 0.5,\n },\n textStyle: {\n show: false,\n fontSize: 11,\n color: '#1d4ed8',\n position: 'top',\n }\n },\n vertex: {\n show: true,\n labelStyle: {\n color: '#1d4ed8',\n fontStyle: 'normal',\n fontWeight: 'bold',\n fontSize: 14,\n }\n },\n grid: {\n show: false,\n lineStyle: {\n lineType: 'solid',\n lineWidth: 1.0,\n lineColor: 'rgba(29, 78, 216, 0.15)',\n }\n },\n zone: {\n labelStyle: {\n show: true,\n color: '#1e293b',\n fontStyle: 'bold',\n fontSize: 11,\n letterSpacing: 0,\n textShadow: 'rgba(255,255,255,0.8)',\n padding: [4, 8],\n borderRadius: 4,\n backgroundColor: 'transparent'\n },\n borderStyle: {\n show: true,\n width: 1.0,\n type: 'solid',\n color: 'rgba(0, 0, 0, 0.25)'\n }\n },\n tooltip: {\n show: true,\n backgroundColor: 'rgba(240, 244, 248, 0.96)',\n textStyle: {\n color: '#334155',\n fontStyle: '',\n fontWeight: '',\n fontSize: 12,\n },\n padding: 10\n },\n fontFamily: 'Rajdhani, sans-serif', // 全局字体\n };\n\n static resolve(theme) {\n if (!theme || theme === 'dark') return { ...ThemeManager.DARK };\n if (theme === 'light') return { ...ThemeManager.LIGHT };\n return deepMerge({ ...ThemeManager.DARK }, theme);\n }\n}\n\n/**\n * ZoneRenderer — 故障区域渲染器\n * 绘制五边形背景区域和标识文字,并根据坐标判定当前所在的诊断区域\n */\nexport class ZoneRenderer {\n /**\n * 根据 ratio 向量诊断所在故障区域\n * @param {number[]} ratio - 待诊断的 ratio 向量\n * @param {object} zoneOpt - 区域配置对象\n * @param {number} cx - 中心点 x\n * @param {number} cy - 中心点 y\n * @param {number} R - 半径\n * @returns {object} - 匹配的区域对象\n */\n static diagnose(ratio, zoneOpt, cx, cy, R) {\n const data = (zoneOpt && Array.isArray(zoneOpt.data)) ? zoneOpt.data : [];\n if (!data.length) return null;\n const [px, py] = PentagonCoord.polyToCanvas(ratio, cx, cy, R);\n for (let i = 0; i < data.length - 1; i++) {\n if (!data[i].coordinates || !data[i].coordinates.length) continue;\n const poly = data[i].coordinates.map((p) => PentagonCoord.polyToCanvas(p, cx, cy, R));\n if (inPoly(px, py, poly)) return data[i];\n }\n return data[data.length - 1];\n }\n\n /**\n * 绘制所有故障区域\n * @param {CanvasRenderingContext2D} ctx - Canvas 2D 上下文\n * @param {object} zoneOpt - 区域配置对象\n * @param {object} theme - 主题配置\n * @param {number} cx - 中心点 x\n * @param {number} cy - 中心点 y\n * @param {number} R - 半径\n * @param {number} S - 容器尺寸\n */\n static draw(ctx, zoneOpt, theme, cx, cy, R, S) {\n const data = (zoneOpt && Array.isArray(zoneOpt.data)) ? zoneOpt.data : [];\n const gLabel = zoneOpt.labelStyle || {};\n const gBorder = zoneOpt.borderStyle || {};\n const gAlpha = zoneOpt.alpha;\n const colors = zoneOpt.colors || theme.colors || DEFAULT_COLORS;\n\n // 1. 绘制背景区域\n data.forEach((z, i) => {\n if (!z.coordinates || !z.coordinates.length) return;\n const pts = z.coordinates.map((p) => PentagonCoord.polyToCanvas(p, cx, cy, R));\n ctx.beginPath();\n pts.forEach(([x, y], j) => (j === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\n ctx.closePath();\n\n let baseColor = z.color || colors[i % colors.length];\n if (gAlpha !== undefined && baseColor !== 'transparent') {\n baseColor = colorToRgba(baseColor, gAlpha);\n }\n ctx.fillStyle = baseColor;\n ctx.fill();\n });\n\n // 2. 绘制边框\n data.forEach((z, i) => {\n const bStyle = gBorder;\n if (bStyle.show === false || !z.coordinates || !z.coordinates.length) return;\n\n const pts = z.coordinates.map((p) => PentagonCoord.polyToCanvas(p, cx, cy, R));\n ctx.beginPath();\n pts.forEach(([x, y], j) => (j === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\n ctx.closePath();\n\n let borderColor = bStyle.color || z.color || colors[i % colors.length];\n if (bStyle.alpha !== undefined && borderColor !== 'transparent') {\n borderColor = colorToRgba(borderColor, bStyle.alpha);\n }\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = bStyle.width ?? 1.0;\n\n if (bStyle.type === 'dashed') {\n ctx.setLineDash([4, 4]);\n } else if (bStyle.type === 'dotted') {\n ctx.setLineDash([2, 4]);\n } else {\n ctx.setLineDash([]);\n }\n ctx.stroke();\n });\n ctx.setLineDash([]); // 重置虚线\n\n // 3. 绘制文字标签\n const ff = theme.fontFamily || 'Rajdhani, sans-serif';\n\n for (const z of data) {\n const lStyle = gLabel;\n if (lStyle.show === false || !z.name) continue;\n\n const pts = z.coordinates ? z.coordinates.map((p) => PentagonCoord.polyToCanvas(p, cx, cy, R)) : [];\n let lx, ly;\n if (z.labelAt && Array.isArray(z.labelAt)) {\n [lx, ly] = PentagonCoord.polyToCanvas(z.labelAt, cx, cy, R);\n } else if (pts.length > 0) {\n lx = pts.reduce((s, p) => s + p[0], 0) / pts.length;\n ly = pts.reduce((s, p) => s + p[1], 0) / pts.length;\n } else {\n continue;\n }\n\n const fs = Math.round((lStyle.fontSize || theme.zoneLabelSize || 12) * (1));\n const fontStyle = lStyle.fontStyle || 'bold';\n ctx.font = `${fontStyle} ${fs}px ${ff}`;\n\n if (lStyle.letterSpacing !== undefined && 'letterSpacing' in ctx) {\n ctx.letterSpacing = `${lStyle.letterSpacing}px`;\n }\n\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n const text = typeof lStyle.formatter === 'function' ? lStyle.formatter(z) : z.name;\n const tw = ctx.measureText(text).width;\n const th = fs;\n\n // 绘制带圆角、内边距的背景\n if (lStyle.backgroundColor && lStyle.backgroundColor !== 'transparent') {\n let padX = 4, padY = 4;\n if (Array.isArray(lStyle.padding)) {\n padY = lStyle.padding[0];\n padX = lStyle.padding[1] !== undefined ? lStyle.padding[1] : padY;\n } else if (typeof lstyle.padding === 'number') {\n padX = padY = lstyle.padding;\n }\n padX *= (1);\n padY *= (1);\n\n const radius = (lStyle.borderRadius || 0) * (1);\n const bw = tw + padX * 2;\n const bh = th + padY * 2;\n const bx = lx - bw / 2;\n const by = ly - bh / 2;\n\n ctx.fillStyle = lStyle.backgroundColor;\n ctx.beginPath();\n if (ctx.roundRect) {\n ctx.roundRect(bx, by, bw, bh, radius);\n } else {\n ctx.rect(bx, by, bw, bh);\n }\n ctx.fill();\n }\n\n // 文本阴影\n if (lStyle.textShadow && lStyle.textShadow !== 'none') {\n ctx.shadowColor = lStyle.textShadow;\n ctx.shadowBlur = 4;\n } else {\n ctx.shadowColor = 'transparent';\n ctx.shadowBlur = 0;\n }\n\n ctx.fillStyle = lStyle.color || theme.zoneLabelColor || '#fff';\n ctx.fillText(text, lx, ly);\n\n // 恢复默认状态\n ctx.shadowBlur = 0;\n ctx.shadowColor = 'transparent';\n if ('letterSpacing' in ctx) ctx.letterSpacing = '0px';\n }\n }\n}\n\n/**\n * GridRenderer — 网格渲染器\n * 绘制五边形背景网格、五个顶点的气体标签、刻度线以及放射状轴线\n */\nexport class GridRenderer {\n static draw(ctx, vertexOpt, theme, cx, cy, R, S, gridOpt) {\n const scale = 1;\n const ff = theme.fontFamily || 'Rajdhani, sans-serif';\n\n if (gridOpt && gridOpt.show !== false) {\n const lineStyle = gridOpt.lineStyle || {};\n const lw = (lineStyle.lineWidth ?? 1) * scale;\n const lc = lineStyle.lineColor || '#e5e7eb';\n const lt = lineStyle.lineType || 'solid';\n\n ctx.strokeStyle = lc;\n ctx.lineWidth = lw;\n\n if (lt === 'dashed') {\n ctx.setLineDash([4, 4]);\n } else if (lt === 'dotted') {\n ctx.setLineDash([2, 4]);\n } else {\n ctx.setLineDash([]);\n }\n\n for (const f of [0.2, 0.4, 0.6, 0.8, 1.0]) {\n ctx.beginPath();\n for (let i = 0; i < 5; i++) {\n const [x, y] = PentagonCoord.canvasVertex(i, cx, cy, R * f);\n i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n }\n ctx.closePath();\n ctx.stroke();\n }\n for (let i = 0; i < 5; i++) {\n const [x, y] = PentagonCoord.canvasVertex(i, cx, cy, R);\n ctx.beginPath();\n ctx.moveTo(cx, cy);\n ctx.lineTo(x, y);\n ctx.stroke();\n }\n ctx.setLineDash([]); // 重置虚线\n }\n if (!vertexOpt || vertexOpt.show === false) return;\n const globalDist = vertexOpt.labelStyle?.distance !== undefined ? vertexOpt.labelStyle.distance : 27.2;\n\n vertexOpt.data.forEach((item, i) => {\n const style = item.labelStyle || {};\n const dist = style.distance !== undefined ? style.distance : globalDist;\n const distOffset = (typeof dist === 'string' && dist.endsWith('%'))\n ? (parseFloat(dist) / 100) * R\n : (parseFloat(dist) * scale);\n\n const [x, y] = PentagonCoord.canvasVertex(i, cx, cy, R + distOffset);\n const fontStyle = style.fontStyle || 'normal';\n const fontWeight = style.fontWeight || 'bold';\n const fontSize = Math.round((style.fontSize || theme.gasLabelSize || 14) * scale);\n ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${ff}`;\n ctx.fillStyle = style.color || theme.gasLabelColor || '#fff';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.shadowColor = theme.gasLabelShadow;\n ctx.shadowBlur = 7;\n ctx.fillText(item.name, x, y);\n ctx.shadowBlur = 0;\n });\n }\n}\n\nfunction parseRgba(color) {\n const cleaned = color.trim().toLowerCase();\n if (cleaned.startsWith('#')) {\n let hex = cleaned.slice(1);\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n const a = hex.length === 8 ? parseInt(hex.substring(6, 8), 16) / 255 : 1;\n return [r, g, b, a];\n }\n const m = cleaned.match(/rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\)/);\n if (m) {\n return [\n parseInt(m[1], 10),\n parseInt(m[2], 10),\n parseInt(m[3], 10),\n m[4] !== undefined ? parseFloat(m[4]) : 1\n ];\n }\n if (cleaned === 'transparent') return [0, 0, 0, 0];\n return [255, 255, 255, 1];\n}\n\nfunction interpolateColor(c1, c2, factor) {\n const [r1, g1, b1, a1] = parseRgba(c1);\n const [r2, g2, b2, a2] = parseRgba(c2);\n const r = Math.round(r1 + (r2 - r1) * factor);\n const g = Math.round(g1 + (g2 - g1) * factor);\n const b = Math.round(b1 + (b2 - b1) * factor);\n const a = a1 + (a2 - a1) * factor;\n return `rgba(${r},${g},${b},${a})`;\n}\n\n\n\n/**\n * PointRenderer — 数据点渲染器\n * 绘制圆、圆环、星形、三角形、正方形等形状的数据点,并支持辉光效果和名称标签\n */\nexport class PointRenderer {\n /**\n * 绘制数据点及其辉光、标签\n */\n static draw(ctx, series, theme, cx, cy, R, S, gasOrder, zoneOpt, hoverPoint) {\n if (!series || !series.data || !Array.isArray(series.data)) return [];\n\n const scale = 1;\n const ff = theme.fontFamily || 'Rajdhani, sans-serif';\n const results = [];\n\n const pt = series.data;\n if (!pt || pt.length === 0) return [];\n\n const ratio = PentagonCoord.resolveData(pt, gasOrder);\n if (!ratio) return [];\n\n const ptName = series.name;\n const shape = series.shape || 'circle';\n const color = series.color || '#409eff';\n let size = series.size !== undefined ? series.size : 5;\n\n const [px, py] = PentagonCoord.polyToCanvas(ratio, cx, cy, R);\n const zone = ZoneRenderer.diagnose(ratio, zoneOpt, cx, cy, R);\n const [docX, docY] = PentagonCoord.ratioToDoc(ratio);\n\n const isHov = hoverPoint && hoverPoint.series === series;\n if (isHov) size *= 1.5;\n\n const globalItemStyle = series.itemStyle || {};\n const borderColor = globalItemStyle.borderColor || '#fff';\n const borderWidth = globalItemStyle.borderWidth !== undefined ? globalItemStyle.borderWidth : 1;\n const opacity = globalItemStyle.opacity !== undefined ? globalItemStyle.opacity : 1;\n\n const globalTextStyle = series.textStyle || {};\n const textShow = globalTextStyle.show !== undefined ? globalTextStyle.show : true;\n const textColor = globalTextStyle.color || color;\n const textFontSize = globalTextStyle.fontSize !== undefined ? globalTextStyle.fontSize : 12;\n const textFontWeight = globalTextStyle.fontWeight || 'normal';\n const textPosition = globalTextStyle.position || 'top';\n const textOffset = globalTextStyle.offset || [0, 0];\n\n const globalGlowStyle = series.glowStyle || {};\n const glowShow = globalGlowStyle.show !== undefined ? globalGlowStyle.show : false;\n const glowColorsOpt = globalGlowStyle.colors;\n const glowBlur = globalGlowStyle.blur !== undefined ? globalGlowStyle.blur : 15;\n const glowStartColor = globalGlowStyle.startColor || color;\n const glowEndColor = globalGlowStyle.endColor || 'transparent';\n const glowCount = globalGlowStyle.count !== undefined ? globalGlowStyle.count : 3;\n const glowDistance = globalGlowStyle.glowDistance !== undefined ? globalGlowStyle.glowDistance : 2;\n\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Glow Style Rendering\n if (glowShow) {\n ctx.shadowColor = glowColorsOpt ? glowColorsOpt[0] : glowStartColor;\n ctx.shadowBlur = glowBlur;\n\n let glowColors = [];\n let layers = glowCount;\n\n if (Array.isArray(glowColorsOpt) && glowColorsOpt.length > 0) {\n glowColors = glowColorsOpt;\n layers = glowColors.length;\n } else {\n for (let i = 0; i < layers; i++) {\n const factor = layers > 1 ? i / (layers - 1) : 0;\n glowColors.push(interpolateColor(glowStartColor, glowEndColor, factor));\n }\n }\n\n for (let i = layers - 1; i >= 0; i--) {\n const glowColor = glowColors[i];\n ctx.save();\n ctx.fillStyle = glowColor;\n ctx.beginPath();\n drawShapePath(ctx, px, py, shape, size, scale, (i + 1) * glowDistance);\n ctx.fill();\n ctx.restore();\n }\n }\n\n // Point Shape Rendering\n ctx.beginPath();\n drawShapePath(ctx, px, py, shape, size, scale, 0);\n\n if (shape === 'ring') {\n ctx.strokeStyle = color;\n ctx.lineWidth = borderWidth * scale;\n ctx.stroke();\n } else {\n ctx.fillStyle = color;\n ctx.fill();\n if (borderWidth > 0) {\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = borderWidth * scale;\n ctx.stroke();\n }\n }\n ctx.restore();\n\n // Text/Label Rendering\n if (textShow && ptName) {\n ctx.save();\n ctx.globalAlpha = opacity;\n ctx.font = `${textFontWeight} ${Math.round(textFontSize * scale)}px ${ff}`;\n ctx.fillStyle = textColor;\n\n let textAlign = 'center';\n let textBaseline = 'middle';\n let tx = px + textOffset[0] * scale;\n let ty = py + textOffset[1] * scale;\n\n let offsetVal = 6 * scale;\n if (shape === 'circle' || shape === 'ring' || shape === 'star' || shape === 'triangle') {\n offsetVal += size * scale;\n } else if (shape === 'square') {\n offsetVal += size * scale / 2;\n }\n\n if (textPosition === 'top') {\n textAlign = 'center';\n textBaseline = 'bottom';\n ty -= offsetVal;\n } else if (textPosition === 'bottom') {\n textAlign = 'center';\n textBaseline = 'top';\n ty += offsetVal;\n } else if (textPosition === 'left') {\n textAlign = 'right';\n textBaseline = 'middle';\n tx -= offsetVal;\n } else if (textPosition === 'right') {\n textAlign = 'left';\n textBaseline = 'middle';\n tx += offsetVal;\n } else if (textPosition === 'center') {\n textAlign = 'center';\n textBaseline = 'middle';\n }\n\n ctx.textAlign = textAlign;\n ctx.textBaseline = textBaseline;\n\n ctx.fillText(ptName, tx, ty);\n ctx.restore();\n }\n\n results.push({\n ratio,\n zone,\n docX,\n docY,\n rawData: pt,\n name: ptName,\n series: series\n });\n\n\n return results;\n }\n}\n\n/**\n * HoverLayer — 悬浮交互层\n * 负责渲染悬浮交互相关的辅助 UI 元素(目前主要包含图表缩放状态徽章)。\n */\nexport class HoverLayer {\n\n /**\n * 绘制缩放状态徽章 (Zoom Badge)\n * 当图表处于放大状态时,在右下角显示当前的缩放比例及“双击重置”的提示\n * @param {CanvasRenderingContext2D} ctx - Canvas 2D 上下文\n * @param {number} zoom - 当前的缩放倍数\n * @param {number} S - 容器尺寸 (宽和高中的较小值),用于做自适应缩放计算\n * @param {object} theme - 主题配置对象,包含徽章背景、字体颜色等信息\n */\n static drawZoomBadge(ctx, zoom, S, theme) {\n if (zoom === 1) return;\n const scale = 1;\n const text = `${zoom.toFixed(2)}×`;\n const hint = ' 双击重置';\n const fs = Math.round(11 * scale);\n const pad = 6 * scale;\n const ff = theme.fontFamily || 'Rajdhani, sans-serif';\n ctx.font = `600 ${fs}px ${ff}`;\n const tw = ctx.measureText(text + hint).width;\n const bw = tw + pad * 2,\n bh = fs + pad * 1.8;\n const bx = S - bw - 8,\n by = S - bh - 8;\n ctx.fillStyle = theme.badgeBg;\n ctx.strokeStyle = theme.badgeBorderColor;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.roundRect(bx, by, bw, bh, 4);\n ctx.fill();\n ctx.stroke();\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillStyle = theme.badgeTextColor;\n ctx.fillText(text, bx + pad, by + bh / 2);\n ctx.fillStyle = theme.badgeHintColor || 'rgba(200,221,240,0.4)';\n ctx.fillText(hint, bx + pad + ctx.measureText(text).width, by + bh / 2);\n }\n}\n\nimport { PENTAGON_ZONES_1 } from './zones.js';\n\n/**\n * DuvalPentagon — 杜瓦五边形图表主类\n * 组合数学计算、渲染器和交互控制,对外提供 setOption、setSeries 等 API\n */\nexport class DuvalPentagon {\n static DEFAULT_ZONES = PENTAGON_ZONES_1;\n\n static DEFAULTS = {\n theme: 'dark',\n colors: DEFAULT_COLORS,\n vertex: {\n show: true,\n data: ['H2', 'C2H2', 'C2H4', 'CH4', 'C2H6']\n },\n zone: null,\n series: [],\n grid: {\n show: false\n },\n zoom: { min: 0.3, max: 6, step: 0.12 },\n tooltip: {\n show: true\n }\n };\n\n constructor(container, option = {}) {\n this._el = typeof container === 'string' ? document.getElementById(container) : container;\n if (!this._el) throw new Error(`DuvalPentagon: container not found — \"${container}\"`);\n\n this._theme = ThemeManager.resolve(option.theme || DuvalPentagon.DEFAULTS.theme);\n this._opt = deepMerge(deepMerge(deepMerge({}, DuvalPentagon.DEFAULTS), this._theme), option);\n this._normalizeOptions();\n\n this._bus = new EventBus();\n this._zoom = new ZoomController(this._opt.zoom);\n\n this._canvas = document.createElement('canvas');\n this._ctx = this._canvas.getContext('2d');\n Object.assign(this._canvas.style, { display: 'block', width: '100%', height: '100%' });\n this._el.appendChild(this._canvas);\n\n this._tooltipRenderer = new DOMTooltip(this._el, this._theme);\n\n this._hoverRatio = null;\n this._hoverZone = null;\n this._hoverPoint = null;\n\n this._bindEvents();\n this._observeResize();\n this._syncCanvas();\n this._renderFull();\n }\n\n _normalizeOptions() {\n\n // 标准化 vertex.data 并进行校验\n if (!this._opt.vertex.data) {\n this._opt.vertex.data = ['H2', 'C2H2', 'C2H4', 'CH4', 'C2H6'];\n }\n if (!Array.isArray(this._opt.vertex.data) || this._opt.vertex.data.length !== 5) {\n throw new Error(\"DuvalPentagon: vertex.data must be an array of exactly 5 elements.\");\n }\n const defaultLabelStyle = this._opt.vertex.labelStyle || {};\n this._opt.vertex.data = this._opt.vertex.data.map(item => {\n if (typeof item === 'string') {\n return {\n name: item,\n labelStyle: { ...defaultLabelStyle }\n };\n } else if (item && typeof item === 'object') {\n if (!item.name) {\n throw new Error(\"DuvalPentagon: each vertex object in vertex.data must have a 'name' property.\");\n }\n return {\n name: item.name,\n labelStyle: deepMerge({ ...defaultLabelStyle }, item.labelStyle || {})\n };\n } else {\n throw new Error(\"DuvalPentagon: vertex.data elements must be either strings or objects with a 'name' property.\");\n }\n });\n\n // 衍生出内部的 gasOrder 数组\n this._opt.gasOrder = this._opt.vertex.data.map(v => v.name);\n\n // 处理 zone 默认数据和数组/对象格式\n if (!this._opt.zone) {\n this._opt.zone = { data: DuvalPentagon.DEFAULT_ZONES };\n } else if (typeof this._opt.zone === 'object' && !this._opt.zone.data) {\n this._opt.zone.data = DuvalPentagon.DEFAULT_ZONES;\n }\n\n\n }\n\n /* 公开 API ─ */\n\n /**\n * 深度合并配置并重绘图表\n * @param {object} opt - 需要合并的配置项\n * @returns {DuvalPentagon} - 当前实例,支持链式调用\n */\n setOption(opt) {\n if (opt.theme !== undefined) {\n this._theme = ThemeManager.resolve(opt.theme);\n this._tooltipRenderer.updateTheme(this._theme);\n // 将新主题默认值与已有的完整配置进行深度合并,防止自定义配置丢失\n this._opt = deepMerge(deepMerge(deepMerge({}, DuvalPentagon.DEFAULTS), this._theme), this._opt);\n }\n deepMerge(this._opt, opt);\n this._normalizeOptions();\n this._syncCanvas();\n this._render();\n return this;\n }\n\n /**\n * 替换全部数据点并重绘\n * @param {object|object[]} series - 单个或多个数据点系列\n * @returns {DuvalPentagon} - 当前实例,支持链式调用\n */\n setSeries(series) {\n this._opt.series = Array.isArray(series) ? series : [series];\n this._renderFull();\n return this;\n }\n\n /**\n * 诊断指定的比值数据,返回命中的区域\n * @param {number[]} ratio - 五个比值数据数组\n * @returns {object|null} - 命中的故障区域对象\n */\n diagnose(ratio) {\n const { cx, cy, R } = this._dims();\n return ZoneRenderer.diagnose(ratio, this._opt.zone, cx, cy, R);\n }\n\n zoomReset() {\n this._zoom.reset();\n this._renderFull();\n return this;\n }\n\n on(ev, fn) {\n this._bus.on(ev, fn);\n return this;\n }\n off(ev, fn) {\n this._bus.off(ev, fn);\n return this;\n }\n\n dispose() {\n this._ro?.disconnect();\n this._tooltipRenderer.dispose();\n const c = this._canvas;\n if (c) {\n c.removeEventListener('wheel', this._onWheel);\n c.removeEventListener('mousedown', this._onDown);\n c.removeEventListener('mousemove', this._onMove);\n c.removeEventListener('mouseleave', this._onLeave);\n c.removeEventListener('dblclick', this._onDbl);\n c.parentNode?.removeChild(c);\n }\n window.removeEventListener('mouseup', this._onUp);\n this._bus.dispose();\n }\n\n /* 内部:事件绑定 */\n\n _bindEvents() {\n const c = this._canvas;\n\n this._onWheel = (e) => {\n e.preventDefault();\n const rect = c.getBoundingClientRect();\n const ax = (e.clientX - rect.left) * (this._cssW / rect.width);\n const ay = (e.clientY - rect.top) * (this._cssH / rect.height);\n this._zoom.onWheel(e.deltaY, ax, ay);\n this._bus.emit('zoom', this._zoom.state);\n this._renderFull();\n };\n\n this._onDown = (e) => {\n if (e.button !== 0) return;\n this._zoom.startDrag(e.clientX, e.clientY);\n c.style.cursor = 'grabbing';\n };\n\n this._onMove = (e) => {\n const rect = c.getBoundingClientRect();\n const scale = this._cssW / rect.width;\n if (this._zoom.moveDrag(e.clientX, e.clientY, scale)) {\n this._renderFull();\n return;\n }\n const lx = ((e.clientX - rect.left) * scale - this._zoom.panX) / this._zoom.zoom;\n const ly = ((e.clientY - rect.top) * scale - this._zoom.panY) / this._zoom.zoom;\n const { cx, cy, R, S } = this._dims();\n\n let hoveredPoint = null;\n let minDistance = Infinity;\n\n if (this._drawnResults) {\n for (const r of this._drawnResults) {\n const [px, py] = PentagonCoord.polyToCanvas(r.ratio, cx, cy, R);\n const pr = r.series.size || Math.max(5, S * 0.013);\n const dist = Math.hypot(px - lx, py - ly);\n if (dist < Math.max(pr * 1.5, 12) && dist < minDistance) {\n minDistance = dist;\n hoveredPoint = r;\n }\n }\n }\n\n const tooltipOpt = this._opt.tooltip || {};\n const showTooltip = tooltipOpt.show !== false;\n\n if (hoveredPoint && showTooltip) {\n c.style.cursor = 'pointer';\n this._hoverPoint = hoveredPoint;\n this._hoverRatio = hoveredPoint.ratio;\n this._hoverZone = hoveredPoint.zone;\n this._bus.emit('hover', {\n ratio: hoveredPoint.ratio,\n zone: hoveredPoint.zone,\n docX: hoveredPoint.docX,\n docY: hoveredPoint.docY,\n point: hoveredPoint.series,\n });\n } else {\n c.style.cursor = 'default';\n this._hoverPoint = null;\n const hr = PentagonCoord.canvasToRatio(lx, ly, cx, cy, R);\n if (hr && showTooltip) {\n this._hoverRatio = hr;\n this._hoverZone = ZoneRenderer.diagnose(hr, this._opt.zone, cx, cy, R);\n const [dx, dy] = PentagonCoord.ratioToDoc(hr);\n this._bus.emit('hover', { ratio: hr, zone: this._hoverZone, docX: dx, docY: dy });\n } else {\n this._hoverRatio = null;\n this._hoverZone = null;\n this._bus.emit('hover', null);\n }\n }\n this._renderFull();\n };\n\n this._onUp = () => {\n if (!this._zoom.endDrag()) return;\n c.style.cursor = this._hoverPoint ? 'pointer' : 'default';\n this._bus.emit('zoom', this._zoom.state);\n };\n\n this._onLeave = () => {\n this._hoverRatio = null;\n this._hoverZone = null;\n this._hoverPoint = null;\n this._bus.emit('hover', null);\n this._renderFull();\n };\n\n this._onDbl = () => {\n this.zoomReset();\n this._bus.emit('zoom', this._zoom.state);\n };\n\n c.addEventListener('wheel', this._onWheel, { passive: false });\n c.addEventListener('mousedown', this._onDown);\n c.addEventListener('mousemove', this._onMove);\n c.addEventListener('mouseleave', this._onLeave);\n c.addEventListener('dblclick', this._onDbl);\n window.addEventListener('mouseup', this._onUp);\n c.style.cursor = 'default';\n }\n\n _observeResize() {\n if (typeof ResizeObserver === 'undefined') return;\n this._ro = new ResizeObserver(() => {\n this._syncCanvas();\n this._renderFull();\n });\n this._ro.observe(this._el);\n }\n\n _syncCanvas() {\n const dpr = window.devicePixelRatio || 1;\n const w = this._el.clientWidth || 300;\n const h = this._el.clientHeight || 300;\n this._cssW = w;\n this._cssH = h;\n this._canvas.width = Math.round(w * dpr);\n this._canvas.height = Math.round(h * dpr);\n }\n\n _dims() {\n const W = this._cssW,\n H = this._cssH;\n const grid = this._opt?.grid || {};\n // If no grid left/top/right/bottom is set, fallback to original 0.385 * min(W,H)\n const hasGridMargin = grid.left !== undefined || grid.right !== undefined || grid.top !== undefined || grid.bottom !== undefined;\n\n if (!hasGridMargin) {\n const S = Math.min(W, H);\n return { W, H, S, cx: W / 2, cy: H / 2, R: S * 0.385 };\n }\n\n const box = parseGridBox(W, H, grid, 0); // Default to 0 padding if not specified but margins are used\n const availS = Math.min(box.availW, box.availH);\n const R = availS / 2;\n // Set S backward compatibly (R = S * 0.385 => S = R / 0.385)\n const S = R / 0.385;\n\n return { W, H, S, cx: box.cx, cy: box.cy, R };\n }\n\n _render() {\n this._hoverRatio = null;\n this._hoverZone = null;\n this._hoverPoint = null;\n this._renderFull();\n }\n\n /**\n * 核心渲染方法,绘制所有可见元素\n * @private\n */\n _renderFull() {\n const ctx = this._ctx;\n if (!ctx) return;\n const dpr = window.devicePixelRatio || 1;\n const { W, H, S, cx, cy, R } = this._dims();\n const th = this._theme;\n const gas = this._opt.gasOrder;\n const zoneOpt = this._opt.zone;\n const vertexOpt = this._opt.vertex;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, W, H);\n\n const bgColor = this._opt.backgroundColor || th.backgroundColor || 'transparent';\n if (bgColor && bgColor !== 'transparent') {\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, W, H);\n }\n\n ctx.save();\n this._zoom.applyTransform(ctx);\n\n ZoneRenderer.draw(ctx, zoneOpt, th, cx, cy, R, S);\n GridRenderer.draw(ctx, vertexOpt, th, cx, cy, R, S, this._opt.grid);\n\n const results = [];\n for (const s of this._opt.series || []) {\n const resList = PointRenderer.draw(ctx, s, th, cx, cy, R, S, gas, zoneOpt, this._hoverPoint);\n if (Array.isArray(resList)) {\n resList.forEach(res => {\n results.push({ series: s, ...res });\n });\n }\n }\n this._drawnResults = results;\n\n const tooltipOpt = this._opt.tooltip || {};\n const showTooltip = tooltipOpt.show !== false;\n\n if (showTooltip && this._hoverPoint) {\n let hx = 0, hy = 0;\n [hx, hy] = PentagonCoord.polyToCanvas(this._hoverRatio, cx, cy, R);\n\n const px = hx * this._zoom.zoom + this._zoom.panX;\n const py = hy * this._zoom.zoom + this._zoom.panY;\n\n let html = '';\n if (typeof tooltipOpt.formatter === 'function') {\n html = tooltipOpt.formatter({\n ratio: this._hoverRatio,\n zone: this._hoverZone,\n point: this._hoverPoint?.series,\n gasOrder: gas\n });\n } else {\n html = this._defaultTooltipHTML(this._hoverRatio, this._hoverZone, th, gas, this._hoverPoint);\n }\n this._tooltipRenderer.show(html, px, py, tooltipOpt, th, this._hoverZone);\n } else {\n this._tooltipRenderer.hide();\n }\n\n ctx.restore();\n // HoverLayer.drawZoomBadge(ctx, this._zoom.zoom, S, th);\n\n if (results.length > 0) this._bus.emit('diagnose', results);\n }\n\n _defaultTooltipHTML(ratio, zone, theme, gasOrder, hoverPoint) {\n const vertexData = this._opt.vertex?.data || [];\n const rawData = hoverPoint?.rawData;\n\n const ptName = hoverPoint?.name || 'Data Point';\n const pointNameStr = `<div style=\"font-size:14px; font-weight:bold; margin-bottom:4px; color:#fff;\">${ptName}</div>`;\n\n const zoneStr = zone ? `${zone.name || ''} ${zone.title || ''}`.trim() : 'Outside';\n const zoneColor = zone ? zone.color : '#fff';\n\n let html = `\n ${pointNameStr}\n <div style=\"color:${zoneColor}; font-size:13px; font-weight:bold; padding-bottom:8px; margin-bottom:8px; border-bottom:1px solid rgba(255,255,255,0.07);\">\n ${zoneStr}\n </div>\n `;\n\n gasOrder.forEach((key, i) => {\n const col = vertexData[i]?.labelStyle?.color || theme.vertex?.labelStyle?.color || '#fff';\n\n let rawValStr = '-';\n if (rawData) {\n if (Array.isArray(rawData)) {\n const item = rawData[i];\n if (item && typeof item === 'object') {\n const found = rawData.find(d => d.name === key);\n rawValStr = found && found.value !== undefined ? found.value : '-';\n } else {\n rawValStr = rawData[i] !== undefined ? rawData[i] : '-';\n }\n } else if (typeof rawData === 'object') {\n rawValStr = rawData[key] !== undefined ? rawData[key] : '-';\n }\n }\n\n html += `\n <div style=\"display:flex; align-items:center; margin-bottom:6px; font-size:13px;\">\n <span style=\"display:inline-block; width:8px; height:8px; border-radius:50%; background-color:${col}; margin-right:8px;\"></span>\n <span style=\"color:#cbd5e1; flex-grow:1;\">${key}</span>\n <span style=\"color:#fff; font-weight:bold; margin-left:20px;\">${rawValStr}</span>\n </div>\n `;\n });\n\n return html;\n }\n}\n","/**\n * DGA Duval 三角形类 (Triangle Chart)\n * 包含: TriangleConfig 配置, TriangleMath 数学逻辑, TriangleRenderer 渲染器, DuvalTriangle 组件类\n */\nimport { DOMTooltip, deepMerge, ZoomController, EventBus, parseGridBox, drawShapePath, DEFAULT_COLORS } from './utils.js';\n\n/**\n * TriangleConfig: 核心配置中心\n * 包含默认样式、网格、坐标轴及交互参数\n */\n\nimport { TRIANGLE_ZONES_1 } from './zones.js';\n\n/**\n * TriangleConfig: 图表的全局默认配置选项\n * 所有未传入的属性将自动回退到这里的定义\n */\nexport const TriangleConfig = Object.freeze({\n colors: DEFAULT_COLORS,\n zone: { data: TRIANGLE_ZONES_1, alpha: 0.75 },\n backgroundColor: '#050d1a',\n triFill: 'rgba(8,20,50,0)',\n grid: {\n show: true,\n steps: 10,\n majorEvery: 2,\n lineStyle: {\n color: 'rgba(255,255,255,0)',\n width: 1,\n type: 'solid'\n },\n majorLineStyle: {\n color: 'rgba(255,255,255,0)',\n width: 1,\n type: 'solid'\n },\n labelStyle: {\n color: 'rgba(200,220,255,0.8)',\n fontSize: 12,\n fontWeight: 'normal'\n },\n },\n side: {\n show: true,\n data: ['CH4', 'C2H2', 'C2H4'],\n labelStyle: {\n color: '#00e5ff',\n fontSize: 14,\n fontWeight: 'bold',\n offset: 40\n },\n tickStyle: {\n show: true,\n color: 'rgba(200,220,255)',\n fontSize: 14,\n offset: 15,\n length: 6,\n lineColor: 'rgba(0,0,0,0.2)'\n },\n lineStyle: {\n color: 'rgba(180,210,255,0.1)',\n width: 1.5,\n type: 'solid'\n }\n },\n tooltip: {\n show: true,\n backgroundColor: 'rgba(5,13,26,0.95)',\n borderColor: '#00e5ff',\n padding: 10,\n textStyle: {\n color: '#c8d8e8',\n fontSize: 12\n }\n },\n pointStyle: {\n itemStyle: {\n shape: 'circle',\n radius: 6,\n color: '#ff4081',\n borderWidth: 1.5,\n borderColor: 'rgba(255,255,255,0.7)',\n },\n textStyle: {\n show: true,\n fontSize: 12,\n color: '#00e5ff',\n position: 'top',\n }\n },\n});\n\n/**\n * TriangleMath: 封装所有三元坐标系相关的几何计算\n * 职责:坐标转换 (Triangle <-> Cartesian)、面积计算、质心计算\n */\nexport class TriangleMath {\n /** 计算等边三角形在给定视口下的顶点 */\n static computeTri(box) {\n const { availW, availH, cx, cy } = box;\n\n // 计算最大允许的等边三角形边长 (高 = 边长 * sin(60度))\n const S = Math.max(0, Math.min(availW, availH / Math.sin(Math.PI / 3)));\n const triH = S * Math.sin(Math.PI / 3);\n\n const startX = cx - S / 2;\n const startY = cy - triH / 2; // 上下居中 Bounding Box\n\n return {\n top: { x: cx, y: startY },\n left: { x: startX, y: startY + triH },\n right: { x: startX + S, y: startY + triH },\n };\n }\n\n /** 三元坐标(a,b,c)转笛卡尔坐标(x,y) */\n static t2c(a, b, c, tri) {\n const { top: T, left: L, right: R } = tri;\n return {\n x: a * T.x + b * L.x + c * R.x,\n y: a * T.y + b * L.y + c * R.y,\n };\n }\n\n /** 笛卡尔坐标(x,y)转三元坐标(a,b,c) */\n static c2t(px, py, tri) {\n const { top: T, left: L, right: R } = tri;\n const denom = (L.y - R.y) * (T.x - R.x) + (R.x - L.x) * (T.y - R.y);\n const a = ((L.y - R.y) * (px - R.x) + (R.x - L.x) * (py - R.y)) / denom;\n const b = ((R.y - T.y) * (px - R.x) + (T.x - R.x) * (py - R.y)) / denom;\n return { a, b, c: 1 - a - b };\n }\n\n /** 计算多边形像素面积 */\n static polyArea(pts) {\n let a = 0;\n for (let i = 0, n = pts.length; i < n; i++) {\n const j = (i + 1) % n;\n a += pts[i].x * pts[j].y - pts[j].x * pts[i].y;\n }\n return Math.abs(a) / 2;\n }\n\n /** 计算多边形质心 */\n static polyCentroid(pts) {\n const n = pts.length;\n let A = 0,\n cx = 0,\n cy = 0;\n for (let i = 0; i < n; i++) {\n const j = (i + 1) % n;\n const cross = pts[i].x * pts[j].y - pts[j].x * pts[i].y;\n A += cross;\n cx += (pts[i].x + pts[j].x) * cross;\n cy += (pts[i].y + pts[j].y) * cross;\n }\n A /= 2;\n return { x: cx / (6 * A), y: cy / (6 * A) };\n }\n\n /**\n * 解析并归一化数据点 (支持对象数组或原始数值数组)\n * 返回 [a, b, c] 比例数组,保证 a+b+c = 1\n */\n static resolveData(pt, sideOrder) {\n let raw = null;\n if (Array.isArray(pt)) {\n if (pt.length >= 3) {\n if (typeof pt[0] === 'object' && pt[0] !== null) {\n if (sideOrder) {\n raw = sideOrder.map(k => {\n const item = pt.find(d => d && d.name === k);\n return item ? item.value : 0;\n });\n } else {\n raw = [pt[0].value, pt[1].value, pt[2].value];\n }\n } else {\n raw = [pt[0], pt[1], pt[2]];\n }\n }\n } else if (pt && pt.value && Array.isArray(pt.value) && pt.value.length >= 3) {\n raw = [pt.value[0], pt.value[1], pt.value[2]];\n }\n\n if (!raw || raw.some((v) => typeof v !== 'number' || isNaN(v))) return null;\n\n const [v1, v2, v3] = raw.map(v => Math.max(0, v || 0));\n const sum = v1 + v2 + v3;\n if (sum <= 1e-9) return [0.3333, 0.3333, 0.3333];\n\n return [v1 / sum, v2 / sum, v3 / sum];\n }\n}\n\n/**\n * TriangleRenderer: Canvas 2D 绘图引擎\n * 职责:负责渲染逻辑,不存储业务状态,仅根据传入的渲染状态(State)进行绘制\n */\nexport class TriangleRenderer {\n constructor(ctx) {\n this.ctx = ctx;\n }\n\n /** 全量渲染入口 */\n render(state) {\n const ctx = this.ctx;\n const { W, H, dpr, scale, tx, ty, option, tri, zones, hoveredPoint } = state;\n\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, W * dpr, H * dpr);\n ctx.fillStyle = option.backgroundColor;\n ctx.fillRect(0, 0, W * dpr, H * dpr);\n\n // 应用 变换矩阵:DPR * (Zoom/Pan)\n ctx.setTransform(scale * dpr, 0, 0, scale * dpr, tx * dpr, ty * dpr);\n\n this.drawTriFill(tri);\n this.drawZones(zones, tri, option);\n this.drawGrid(option, tri);\n this.drawBorder(option, tri);\n this.drawSideLabels(option, tri);\n this.drawSeries(option, tri, hoveredPoint);\n\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n }\n\n drawTriFill(tri) {\n const ctx = this.ctx,\n { top, left, right } = tri;\n ctx.beginPath();\n ctx.moveTo(top.x, top.y);\n ctx.lineTo(left.x, left.y);\n ctx.lineTo(right.x, right.y);\n ctx.closePath();\n ctx.fillStyle = TriangleConfig.triFill;\n ctx.fill();\n }\n\n drawZones(zones, tri, option) {\n const ctx = this.ctx;\n const scale = this.ctx.getTransform().a / (window.devicePixelRatio || 1);\n\n const gAlpha = option.zone?.alpha;\n const colors = option.zone?.colors || option.colors || DEFAULT_COLORS;\n\n // 1. Draw Backgrounds\n zones.forEach((zone, i) => {\n if (!zone.coordinates || !zone.coordinates.length) return;\n ctx.beginPath();\n zone.coordinates.forEach(([a, b, c], j) => {\n const pt = TriangleMath.t2c(a, b, c, tri);\n j === 0 ? ctx.moveTo(pt.x, pt.y) : ctx.lineTo(pt.x, pt.y);\n });\n ctx.closePath();\n\n let baseColor = zone.color || colors[i % colors.length];\n if (gAlpha !== undefined && baseColor !== 'transparent') {\n baseColor = colorToRgba(baseColor, gAlpha);\n }\n ctx.fillStyle = baseColor;\n ctx.fill();\n });\n\n // 2. Draw Borders\n const globalBorderStyle = option.zone?.borderStyle || {};\n zones.forEach((zone, i) => {\n const bStyle = globalBorderStyle;\n if (bStyle.show === false || !zone.coordinates || !zone.coordinates.length) return;\n\n ctx.beginPath();\n zone.coordinates.forEach(([a, b, c], j) => {\n const pt = TriangleMath.t2c(a, b, c, tri);\n j === 0 ? ctx.moveTo(pt.x, pt.y) : ctx.lineTo(pt.x, pt.y);\n });\n ctx.closePath();\n\n let borderColor = bStyle.color || zone.color || colors[i % colors.length];\n if (bStyle.alpha !== undefined && borderColor !== 'transparent') {\n borderColor = colorToRgba(borderColor, bStyle.alpha);\n }\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = (bStyle.width ?? 1.0) * scale;\n\n if (bStyle.type === 'dashed') {\n ctx.setLineDash([4, 4]);\n } else if (bStyle.type === 'dotted') {\n ctx.setLineDash([2, 4]);\n } else {\n ctx.setLineDash([]);\n }\n ctx.stroke();\n });\n ctx.setLineDash([]);\n\n // 3. Draw Labels\n const showLabel = option.showZoneLabel !== false;\n if (!showLabel) return;\n\n const ff = option.grid?.labelStyle?.fontFamily || 'Microsoft YaHei UI, monospace';\n\n const globalLabelStyle = option.zone?.labelStyle || {};\n zones.forEach((zone) => {\n const lStyle = globalLabelStyle;\n if (lStyle.show === false || !zone.name) return;\n\n let centPx;\n const lab = zone.labelAt;\n if (lab && Array.isArray(lab) && lab.length >= 3) {\n centPx = TriangleMath.t2c(lab[0], lab[1], lab[2], tri);\n } else if (zone.coordinates && zone.coordinates.length > 0) {\n // Fallback: calculate geometric center\n const pts = zone.coordinates.map(([a, b, c]) => TriangleMath.t2c(a, b, c, tri));\n centPx = {\n x: pts.reduce((s, p) => s + p.x, 0) / pts.length,\n y: pts.reduce((s, p) => s + p.y, 0) / pts.length\n };\n } else {\n return;\n }\n\n const fs = Math.round((lStyle.fontSize || 11) * scale);\n const fontStyle = lStyle.fontStyle || 'bold';\n ctx.font = `${fontStyle} ${fs}px ${ff}`;\n\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n const text = typeof lStyle.formatter === 'function' ? lStyle.formatter(zone) : zone.name;\n const tw = ctx.measureText(text).width;\n const th = fs;\n\n let lx = centPx.x;\n let ly = centPx.y;\n\n if (lStyle.backgroundColor && lStyle.backgroundColor !== 'transparent') {\n let padX = 4, padY = 4;\n if (Array.isArray(lStyle.padding)) {\n padY = lStyle.padding[0];\n padX = lStyle.padding[1] !== undefined ? lStyle.padding[1] : padY;\n } else if (typeof lStyle.padding === 'number') {\n padX = padY = lStyle.padding;\n }\n padX *= scale;\n padY *= scale;\n\n const radius = (lStyle.borderRadius || 3) * scale;\n const bw = tw + padX * 2;\n const bh = th + padY * 2;\n const bx = lx - bw / 2;\n const by = ly - bh / 2;\n\n ctx.fillStyle = lStyle.backgroundColor;\n ctx.beginPath();\n if (ctx.roundRect) {\n ctx.roundRect(bx, by, bw, bh, radius);\n } else {\n ctx.rect(bx, by, bw, bh);\n }\n ctx.fill();\n }\n\n if (lStyle.textShadow && lStyle.textShadow !== 'none') {\n ctx.shadowColor = lStyle.textShadow;\n ctx.shadowBlur = 4;\n } else {\n ctx.shadowColor = 'transparent';\n ctx.shadowBlur = 0;\n }\n\n ctx.fillStyle = lStyle.color || '#fff';\n ctx.fillText(text, lx, ly);\n\n ctx.shadowBlur = 0;\n ctx.shadowColor = 'transparent';\n });\n ctx.textBaseline = 'alphabetic';\n }\n\n drawBadge(cx, cy, tw, textColor, bgColor) {\n const ctx = this.ctx,\n { badgePadding: pad, badgeHeight: h, badgeRadius: r } = TriangleConfig.ZONE_VIS;\n const w = tw + pad * 2,\n x = cx - w / 2,\n y = cy - h / 2;\n ctx.beginPath();\n if (ctx.roundRect) ctx.roundRect(x, y, w, h, r);\n else ctx.rect(x, y, w, h);\n ctx.fillStyle = bgColor;\n ctx.fill();\n }\n\n drawArrow(fx, fy, tx, ty, color) {\n const ctx = this.ctx,\n dx = tx - fx,\n dy = ty - fy,\n len = Math.hypot(dx, dy);\n if (len < 1) return;\n const ux = dx / len,\n uy = dy / len,\n sz = 7;\n ctx.beginPath();\n ctx.moveTo(tx, ty);\n ctx.lineTo(tx - ux * sz + uy * sz * 0.5, ty - uy * sz - ux * sz * 0.5);\n ctx.lineTo(tx - ux * sz - uy * sz * 0.5, ty - uy * sz + ux * sz * 0.5);\n ctx.closePath();\n ctx.fillStyle = color;\n ctx.fill();\n }\n\n drawGrid(option, tri) {\n if (!option.grid || !option.grid.show) return;\n const ctx = this.ctx;\n const grid = option.grid;\n const steps = grid.steps || 10;\n const majorEvery = grid.majorEvery || 2;\n const lineStyle = grid.lineStyle || { color: 'rgba(255,255,255,0.1)', width: 1, type: 'solid' };\n const majorLineStyle = grid.majorLineStyle || { color: 'rgba(255,255,255,0.2)', width: 1, type: 'solid' };\n\n const scale = this.ctx.getTransform().a / (window.devicePixelRatio || 1);\n\n const getNormal = (p1, p2, inwardPt) => {\n let dx = p2.x - p1.x, dy = p2.y - p1.y;\n const len = Math.hypot(dx, dy);\n dx /= len; dy /= len;\n const n1 = { x: -dy, y: dx }, n2 = { x: dy, y: -dx };\n return ((inwardPt.x - p1.x) * n1.x + (inwardPt.y - p1.y) * n1.y > 0) ? n1 : n2;\n };\n const { top, left, right } = tri;\n const normals = {\n bottom: getNormal(left, right, top),\n left: getNormal(left, top, right),\n right: getNormal(right, top, left)\n };\n\n for (let i = 1; i < steps; i++) {\n const t = i / steps,\n isMajor = i % majorEvery === 0;\n const currentStyle = isMajor ? majorLineStyle : lineStyle;\n\n ctx.strokeStyle = currentStyle.color || 'transparent';\n ctx.lineWidth = (currentStyle.width ?? 1) * scale;\n\n if (currentStyle.type === 'dashed') {\n ctx.setLineDash([4, 4]);\n } else if (currentStyle.type === 'dotted') {\n ctx.setLineDash([2, 4]);\n } else {\n ctx.setLineDash([]);\n }\n const ln = (p1, p2) => {\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n };\n ln(TriangleMath.t2c(t, 1 - t, 0, tri), TriangleMath.t2c(t, 0, 1 - t, tri));\n ln(TriangleMath.t2c(1 - t, t, 0, tri), TriangleMath.t2c(0, t, 1 - t, tri));\n ln(TriangleMath.t2c(1 - t, 0, t, tri), TriangleMath.t2c(0, 1 - t, t, tri));\n this.drawSideTick(i, steps, t, option, tri, isMajor, normals);\n }\n }\n\n drawSideTick(i, steps, t, option, tri, isMajor, normals) {\n const sOpt = option.side || {};\n const tStyle = sOpt.tickStyle || {};\n if (tStyle.show === false) return;\n\n const ctx = this.ctx,\n val = Math.round((i * 100) / steps);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n const tickLen = tStyle.length || 6;\n const tickLineColor = tStyle.lineColor || 'rgba(0,0,0,0.2)';\n const tickColor = tStyle.color || 'rgba(200,220,255)';\n const offset = tStyle.offset !== undefined ? tStyle.offset : 15;\n const ff = tStyle.fontFamily || 'Microsoft YaHei UI, sans-serif';\n const fs = tStyle.fontSize || 14;\n const fw = tStyle.fontWeight || 'normal';\n const font = `${fw} ${fs}px ${ff}`;\n\n const drawLine = (p, nx, ny) => {\n ctx.beginPath();\n ctx.moveTo(p.x, p.y);\n ctx.lineTo(p.x + nx * tickLen, p.y + ny * tickLen);\n ctx.strokeStyle = tickLineColor;\n ctx.lineWidth = 1.5;\n ctx.stroke();\n };\n\n const p0 = TriangleMath.t2c(t, 1 - t, 0, tri);\n drawLine(p0, normals.left.x, normals.left.y);\n if (isMajor) {\n ctx.fillStyle = tickColor;\n ctx.font = font;\n ctx.save();\n ctx.translate(p0.x - offset, p0.y - 8);\n ctx.rotate(-Math.PI / 3);\n ctx.fillText(val + '', 0, 0);\n ctx.restore();\n }\n\n const p2 = TriangleMath.t2c(1 - t, 0, t, tri);\n drawLine(p2, normals.right.x, normals.right.y);\n if (isMajor) {\n ctx.fillStyle = tickColor;\n ctx.font = font;\n ctx.save();\n ctx.translate(p2.x + offset, p2.y - 8);\n ctx.rotate(Math.PI / 3);\n ctx.fillText(val + '', 0, 0);\n ctx.restore();\n }\n\n const p1 = TriangleMath.t2c(0, t, 1 - t, tri);\n drawLine(p1, normals.bottom.x, normals.bottom.y);\n if (isMajor) {\n ctx.fillStyle = tickColor;\n ctx.font = font;\n ctx.fillText(val + '', p1.x, p1.y + offset);\n }\n }\n\n drawBorder(option, tri) {\n const ctx = this.ctx,\n { top, left, right } = tri,\n sOpt = option.side || {};\n const lStyle = sOpt.lineStyle || { color: 'rgba(180,210,255,0.1)', width: 1.5, type: 'solid' };\n const edges = [\n { f: top, t: left },\n { f: top, t: right },\n { f: left, t: right },\n ];\n edges.forEach(({ f, t }) => {\n ctx.beginPath();\n ctx.moveTo(f.x, f.y);\n ctx.lineTo(t.x, t.y);\n ctx.strokeStyle = lStyle.color || 'transparent';\n ctx.lineWidth = lStyle.width || 1;\n if (lStyle.type === 'dashed') ctx.setLineDash([4, 4]);\n else if (lStyle.type === 'dotted') ctx.setLineDash([2, 4]);\n else ctx.setLineDash([]);\n ctx.stroke();\n });\n ctx.setLineDash([]);\n }\n\n drawSideLabels(option, tri) {\n if (option.side?.show === false) return;\n const ctx = this.ctx,\n { top, left, right } = tri,\n sOpt = option.side || {};\n\n const names = sOpt.data || ['A', 'B', 'C'];\n const lStyle = sOpt.labelStyle || {};\n const ff = lStyle.fontFamily || 'Microsoft YaHei UI, sans-serif';\n const fs = lStyle.fontSize || 14;\n const fw = lStyle.fontWeight || 'bold';\n const color = lStyle.color || '#00e5ff';\n const offset = lStyle.offset !== undefined ? lStyle.offset : 40;\n\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillStyle = color;\n ctx.font = `${fw} ${fs}px ${ff}`;\n\n const lMid = { x: (top.x + left.x) / 2, y: (top.y + left.y) / 2 },\n lDx = left.x - top.x,\n lDy = left.y - top.y,\n lLen = Math.hypot(lDx, lDy);\n ctx.save();\n ctx.translate(lMid.x + (-lDy / lLen) * offset, lMid.y + (lDx / lLen) * offset);\n ctx.rotate(Math.atan2(lDy, lDx) + Math.PI);\n ctx.fillText((names[1] || 'B') + ' (%)', 0, 0);\n ctx.restore();\n\n const rMid = { x: (top.x + right.x) / 2, y: (top.y + right.y) / 2 },\n rDx = right.x - top.x,\n rDy = right.y - top.y,\n rLen = Math.hypot(rDx, rDy);\n ctx.save();\n ctx.translate(rMid.x + (rDy / rLen) * offset, rMid.y + (-rDx / rLen) * offset);\n ctx.rotate(Math.atan2(rDy, rDx));\n ctx.fillText((names[2] || 'C') + ' (%)', 0, 0);\n ctx.restore();\n\n ctx.save();\n ctx.translate((left.x + right.x) / 2, (left.y + right.y) / 2 + offset);\n ctx.fillText((names[0] || 'A') + ' (%)', 0, 0);\n ctx.restore();\n }\n\n drawSeries(option, tri, hoveredPoint) {\n const ctx = this.ctx;\n const scale = this.ctx.getTransform().a / (window.devicePixelRatio || 1);\n const ff = 'Microsoft YaHei UI, sans-serif';\n const sideOrder = option.side?.data;\n\n (option.series || []).forEach((s) => {\n const pt = s.data;\n if (!pt || pt.length === 0) return;\n\n const ptName = s.name;\n const ratio = TriangleMath.resolveData(pt, sideOrder);\n if (!ratio) return;\n\n const canvasPt = TriangleMath.t2c(ratio[0], ratio[1], ratio[2], tri);\n const px = canvasPt.x;\n const py = canvasPt.y;\n\n const isHov = hoveredPoint && hoveredPoint.series === s;\n\n const shape = s.shape || 'circle';\n const color = s.color || '#409eff';\n let size = s.size !== undefined ? s.size : 5;\n if (isHov) size *= 1.5;\n\n const globalItemStyle = s.itemStyle || {};\n const borderColor = globalItemStyle.borderColor || '#fff';\n const borderWidth = globalItemStyle.borderWidth !== undefined ? globalItemStyle.borderWidth : 1;\n const opacity = globalItemStyle.opacity !== undefined ? globalItemStyle.opacity : 1;\n\n const globalTextStyle = s.textStyle || {};\n const textShow = globalTextStyle.show !== undefined ? globalTextStyle.show : true;\n const textColor = globalTextStyle.color || color;\n const textFontSize = globalTextStyle.fontSize !== undefined ? globalTextStyle.fontSize : 12;\n const textFontWeight = globalTextStyle.fontWeight || 'normal';\n const textPosition = globalTextStyle.position || 'top';\n const textOffset = globalTextStyle.offset || [0, 0];\n\n const globalGlowStyle = s.glowStyle || {};\n const glowShow = globalGlowStyle.show !== undefined ? globalGlowStyle.show : false;\n const glowColorsOpt = globalGlowStyle.colors;\n const glowBlur = globalGlowStyle.blur !== undefined ? globalGlowStyle.blur : 15;\n const glowStartColor = globalGlowStyle.startColor || color;\n const glowEndColor = globalGlowStyle.endColor || 'transparent';\n const glowCount = globalGlowStyle.count !== undefined ? globalGlowStyle.count : 3;\n const glowDistance = globalGlowStyle.glowDistance !== undefined ? globalGlowStyle.glowDistance : 2;\n\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Glow Style Rendering\n if (glowShow) {\n ctx.shadowColor = glowColorsOpt ? glowColorsOpt[0] : glowStartColor;\n ctx.shadowBlur = glowBlur;\n\n let glowColors = [];\n let layers = glowCount;\n\n if (Array.isArray(glowColorsOpt) && glowColorsOpt.length > 0) {\n glowColors = glowColorsOpt;\n layers = glowColors.length;\n } else {\n for (let i = 0; i < layers; i++) {\n const factor = layers > 1 ? i / (layers - 1) : 0;\n glowColors.push(interpolateColor(glowStartColor, glowEndColor, factor));\n }\n }\n\n for (let i = layers - 1; i >= 0; i--) {\n const glowColor = glowColors[i];\n ctx.save();\n ctx.fillStyle = glowColor;\n ctx.beginPath();\n drawShapePath(ctx, px, py, shape, size, scale, (i + 1) * glowDistance);\n ctx.fill();\n ctx.restore();\n }\n }\n\n // Point Shape Rendering\n ctx.beginPath();\n drawShapePath(ctx, px, py, shape, size, scale, 0);\n\n if (shape === 'ring') {\n ctx.strokeStyle = color;\n ctx.lineWidth = borderWidth * scale;\n ctx.stroke();\n } else {\n ctx.fillStyle = color;\n ctx.fill();\n if (borderWidth > 0) {\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = borderWidth * scale;\n ctx.stroke();\n }\n }\n ctx.restore();\n\n // Text/Label Rendering\n if (textShow && ptName) {\n ctx.save();\n ctx.globalAlpha = opacity;\n ctx.font = `${textFontWeight} ${Math.round(textFontSize * scale)}px ${ff}`;\n ctx.fillStyle = textColor;\n\n let textAlign = 'center';\n let textBaseline = 'middle';\n let tx = px + textOffset[0] * scale;\n let ty = py + textOffset[1] * scale;\n\n let offsetVal = 6 * scale;\n if (shape === 'circle' || shape === 'ring' || shape === 'star' || shape === 'triangle') {\n offsetVal += size * scale;\n } else if (shape === 'square') {\n offsetVal += size * scale / 2;\n }\n\n if (textPosition === 'top') {\n textAlign = 'center';\n textBaseline = 'bottom';\n ty -= offsetVal;\n } else if (textPosition === 'bottom') {\n textAlign = 'center';\n textBaseline = 'top';\n ty += offsetVal;\n } else if (textPosition === 'left') {\n textAlign = 'right';\n textBaseline = 'middle';\n tx -= offsetVal;\n } else if (textPosition === 'right') {\n textAlign = 'left';\n textBaseline = 'middle';\n tx += offsetVal;\n } else if (textPosition === 'center') {\n textAlign = 'center';\n textBaseline = 'middle';\n }\n\n ctx.textAlign = textAlign;\n ctx.textBaseline = textBaseline;\n ctx.fillText(ptName, tx, ty);\n ctx.restore();\n }\n });\n }\n}\n\n/**\n * DuvalTriangle: 顶层管理类\n * 职责:负责 DOM 初始化、Tooltip 管理、状态维护(Zoom/Pan)、响应式 Resize 及事件分发\n */\nexport class DuvalTriangle {\n constructor(containerIdOrEl, option = {}) {\n this.initDOM(containerIdOrEl);\n this.renderer = new TriangleRenderer(this.ctx);\n\n this.state = {\n W: 0,\n H: 0,\n dpr: 1,\n scale: 1,\n tx: 0,\n ty: 0,\n option: {},\n tri: {},\n zones: [],\n hoveredPoint: null,\n };\n\n this._zoom = new ZoomController(option.zoom);\n\n this._bus = new EventBus();\n\n this._initTooltip();\n this.bindEvents();\n\n this.ro = new ResizeObserver(() => this.fitCanvas());\n this.ro.observe(this.container);\n\n this.fitCanvas();\n if (Object.keys(option).length) this.setOption(option);\n }\n\n initDOM(containerIdOrEl) {\n let el = typeof containerIdOrEl === 'string' ? document.getElementById(containerIdOrEl) : containerIdOrEl;\n if (!el) throw new Error('DuvalTriangle: container not found');\n this.container = el.tagName.toLowerCase() === 'canvas' ? el.parentElement || el : el;\n this.canvas = el.tagName.toLowerCase() === 'canvas' ? el : document.createElement('canvas');\n if (el.tagName.toLowerCase() !== 'canvas') {\n this.container.style.position = this.container.style.position || 'relative';\n this.canvas.style.cssText = 'display:block;width:100%;height:100%;cursor:default;';\n this.container.appendChild(this.canvas);\n }\n this.ctx = this.canvas.getContext('2d');\n }\n\n _initTooltip() {\n const tooltipCfg = this.state.option.tooltip || TriangleConfig.tooltip;\n this._tooltip = new DOMTooltip(this.container, {\n tooltipBg: tooltipCfg.backgroundColor || 'rgba(5,13,26,0.95)',\n tooltipTextColor: tooltipCfg.textStyle?.color || '#c8d8e8',\n tooltipPadding: tooltipCfg.padding || 10,\n zoneBorderColor: tooltipCfg.borderColor || '#00e5ff',\n fontFamily: 'monospace',\n });\n this._tooltip.el.style.whiteSpace = 'nowrap';\n this._tooltip.el.style.lineHeight = '1.6';\n }\n\n setOption(option) {\n if (!this.state.option || !Object.keys(this.state.option).length) {\n this.state.option = deepMerge(deepMerge({}, TriangleConfig), option);\n } else {\n deepMerge(this.state.option, option);\n }\n this._normalizeOptions();\n this.computeGeometry();\n this.buildZonePaths();\n this.render();\n }\n\n setSeries(series) {\n this.state.option.series = Array.isArray(series) ? series : [series];\n this.render();\n return this;\n }\n\n on(event, handler) {\n this._bus.on(event, handler);\n return this;\n }\n\n off(event, handler) {\n this._bus.off(event, handler);\n return this;\n }\n\n _normalizeOptions() {\n const opt = this.state.option;\n // Ensure side data exists\n if (!opt.side) opt.side = {};\n if (!opt.side.data || opt.side.data.length < 3) {\n opt.side.data = ['A', 'B', 'C'];\n }\n\n }\n\n computeGeometry() {\n const dpr = window.devicePixelRatio || 1;\n this.state.W = this.canvas.width / dpr;\n this.state.H = this.canvas.height / dpr;\n this.state.dpr = dpr;\n\n const padding = this.state.option.padding ?? 45;\n const grid = this.state.option.grid || {};\n const box = parseGridBox(this.state.W, this.state.H, grid, padding);\n this.state.tri = TriangleMath.computeTri(box);\n }\n\n buildZonePaths() {\n const { option, tri } = this.state;\n const zoneData = option.zone?.data || [];\n this.state.zones = zoneData.map((z) => {\n const nz = { ...z };\n // 预构建 Path2D\n const path = new Path2D();\n const pts = z.coordinates;\n if (!pts) return;\n pts.forEach(([pa, pb, pc], i) => {\n const ppt = TriangleMath.t2c(pa, pb, pc, tri);\n i === 0 ? path.moveTo(ppt.x, ppt.y) : path.lineTo(ppt.x, ppt.y);\n });\n path.closePath();\n nz.path = path;\n\n // 预构建标签位置\n if (z.labelAt) {\n nz.labelPos = { a: z.labelAt[0], b: z.labelAt[1], c: z.labelAt[2] };\n } else {\n const ptsArr = z.coordinates || [];\n const pts = ptsArr.map((p) => TriangleMath.t2c(p[0], p[1], p[2], tri));\n const cen = TriangleMath.polyCentroid(pts);\n const t = TriangleMath.c2t(cen.x, cen.y, tri);\n nz.labelPos = { a: t.a, b: t.b, c: t.c };\n }\n return nz;\n });\n }\n\n fitCanvas() {\n const dpr = window.devicePixelRatio || 1;\n const aW = this.container.clientWidth || 400,\n aH = this.container.clientHeight || 400;\n\n this.canvas.width = Math.round(aW * dpr);\n this.canvas.height = Math.round(aH * dpr);\n // 不再通过内联覆盖宽高,直接继承初始化时的宽高\n this.canvas.style.width = aW + 'px';\n this.canvas.style.height = aH + 'px';\n this.state.scale = 1;\n this.state.tx = 0;\n this.state.ty = 0;\n if (this._zoom) this._zoom.reset();\n if (Object.keys(this.state.option).length) {\n this.computeGeometry();\n this.buildZonePaths();\n this.render();\n }\n }\n\n render() {\n if (!this.state.option) return;\n this.state.scale = this._zoom.zoom;\n this.state.tx = this._zoom.panX;\n this.state.ty = this._zoom.panY;\n this.renderer.render(this.state);\n\n const results = [];\n const sideOrder = this.state.option.side?.data;\n (this.state.option.series || []).forEach((s) => {\n const pt = s.data;\n if (!pt || pt.length === 0) return;\n const ratio = TriangleMath.resolveData(pt, sideOrder);\n if (!ratio) return;\n const zone = this.getZoneAt(ratio[0], ratio[1], ratio[2]);\n results.push({\n series: s,\n zone: zone,\n ratio: ratio\n });\n });\n if (results.length > 0) {\n this._bus.emit('diagnose', results);\n }\n }\n\n bindEvents() {\n const cv = this.canvas;\n\n this._onWheel = (e) => {\n e.preventDefault();\n const rect = cv.getBoundingClientRect();\n const ax = (e.clientX - rect.left) * (this.state.W / rect.width);\n const ay = (e.clientY - rect.top) * (this.state.H / rect.height);\n this._zoom.onWheel(e.deltaY, ax, ay);\n this._bus.emit('zoom', this._zoom.state);\n this.render();\n };\n\n this._onDown = (e) => {\n if (e.button !== 0) return;\n const rect = cv.getBoundingClientRect();\n const scaleX = this.state.W / rect.width;\n const scaleY = this.state.H / rect.height;\n this._zoom.startDrag(e.clientX * scaleX, e.clientY * scaleY);\n cv.style.cursor = 'grabbing';\n };\n\n this._onMove = (e) => {\n const rect = cv.getBoundingClientRect();\n const scaleX = this.state.W / rect.width;\n const scaleY = this.state.H / rect.height;\n if (this._zoom.moveDrag(e.clientX * scaleX, e.clientY * scaleY, 1)) {\n this.render();\n return;\n }\n this.handleMouseMove(e);\n };\n\n this._onUp = () => {\n if (!this._zoom.endDrag()) return;\n cv.style.cursor = this.state.hoveredPoint ? 'pointer' : 'default';\n this._bus.emit('zoom', this._zoom.state);\n };\n\n this._onLeave = () => {\n this.hideTooltip();\n this.state.hoveredPoint = null;\n this._bus.emit('hover', null);\n this.render();\n };\n\n this._onDbl = () => {\n this.zoomReset();\n };\n\n cv.addEventListener('wheel', this._onWheel, { passive: false });\n cv.addEventListener('mousedown', this._onDown);\n cv.addEventListener('mousemove', this._onMove);\n cv.addEventListener('mouseleave', this._onLeave);\n cv.addEventListener('dblclick', this._onDbl);\n cv.addEventListener('click', this.handleClick.bind(this));\n window.addEventListener('mouseup', this._onUp);\n }\n\n handleMouseMove(e) {\n const r = this.canvas.getBoundingClientRect();\n const scaleX = this.state.W / r.width;\n const scaleY = this.state.H / r.height;\n const cx = (e.clientX - r.left) * scaleX;\n const cy = (e.clientY - r.top) * scaleY;\n\n const x = (cx - this._zoom.panX) / this._zoom.zoom;\n const y = (cy - this._zoom.panY) / this._zoom.zoom;\n const { a, b, c } = TriangleMath.c2t(x, y, this.state.tri);\n if (a < -1e-7 || b < -1e-7 || c < -1e-7) {\n this.hideTooltip();\n if (this.state.hoveredPoint !== null) {\n this.state.hoveredPoint = null;\n this.canvas.style.cursor = 'default';\n this.render();\n }\n return;\n }\n\n let nearest = null,\n minDist = 14;\n const sideOrder = this.state.option.side?.data;\n (this.state.option.series || []).forEach((s) => {\n const ptData = s.data;\n if (!ptData) return;\n const ratio = TriangleMath.resolveData(ptData, sideOrder);\n if (!ratio) return;\n const pt = TriangleMath.t2c(...ratio, this.state.tri),\n d = Math.hypot(pt.x - x, pt.y - y);\n if (d < minDist) {\n minDist = d;\n nearest = { series: s, raw: ratio };\n }\n });\n if (nearest !== this.state.hoveredPoint) {\n this.state.hoveredPoint = nearest;\n this.canvas.style.cursor = nearest ? 'pointer' : 'default';\n this.render();\n }\n this.showTooltip(x, y, a, b, c);\n }\n\n handleClick(e) {\n if (this._zoom.isDragging) return;\n const r = this.canvas.getBoundingClientRect();\n const scaleX = this.state.W / r.width;\n const scaleY = this.state.H / r.height;\n const cx = (e.clientX - r.left) * scaleX;\n const cy = (e.clientY - r.top) * scaleY;\n\n const x = (cx - this._zoom.panX) / this._zoom.zoom;\n const y = (cy - this._zoom.panY) / this._zoom.zoom;\n const { a, b, c } = TriangleMath.c2t(x, y, this.state.tri);\n if (a < -1e-7 || b < -1e-7 || c < -1e-7) return;\n const zone = this.getZoneAt(a, b, c);\n this._bus.emit('click', { a, b, c, zone });\n this.canvas.dispatchEvent(\n new CustomEvent('triangle:click', { detail: { a, b, c, zone }, bubbles: true })\n );\n }\n\n showTooltip(x, y, a, b, c) {\n const tOpt = this.state.option.tooltip || {};\n if (tOpt.show === false || !this.state.hoveredPoint) {\n this.hideTooltip();\n return;\n }\n const foundZone = this.getZoneAt(a, b, c);\n const side = this.state.option.side || {};\n const sNames = side.data || ['A', 'B', 'C'];\n\n // 触发外部 hover 事件,对齐五边形返回的内容\n this._bus.emit('hover', {\n ratio: [a, b, c],\n zone: foundZone,\n point: this.state.hoveredPoint?.series || null,\n });\n\n if (tOpt.formatter) {\n const html = tOpt.formatter({\n a, b, c, sNames, zone: foundZone,\n point: this.state.hoveredPoint?.series,\n });\n const docX = x * this._zoom.zoom + this._zoom.panX;\n const docY = y * this._zoom.zoom + this._zoom.panY;\n this._tooltip.show(html, docX, docY, tOpt, {}, foundZone);\n return;\n }\n\n const html = this._defaultTooltipHTML(a, b, c, sNames, foundZone);\n const docX = x * this._zoom.zoom + this._zoom.panX;\n const docY = y * this._zoom.zoom + this._zoom.panY;\n\n // 补偿 canvas 在容器内的偏移\n const canvasRect = this.canvas.getBoundingClientRect();\n const containerRect = this.container.getBoundingClientRect();\n const offsetX = canvasRect.left - containerRect.left;\n const offsetY = canvasRect.top - containerRect.top;\n\n this._tooltip.show(html, docX + offsetX, docY + offsetY, tOpt, {}, foundZone);\n }\n\n hideTooltip() {\n if (this._tooltip) this._tooltip.hide();\n }\n\n getZoneAt(a, b, c) {\n const pt = TriangleMath.t2c(a, b, c, this.state.tri);\n const ctx = this.ctx;\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n const found = (this.state.zones || []).find((z) => z.path && ctx.isPointInPath(z.path, pt.x, pt.y));\n ctx.restore();\n return found;\n }\n\n zoomReset() {\n this.state.scale = 1;\n this.state.tx = 0;\n this.state.ty = 0;\n this.render();\n this._bus.emit('zoom', { scale: this.state.scale, tx: this.state.tx, ty: this.state.ty });\n }\n dispose() {\n this.ro?.disconnect();\n this._tooltip?.dispose();\n this.canvas?.remove();\n window.removeEventListener('mouseup', this._onUp);\n this._bus?.dispose();\n }\n\n /**\n * 默认 tooltip HTML 生成\n * @private\n */\n _defaultTooltipHTML(a, b, c, sNames, zone) {\n const hovered = this.state.hoveredPoint;\n const ptName = hovered?.series?.name || 'Data Point';\n const pointNameStr = `<div style=\"font-size:14px; font-weight:bold; margin-bottom:4px; color:#fff;\">${ptName}</div>`;\n\n const TRIANGLE_TITLES = {\n 'PD': '局部放电',\n 'D1': '低能放电',\n 'D2': '高能放电',\n 'T1': '热故障,t<300℃',\n 'T2': '热故障,300℃<t<700℃',\n 'T3': '热故障,t>700℃',\n 'DT': '热和放电混合故障',\n 'S': '温度<200℃时的杂散气体',\n 'C': '绝缘纸可能碳化',\n 'O': '矿物油过热',\n 'T3-H': '仅矿物油过热',\n 'ND': '正常'\n };\n\n const zoneTitle = zone?.title || zone?.desc || (zone ? TRIANGLE_TITLES[zone.name] : '') || '';\n const zoneStr = zone ? `${zone.name || zone.id || ''} ${zoneTitle}`.trim() : 'Outside';\n const zoneColor = zone ? (zone.color?.replace(/[\\d.]+\\)$/, '1)') || '#fff') : '#fff';\n\n let html = `\n ${pointNameStr}\n <div style=\"color:${zoneColor}; font-size:13px; font-weight:bold; padding-bottom:8px; margin-bottom:8px; border-bottom:1px solid rgba(255,255,255,0.07);\">\n ${zoneStr}\n </div>\n `;\n\n const axisColors = ['#00e5ff', '#ff6b35', '#ffcc02'];\n const item = hovered?.series?.data;\n\n if (true) {\n sNames.forEach((name, i) => {\n const col = axisColors[i % 3];\n\n let rawValStr = '-';\n if (item) {\n if (Array.isArray(item)) {\n rawValStr = item[i] !== undefined ? item[i] : '-';\n } else if (typeof item === 'object') {\n if (item.value && Array.isArray(item.value)) {\n rawValStr = item.value[i] !== undefined ? item.value[i] : '-';\n } else if (item[name] !== undefined) {\n rawValStr = item[name];\n }\n }\n }\n\n html += `\n <div style=\"display:flex; align-items:center; margin-bottom:6px; font-size:13px;\">\n <span style=\"display:inline-block; width:8px; height:8px; border-radius:50%; background-color:${col}; margin-right:8px;\"></span>\n <span style=\"color:#cbd5e1; flex-grow:1;\">${name}</span>\n <span style=\"color:#fff; font-weight:bold; margin-left:20px;\">${rawValStr}</span>\n </div>\n `;\n });\n }\n\n return html;\n }\n}\n\nfunction parseRgba(color) {\n const cleaned = color.trim().toLowerCase();\n if (cleaned.startsWith('#')) {\n let hex = cleaned.slice(1);\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n const a = hex.length === 8 ? parseInt(hex.substring(6, 8), 16) / 255 : 1;\n return [r, g, b, a];\n }\n const m = cleaned.match(/rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\)/);\n if (m) {\n return [\n parseInt(m[1], 10),\n parseInt(m[2], 10),\n parseInt(m[3], 10),\n m[4] !== undefined ? parseFloat(m[4]) : 1\n ];\n }\n if (cleaned === 'transparent') return [0, 0, 0, 0];\n return [255, 255, 255, 1];\n}\n\nfunction colorToRgba(color, alpha = 1) {\n const [r, g, b, a] = parseRgba(color);\n return `rgba(${r},${g},${b},${a * alpha})`;\n}\n\nfunction interpolateColor(c1, c2, factor) {\n const [r1, g1, b1, a1] = parseRgba(c1);\n const [r2, g2, b2, a2] = parseRgba(c2);\n const r = Math.round(r1 + (r2 - r1) * factor);\n const g = Math.round(g1 + (g2 - g1) * factor);\n const b = Math.round(b1 + (b2 - b1) * factor);\n const a = a1 + (a2 - a1) * factor;\n return `rgba(${r},${g},${b},${a})`;\n}\n\n\n\n\n","/**\n * DGA 三比值法 核心逻辑模块 \n * 包含: ThreeRatioConfig 配置, DGAScale 工具类, Renderer3D 渲染类, ThreeRatioChart 组件类\n */\nimport { parseGridBox, deepMerge, EventBus, DEFAULT_COLORS } from './utils.js';\n\nimport { THREE_RADIO_ZONES } from './zones.js';\n\n// 核心配置中心:包含故障诊断规则、视觉样式及交互参数\nexport const ThreeRatioConfig = Object.freeze({\n colors: DEFAULT_COLORS,\n // 故障区域定义(用于诊断逻辑与 3D/2D 绘图)\n ZONES: THREE_RADIO_ZONES,\n\n // 坐标轴固定配置(X: C2H4/C2H6, Y: CH4/H2, Z: C2H2/C2H4)\n AXES: {\n x: { color: '#ff9a3c', label: 'X (C₂H₄/C₂H₆)' },\n y: { color: '#4ac8ff', label: 'Y (CH₄/H₂)' },\n z: { color: '#70e870', label: 'Z (C₂H₂/C₂H₄)' },\n },\n\n // 绘图主题配置(深浅两色)\n THEMES: {\n dark: {\n wallFillAlpha: 0.05, // 立方体墙面填充透明度\n wallGridAlpha: '40', // 墙面网格线 Alpha (Hex)\n wallEdgeAlpha: '50', // 墙面边缘 Alpha (Hex)\n outerGrid: 'rgba(100,150,220,0.10)', // 外部辅助网格\n plane2dGrid: 'rgba(100,150,220,0.20)', // 2D 投影网格\n plane2dAxis: 'rgba(120,160,220,0.50)', // 2D 投影轴线\n plane2dLabel: 'rgba(150,180,220,0.60)', // 2D 区域文字标签颜色\n tickAlpha: 'cc', // 刻度文字 Alpha\n pointStroke: 'rgba(255,255,255,0.55)', // 样本点边缘描边\n },\n light: {\n wallFillAlpha: 0.06,\n wallGridAlpha: '28',\n wallEdgeAlpha: '55',\n outerGrid: 'rgba(80,120,200,0.12)',\n plane2dGrid: 'rgba(80,120,200,0.18)',\n plane2dAxis: 'rgba(80,120,200,0.45)',\n plane2dLabel: 'rgba(60,100,180,0.65)',\n tickAlpha: 'bb',\n pointStroke: 'rgba(0,0,0,0.25)',\n },\n },\n\n // 2D 投影平面视角配置\n PLANES: {\n xz: {\n hAxis: 'x',\n vAxis: 'z',\n hLabel: 'X C₂H₄/C₂H₆(热故障)',\n vLabel: 'Z C₂H₂/C₂H₄(高能放电)',\n bgColor: {\n dark: 'rgba(180,120,60,0.06)',\n light: 'rgba(180,100,40,0.05)',\n },\n },\n yz: {\n hAxis: 'y',\n vAxis: 'z',\n hLabel: 'Y CH₄/H₂(低能放电)',\n vLabel: 'Z C₂H₂/C₂H₄(高能放电)',\n bgColor: {\n dark: 'rgba(60,160,180,0.06)',\n light: 'rgba(40,140,160,0.05)',\n },\n },\n xy: {\n hAxis: 'x',\n vAxis: 'y',\n hLabel: 'X C₂H₄/C₂H₆(热故障)',\n vLabel: 'Y CH₄/H₂(低能放电)',\n bgColor: { dark: 'rgba(60,100,200,0.06)', light: 'rgba(40,80,180,0.05)' },\n },\n },\n\n TICKS: { vals: [0, 1 / 3, 2 / 3, 1], labels: ['0', '0.1', '1.0', '10'] }, // 刻度映射\n CAM: { elev: -20, yaw: 115 }, // 初始相机仰角、偏航角\n PROJ: { fov: 4.0, scaleK: 0.45, cx: 0.48, cy: 0.52 }, // 投影及中心偏移参数\n PAD2D: { l: 70, r: 30, t: 50, b: 60 }, // 2D 投影边距\n DRAG: {\n rotYSens: 0.45,\n rotXSens: 0.28,\n rotXMin: -70,\n rotXMax: 85,\n zoomMin: 0.3,\n zoomMax: 4.0,\n zoomIn: 1.08,\n zoomOut: 0.92,\n }, // 交互灵敏度与限制\n TWEEN: { step: 0.045 }, // 视角切换动画步长\n POINT: {\n defaultSize: 7,\n defaultColor: '#aaaaaa',\n glowAlpha: 0.25,\n glowRadius: 2.2,\n hlOffset: 0.35,\n }, // 样本点视觉参数\n ZONE_VIS: { fillAlpha: 0.25, labelAlpha: 0.9 }, // 3D 区域填充透明度(玻璃块效果)\n UNKNOWN: { name: '未分类(需综合判断)', color: '#888899' }, // 无法匹配诊断规则时的默认项\n TEXT_STYLE: {\n fontSize: 14,\n fontFamily: 'Segoe UI, Courier New',\n fontWeight: 'normal',\n },\n});\n\n/**\n * DGAScale: 提供原始三比值与单位立方体坐标(0-1)之间的映射\n */\nexport class DGAScale {\n /**\n * 将原始三比值数值转换为 0-1 的归一化坐标 (非等比例分段对数变换)\n * 变换规则:[0, 0.1]->[0, 1/3], [0.1, 1]->[1/3, 2/3], [1, 10]->[2/3, 1]\n */\n static realToU(v) {\n if (v <= 0) return 0;\n if (v <= 0.1) return v / 0.3;\n if (v <= 1) return 1 / 3 + (Math.log10(v) + 1) / 3;\n if (v <= 10) return 2 / 3 + Math.log10(v) / 3;\n return 1;\n }\n /** 将归一化单位值还原为原始比值 */\n static uToReal(u) {\n if (u <= 0) return 0;\n if (u <= 1 / 3) return u * 0.3;\n if (u <= 2 / 3) return Math.pow(10, (u - 1 / 3) * 3 - 1);\n return Math.pow(10, (u - 2 / 3) * 3);\n }\n /** 格式化数值输出 */\n static formatVal(v) {\n return v < 0.01 ? v.toFixed(4) : v.toFixed(3);\n }\n}\n\n/**\n * Renderer3D: Canvas 2D 实现的轻量级 3D 渲染器\n * 负责投影计算、场景裁剪及各类视觉元素的绘制\n */\nexport class Renderer3D {\n constructor(ctx, W, H, opts = {}) {\n this.ctx = ctx;\n this.opts = opts;\n this.layout = opts.layout ?? 'fill';\n this.resize(W, H);\n this.updateOptions(opts);\n }\n\n /** 更新渲染配置 */\n updateOptions(opts = {}) {\n this.opts = { ...this.opts, ...opts };\n if (opts.layout !== undefined || opts.grid !== undefined) {\n if (opts.layout !== undefined) {\n this.layout = opts.layout;\n }\n this.resize(this.W, this.H);\n }\n const themeName = this.opts.theme ?? 'dark';\n this.theme = ThreeRatioConfig.THEMES[themeName] ?? ThreeRatioConfig.THEMES.dark;\n this.themeName = themeName;\n this.zone = this.processZones(this.opts.zone ?? ThreeRatioConfig.ZONES);\n\n // 初始化 wall 和 axis 的默认配置并与 opts 进行合并\n const defaultWall = {\n show: true,\n fill: { show: true, alpha: this.theme.wallFillAlpha, colors: { xy: undefined, xz: undefined, yz: undefined } },\n grid: { show: true, lineStyle: { lineWidth: 0.6, alpha: parseInt(this.theme.wallGridAlpha, 16) / 255, type: 'solid' } },\n border: { show: true, lineStyle: { lineWidth: 0.8, alpha: parseInt(this.theme.wallEdgeAlpha, 16) / 255, type: 'solid' } }\n };\n\n const defaultAxis = {\n show: true,\n lineStyle: { lineWidth: 1.8, arrowSize: 9 },\n labelStyle: { show: true, fontSize: 14, fontWeight: 'bold', distance: 16 },\n tickLabelStyle: { show: true, fontSize: 12, color: 'rgba(255, 255, 255, 0.8)' },\n data: {\n x: { name: ThreeRatioConfig.AXES.x.label, color: ThreeRatioConfig.AXES.x.color },\n y: { name: ThreeRatioConfig.AXES.y.label, color: ThreeRatioConfig.AXES.y.color },\n z: { name: ThreeRatioConfig.AXES.z.label, color: ThreeRatioConfig.AXES.z.color }\n }\n };\n\n const defaultPlane2D = {\n show: true,\n fade3DAlpha: 0.03,\n grid: {\n show: true,\n backgroundColor: undefined,\n lineStyle: { lineWidth: 0.5, alpha: 0.2, type: 'solid' }\n },\n axis: {\n show: true,\n lineStyle: { lineWidth: 1.5, alpha: 0.9 },\n labelStyle: { show: true, fontSize: 13, distance: 25 },\n tickLabelStyle: { show: true, fontSize: 11, distance: 8 }\n },\n zone: {\n show: true,\n alpha: 0.75,\n borderStyle: { show: true, width: 1.4 }\n }\n };\n\n this.opts.wall = deepMerge(defaultWall, this.opts.wall || {});\n this.opts.axis = deepMerge(defaultAxis, this.opts.axis || {});\n this.opts.plane2D = deepMerge(defaultPlane2D, this.opts.plane2D || {});\n }\n\n /** 预计算区域数据 */\n processZones(zonesOpt) {\n let zonesData = [];\n let globalLabelStyle = {};\n let gAlpha = undefined;\n let gBorder = {};\n let colors = this.opts.colors || ThreeRatioConfig.colors || DEFAULT_COLORS;\n \n if (zonesOpt && typeof zonesOpt === 'object' && Array.isArray(zonesOpt.data)) {\n zonesData = zonesOpt.data;\n globalLabelStyle = zonesOpt.labelStyle || {};\n gAlpha = zonesOpt.alpha;\n gBorder = zonesOpt.borderStyle || {};\n if (zonesOpt.colors) colors = zonesOpt.colors;\n } else {\n zonesData = ThreeRatioConfig.ZONES;\n }\n\n return zonesData.map((d, i) => {\n let baseColor = d.color || colors[i % colors.length];\n if (gAlpha !== undefined && baseColor !== 'transparent') {\n baseColor = colorToRgba(baseColor, gAlpha);\n }\n \n const [r, g, b] = parseRgba(baseColor);\n\n const lblStyle = globalLabelStyle;\n const labelColor = lblStyle.color || baseColor;\n\n let fontParts = [];\n if (lblStyle.fontWeight) fontParts.push(lblStyle.fontWeight);\n if (lblStyle.fontSize) fontParts.push(lblStyle.fontSize + 'px');\n if (lblStyle.fontFamily) fontParts.push(lblStyle.fontFamily);\n const fontStr = fontParts.length > 0 ? fontParts.join(' ') : null;\n\n const bStyle = gBorder;\n let edgeStr = bStyle.color || baseColor;\n if (bStyle.alpha !== undefined && edgeStr !== 'transparent') {\n edgeStr = colorToRgba(edgeStr, bStyle.alpha);\n }\n\n const p1 = d.coordinates && d.coordinates[0] ? d.coordinates[0] : [0, 0, 0];\n const p2 = d.coordinates && d.coordinates[1] ? d.coordinates[1] : [0, 0, 0];\n\n return {\n ...d,\n fillBase: `rgba(${r},${g},${b},`,\n edgeStr,\n x0: DGAScale.realToU(p1[0]),\n x1: DGAScale.realToU(p2[0]),\n y0: DGAScale.realToU(p1[1]),\n y1: DGAScale.realToU(p2[1]),\n z0: DGAScale.realToU(p1[2]),\n z1: DGAScale.realToU(p2[2]),\n labelColor,\n labelFontStr: fontStr\n };\n });\n }\n\n /** 获取配置的字体样式 */\n getFont(key) {\n const base = ThreeRatioConfig.TEXT_STYLE;\n const custom = this.opts.textStyle?.[key] ?? this.opts.textStyle ?? {};\n const size = custom.fontSize ?? base.fontSize;\n const family = custom.fontFamily ?? base.fontFamily;\n const weight = custom.fontWeight ?? (key === 'axis' || key === 'zone' ? 'bold' : base.fontWeight);\n return `${weight} ${size}px ${family}`;\n }\n\n /** 更新渲染器主题 */\n setTheme(name) {\n this.updateOptions({ theme: name });\n }\n\n /** 画布尺寸更新回调 */\n resize(W, H) {\n this.W = W;\n this.H = H;\n const grid = this.opts.grid;\n const hasGridMargin = grid && (grid.left !== undefined || grid.right !== undefined || grid.top !== undefined || grid.bottom !== undefined);\n\n // 根据 layout 模式计算有效显示区域\n if (hasGridMargin) {\n const box = parseGridBox(W, H, grid, 0);\n this.renderW = box.availW;\n this.renderH = box.availH;\n this.offsetX = box.left;\n this.offsetY = box.top;\n } else if (this.layout === 'square') {\n const S = Math.min(W, H);\n this.renderW = S;\n this.renderH = S;\n this.offsetX = (W - S) / 2;\n this.offsetY = (H - S) / 2;\n } else {\n this.renderW = W;\n this.renderH = H;\n this.offsetX = 0;\n this.offsetY = 0;\n }\n this.CX = this.offsetX + this.renderW * ThreeRatioConfig.PROJ.cx;\n this.CY = this.offsetY + this.renderH * ThreeRatioConfig.PROJ.cy;\n }\n\n /**\n * 核心投影函数:将 0-1 坐标系的 3D 点映射为 2D 屏幕画布坐标\n * 逻辑:平移中心 -> 执行绕 X, Y 轴旋转矩阵 -> 应用视场角(FOV)进行透视缩放 -> 映射至屏幕中心\n */\n proj(dx, dy, dz) {\n const cx = dx - 0.5,\n cy = dy - 0.5,\n cz = dz - 0.5;\n const RX = (this.cam.rotX * Math.PI) / 180,\n RY = (this.cam.rotY * Math.PI) / 180;\n const cosX = Math.cos(RX),\n sinX = Math.sin(RX);\n const cosY = Math.cos(RY),\n sinY = Math.sin(RY);\n // 旋转变换\n const x1 = cx * cosY + cy * sinY,\n z1 = -cx * sinY + cy * cosY;\n const y1 = cz * cosX - z1 * sinX,\n z2 = cz * sinX + z1 * cosX;\n // 透视缩放 (基于渲染区域的较小边)\n const sc = Math.min(this.renderW, this.renderH) * ThreeRatioConfig.PROJ.scaleK * this.cam.zoomFactor;\n const fov = ThreeRatioConfig.PROJ.fov,\n pz = z2 + fov;\n return {\n x: this.CX + (x1 / pz) * sc * fov,\n y: this.CY - (y1 / pz) * sc * fov,\n depth: z2,\n };\n }\n\n /** 判断法向量是否背向相机 (Backface Culling) */\n isBackface(nx, ny, nz) {\n const RX = (this.cam.rotX * Math.PI) / 180,\n RY = (this.cam.rotY * Math.PI) / 180;\n const cosX = Math.cos(RX), sinX = Math.sin(RX);\n const cosY = Math.cos(RY), sinY = Math.sin(RY);\n\n // 应用相同的旋转矩阵\n const x1 = nx * cosY + ny * sinY;\n const z1 = -nx * sinY + ny * cosY;\n const y1 = nz * cosX - z1 * sinX;\n const z2 = nz * sinX + z1 * cosX;\n\n return z2 > 0; // z正方向是朝向屏幕内部(远离相机)\n }\n\n /**\n * 渲染主循环\n * @param {Object} cam 相机状态对象\n * @param {Array} points 样本点数组\n * @param {string} view 当前视图 ID ('3d', 'xz' 等)\n * @param {number} flat 扁平化程度 (0-1), 用于 3D 转换 2D 平面的视觉过度\n */\n draw(cam, points, view, flat) {\n const ctx = this.ctx;\n const dpr = window.devicePixelRatio || 1;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, this.W, this.H);\n this.cam = cam;\n const fadeTarget = this.opts.plane2D?.fade3DAlpha ?? 0.03;\n const d3a = 1 - flat * (1 - fadeTarget); // 3D 元素的整体透明度过渡\n\n ctx.globalAlpha = d3a;\n this.drawWalls(d3a); // 绘制底/侧面背景\n this.drawGrid(d3a); // 绘制网格辅助线\n this.drawZones(d3a); // 绘制诊断区域\n this.drawAxes(d3a); // 绘制坐标轴\n this.drawTickLabels(d3a); // 绘制刻度数值\n\n // 样本点渲染(按深度排序以解决 Z-fighting 问题)\n const pts = Array.isArray(points) ? points : [];\n [...pts]\n .sort(\n (a, b) =>\n this.proj(DGAScale.realToU(a.position.x), DGAScale.realToU(a.position.y), DGAScale.realToU(a.position.z)).depth -\n this.proj(DGAScale.realToU(b.position.x), DGAScale.realToU(b.position.y), DGAScale.realToU(b.position.z)).depth\n )\n .forEach((p) => this.drawPoint3D(p, d3a));\n\n ctx.globalAlpha = 1;\n // 如果处于 2D 视图状态,且开启了 plane2D 显示,则叠加 2D 专业投影层\n if (flat > 0 && this.opts.plane2D.show) this.draw2DOverlay(view, flat, pts);\n }\n\n // 基础绘制\n face(pts4, fill, stroke) {\n const ctx = this.ctx,\n pp = pts4.map((c) => this.proj(...c));\n ctx.beginPath();\n ctx.moveTo(pp[0].x, pp[0].y);\n for (let i = 1; i < pp.length; i++) ctx.lineTo(pp[i].x, pp[i].y);\n ctx.closePath();\n if (fill) {\n ctx.fillStyle = fill;\n ctx.fill();\n }\n if (stroke) {\n ctx.strokeStyle = stroke;\n ctx.lineWidth = 0.8;\n ctx.stroke();\n }\n }\n\n line(a, b) {\n const ctx = this.ctx;\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n ctx.stroke();\n }\n\n box(x0, x1, y0, y1, z0, z1, fill, edge) {\n const faces = [\n { f: [[x0, y0, z0], [x1, y0, z0], [x1, y1, z0], [x0, y1, z0]], n: [0, 0, -1] },\n { f: [[x0, y0, z1], [x1, y0, z1], [x1, y1, z1], [x0, y1, z1]], n: [0, 0, 1] },\n { f: [[x0, y0, z0], [x1, y0, z0], [x1, y0, z1], [x0, y0, z1]], n: [0, -1, 0] },\n { f: [[x0, y1, z0], [x1, y1, z0], [x1, y1, z1], [x0, y1, z1]], n: [0, 1, 0] },\n { f: [[x0, y0, z0], [x0, y1, z0], [x0, y1, z1], [x0, y0, z1]], n: [-1, 0, 0] },\n { f: [[x1, y0, z0], [x1, y1, z0], [x1, y1, z1], [x1, y0, z1]], n: [1, 0, 0] },\n ];\n\n faces\n .filter(({ n }) => !this.isBackface(n[0], n[1], n[2]))\n .map(({ f }) => ({\n f,\n d: f.reduce((s, c) => s + this.proj(...c).depth, 0) / f.length,\n }))\n .sort((a, b) => a.d - b.d)\n .forEach(({ f }) => this.face(f, fill, edge));\n }\n\n drawWalls(d3a = 1) {\n const ctx = this.ctx;\n const wallOpt = this.opts.wall;\n if (!wallOpt.show) return;\n\n const ax = this.opts.axis.data;\n const tv = ThreeRatioConfig.TICKS.vals;\n\n const walls = [\n { // X-Z 面 (底层底面通常认为是 z=0 或 y=0)\n pts: [[0, 0, 0], [1, 0, 0], [1, 0, 1], [0, 0, 1]],\n color: wallOpt.fill.colors.xz || ax.x.color,\n segs: (t) => [[this.proj(t, 0, 0), this.proj(t, 0, 1)], [this.proj(0, 0, t), this.proj(1, 0, t)]],\n gridColor: ax.x.color\n },\n { // Y-Z 面\n pts: [[0, 0, 0], [0, 1, 0], [0, 1, 1], [0, 0, 1]],\n color: wallOpt.fill.colors.yz || ax.y.color,\n segs: (t) => [[this.proj(0, t, 0), this.proj(0, t, 1)], [this.proj(0, 0, t), this.proj(0, 1, t)]],\n gridColor: ax.y.color\n },\n { // X-Y 面\n pts: [[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]],\n color: wallOpt.fill.colors.xy || ax.z.color,\n segs: (t) => [[this.proj(t, 0, 0), this.proj(t, 1, 0)], [this.proj(0, t, 0), this.proj(1, t, 0)]],\n gridColor: ax.z.color\n },\n ];\n\n // 绘制墙面填充\n if (wallOpt.fill.show) {\n ctx.globalAlpha = wallOpt.fill.alpha * d3a;\n walls.forEach((w) => this.face(w.pts, w.color));\n ctx.globalAlpha = d3a;\n }\n\n // 绘制墙面网格\n if (wallOpt.grid.show) {\n ctx.lineWidth = wallOpt.grid.lineStyle.lineWidth;\n ctx.globalAlpha = wallOpt.grid.lineStyle.alpha * d3a;\n // 简单支持 dashed\n if (wallOpt.grid.lineStyle.type === 'dashed') ctx.setLineDash([4, 4]);\n else if (wallOpt.grid.lineStyle.type === 'dotted') ctx.setLineDash([2, 2]);\n else ctx.setLineDash([]);\n\n walls.forEach(({ gridColor, segs }) => {\n ctx.strokeStyle = gridColor;\n tv.forEach((t) => segs(t).forEach(([a, b]) => this.line(a, b)));\n });\n ctx.setLineDash([]);\n ctx.globalAlpha = d3a;\n }\n\n // 绘制墙面边框\n if (wallOpt.border.show) {\n ctx.lineWidth = wallOpt.border.lineStyle.lineWidth;\n ctx.globalAlpha = wallOpt.border.lineStyle.alpha * d3a;\n if (wallOpt.border.lineStyle.type === 'dashed') ctx.setLineDash([4, 4]);\n else if (wallOpt.border.lineStyle.type === 'dotted') ctx.setLineDash([2, 2]);\n else ctx.setLineDash([]);\n\n walls.forEach(({ pts, gridColor }) => {\n ctx.strokeStyle = gridColor;\n pts.forEach((p, i) => this.line(this.proj(...p), this.proj(...pts[(i + 1) % pts.length])));\n });\n ctx.setLineDash([]);\n ctx.globalAlpha = d3a;\n }\n }\n\n drawGrid(d3a = 1) {\n const ctx = this.ctx;\n ctx.globalAlpha = d3a;\n ctx.strokeStyle = this.theme.outerGrid;\n ctx.lineWidth = 0.4;\n ThreeRatioConfig.TICKS.vals.forEach((t) => {\n this.line(this.proj(1, t, 0), this.proj(1, t, 1));\n this.line(this.proj(1, 0, t), this.proj(1, 1, t));\n });\n }\n\n drawZones(d3a) {\n const ctx = this.ctx,\n vis = ThreeRatioConfig.ZONE_VIS;\n [...this.zone]\n .sort(\n (a, b) =>\n this.proj((a.x0 + a.x1) / 2, (a.y0 + a.y1) / 2, (a.z0 + a.z1) / 2).depth -\n this.proj((b.x0 + b.x1) / 2, (b.y0 + b.y1) / 2, (b.z0 + b.z1) / 2).depth\n )\n .forEach((z) => {\n ctx.globalAlpha = d3a;\n const fA = z.fillAlpha !== undefined ? z.fillAlpha : vis.fillAlpha;\n this.box(z.x0, z.x1, z.y0, z.y1, z.z0, z.z1, z.fillBase + fA + ')', z.edgeStr);\n if (d3a > 0.05) {\n ctx.globalAlpha = d3a * vis.labelAlpha;\n const pp = this.proj((z.x0 + z.x1) / 2, (z.y0 + z.y1) / 2, (z.z0 + z.z1) / 2);\n ctx.font = z.labelFontStr || this.getFont('zone');\n ctx.textAlign = 'center';\n ctx.fillStyle = z.labelColor;\n ctx.fillText(z.name, pp.x, pp.y);\n }\n ctx.globalAlpha = d3a;\n });\n }\n\n drawAxes(d3a = 1) {\n const ctx = this.ctx;\n ctx.globalAlpha = d3a;\n const axisOpt = this.opts.axis;\n if (!axisOpt.show) return;\n\n [\n { from: [0, 0, 0], to: [1.18, 0, 0], lp: [1.22, 0, 0], ...axisOpt.data.x },\n { from: [0, 0, 0], to: [0, 1.18, 0], lp: [0, 1.22, 0], ...axisOpt.data.y },\n { from: [0, 0, 0], to: [0, 0, 1.22], lp: [0, 0, 1.28], ...axisOpt.data.z },\n ].forEach((ax) => {\n const f = this.proj(...ax.from),\n t = this.proj(...ax.to);\n ctx.beginPath();\n ctx.moveTo(f.x, f.y);\n ctx.lineTo(t.x, t.y);\n ctx.strokeStyle = ax.color;\n ctx.lineWidth = axisOpt.lineStyle.lineWidth;\n ctx.stroke();\n\n if (axisOpt.lineStyle.arrowSize > 0) {\n const dx = t.x - f.x,\n dy = t.y - f.y,\n len = Math.hypot(dx, dy) || 1,\n ux = dx / len,\n uy = dy / len,\n as = axisOpt.lineStyle.arrowSize;\n ctx.beginPath();\n ctx.moveTo(t.x, t.y);\n ctx.lineTo(t.x - ux * as + uy * (as / 2.25), t.y - uy * as - ux * (as / 2.25));\n ctx.lineTo(t.x - ux * as - uy * (as / 2.25), t.y - uy * as + ux * (as / 2.25));\n ctx.closePath();\n ctx.fillStyle = ax.color;\n ctx.fill();\n }\n\n if (axisOpt.labelStyle.show) {\n // Adjust endpoint for distance\n const dx = t.x - f.x, dy = t.y - f.y;\n const len = Math.hypot(dx, dy) || 1;\n const lx = t.x + (dx / len) * axisOpt.labelStyle.distance;\n const ly = t.y + (dy / len) * axisOpt.labelStyle.distance;\n\n ctx.fillStyle = ax.color;\n ctx.font = `${axisOpt.labelStyle.fontWeight} ${axisOpt.labelStyle.fontSize}px ${this.opts.textStyle?.fontFamily || ThreeRatioConfig.TEXT_STYLE.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(ax.name, lx, ly);\n }\n });\n }\n\n drawTickLabels(d3a = 1) {\n const ctx = this.ctx;\n ctx.globalAlpha = d3a;\n const { vals, labels } = ThreeRatioConfig.TICKS,\n ta = this.theme.tickAlpha;\n ctx.font = this.getFont('tick');\n vals.forEach((t, i) => {\n let p = this.proj(t, 0, 0);\n ctx.fillStyle = ThreeRatioConfig.AXES.x.color + ta;\n ctx.textAlign = 'center';\n ctx.fillText(labels[i], p.x, p.y + 13);\n p = this.proj(0, t, 0);\n ctx.fillStyle = ThreeRatioConfig.AXES.y.color + ta;\n ctx.textAlign = 'left';\n ctx.fillText(labels[i], p.x + 7, p.y + 4);\n p = this.proj(0, 0, t);\n ctx.fillStyle = ThreeRatioConfig.AXES.z.color + ta;\n ctx.textAlign = 'right';\n ctx.fillText(labels[i], p.x - 7, p.y + 4);\n });\n ctx.textAlign = 'center';\n }\n\n drawPoint3D(p, alpha) {\n const ux = DGAScale.realToU(p.position.x),\n uy = DGAScale.realToU(p.position.y),\n uz = DGAScale.realToU(p.position.z);\n this.drawPointAt(this.proj(ux, uy, uz), p, alpha);\n }\n\n drawPointAt(pos, p, alpha = 1) {\n const ctx = this.ctx,\n pv = ThreeRatioConfig.POINT;\n const px = pos.x ?? pos.cx,\n py = pos.y ?? pos.cy;\n\n const r = p.itemStyle?.radius ?? pv.defaultSize;\n const c = p.itemStyle?.color ?? p.color;\n const lbl = p.name;\n const textStyle = p.textStyle || {};\n const hasGlowStyle = p.glowStyle !== undefined;\n const glowStyle = p.glowStyle || {};\n\n if (hasGlowStyle && glowStyle.show !== false) {\n let glowColors = [];\n let layers = 3;\n let dist = glowStyle.glowDistance !== undefined ? glowStyle.glowDistance : 4;\n const baseColor = glowStyle.color ?? c;\n\n if (Array.isArray(glowStyle.colors) && glowStyle.colors.length > 0) {\n glowColors = glowStyle.colors;\n layers = glowColors.length;\n } else {\n const startColor = glowStyle.startColor || colorToRgba(baseColor, 0.15);\n const endColor = glowStyle.endColor || 'transparent';\n layers = glowStyle.count !== undefined ? parseInt(glowStyle.count, 10) : 3;\n glowColors = [];\n for (let i = 0; i < layers; i++) {\n const factor = layers > 1 ? i / (layers - 1) : 0;\n glowColors.push(interpolateColor(startColor, endColor, factor));\n }\n }\n\n for (let i = layers - 1; i >= 0; i--) {\n const glowColor = glowColors[i];\n ctx.save();\n ctx.fillStyle = glowColor;\n ctx.beginPath();\n ctx.arc(px, py, r + (i + 1) * dist, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n }\n }\n\n ctx.globalAlpha = alpha;\n ctx.beginPath();\n ctx.arc(px, py, r, 0, Math.PI * 2);\n const g = ctx.createRadialGradient(px - r * pv.hlOffset, py - r * pv.hlOffset, 1, px, py, r);\n g.addColorStop(0, 'rgba(255,255,255,0.9)');\n g.addColorStop(0.4, c + 'ee');\n g.addColorStop(1, c + '88');\n ctx.fillStyle = g;\n ctx.fill();\n ctx.strokeStyle = this.theme.pointStroke;\n ctx.lineWidth = 1.3;\n ctx.stroke();\n ctx.restore();\n\n if (lbl) {\n ctx.font = textStyle.bold\n ? `bold ${textStyle.fontSize || 12}px ${textStyle.fontFamily || 'sans-serif'}`\n : `${textStyle.fontSize || 12}px ${textStyle.fontFamily || 'sans-serif'}`;\n ctx.fillStyle = textStyle.color ?? p.color;\n ctx.textAlign = 'left';\n ctx.fillText(lbl, px + r + 3, py - 2);\n }\n }\n\n draw2DOverlay(view, alpha, points) {\n const plane = ThreeRatioConfig.PLANES[view];\n if (!plane) return;\n const ctx = this.ctx,\n th = this.theme,\n opt2d = this.opts.plane2D,\n axOpt = this.opts.axis.data;\n\n ctx.save();\n ctx.globalAlpha = alpha;\n\n // 废弃绝对的 PAD2D,但若未开启自定义网格边距,为了防止2D文字被裁切,需要给予一个默认的边界保护\n let left = this.offsetX,\n top = this.offsetY,\n right = this.offsetX + this.renderW,\n bottom = this.offsetY + this.renderH;\n\n const grid = this.opts.grid || {};\n const hasGridMargin = grid.left !== undefined || grid.right !== undefined || grid.top !== undefined || grid.bottom !== undefined;\n if (!hasGridMargin) {\n const pad = ThreeRatioConfig.PAD2D || { l: 70, r: 30, t: 50, b: 60 };\n left = pad.l;\n top = pad.t;\n right = this.W - pad.r;\n bottom = this.H - pad.b;\n }\n\n // 强制将 2D 投影区域转换为居中的正方形\n const availW = right - left;\n const availH = bottom - top;\n const sqSize = Math.min(availW, availH);\n const cx = left + availW / 2;\n const cy = top + availH / 2;\n left = cx - sqSize / 2;\n right = cx + sqSize / 2;\n top = cy - sqSize / 2;\n bottom = cy + sqSize / 2;\n\n const { vals, labels } = ThreeRatioConfig.TICKS;\n const u2c = (h, v) => ({\n cx: left + h * (right - left),\n cy: bottom - v * (bottom - top),\n });\n const themeName = this.themeName ?? 'dark';\n\n // 绘制背景\n if (opt2d.grid.show) {\n ctx.fillStyle = opt2d.grid.backgroundColor ?? (plane.bgColor[themeName] ?? plane.bgColor.dark);\n ctx.fillRect(left, top, right - left, bottom - top);\n }\n\n // 绘制区域 (Zones)\n if (opt2d.zone.show) {\n this.zone.forEach((z) => {\n const [h0, h1] = [z[plane.hAxis + '0'], z[plane.hAxis + '1']];\n const [v0, v1] = [z[plane.vAxis + '0'], z[plane.vAxis + '1']];\n const p0 = u2c(h0, v0),\n p1 = u2c(h1, v1),\n pw = p1.cx - p0.cx,\n ph = p0.cy - p1.cy;\n\n const fA = z.fillAlpha !== undefined ? z.fillAlpha : opt2d.zone.alpha;\n ctx.fillStyle = z.fillBase + fA + ')';\n ctx.fillRect(p0.cx, p1.cy, pw, ph);\n\n if (opt2d.zone.borderStyle.show) {\n ctx.strokeStyle = z.edgeStr;\n ctx.lineWidth = opt2d.zone.borderStyle.width ?? 1.4;\n ctx.strokeRect(p0.cx, p1.cy, pw, ph);\n }\n\n const mx = (p0.cx + p1.cx) / 2,\n my = (p0.cy + p1.cy) / 2;\n ctx.font = z.labelFontStr || this.getFont('zone');\n ctx.textAlign = 'center';\n ctx.fillStyle = z.labelColor;\n \n // 支持 formatter 回调\n const globalLabelStyle = this.opts.zone?.labelStyle || {};\n const text = typeof globalLabelStyle.formatter === 'function' ? globalLabelStyle.formatter(z) : z.name;\n \n ctx.fillText(text, mx, my + 4);\n });\n }\n\n // 绘制网格线 (Grid)\n if (opt2d.grid.show) {\n ctx.strokeStyle = opt2d.grid.lineStyle.color || th.plane2dGrid;\n ctx.lineWidth = opt2d.grid.lineStyle.lineWidth;\n ctx.globalAlpha = alpha * opt2d.grid.lineStyle.alpha;\n\n if (opt2d.grid.lineStyle.type === 'dashed') ctx.setLineDash([4, 4]);\n else if (opt2d.grid.lineStyle.type === 'dotted') ctx.setLineDash([2, 2]);\n else ctx.setLineDash([]);\n\n vals.forEach((v) => {\n const ph = u2c(v, 0).cx,\n pv = u2c(0, v).cy;\n ctx.beginPath();\n ctx.moveTo(ph, top);\n ctx.lineTo(ph, bottom);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(left, pv);\n ctx.lineTo(right, pv);\n ctx.stroke();\n });\n ctx.setLineDash([]);\n ctx.globalAlpha = alpha;\n }\n\n // 绘制坐标轴 (Axis)\n if (opt2d.axis.show) {\n const hColor = axOpt[plane.hAxis].color;\n const vColor = axOpt[plane.vAxis].color;\n\n ctx.lineWidth = opt2d.axis.lineStyle.lineWidth;\n ctx.globalAlpha = alpha * opt2d.axis.lineStyle.alpha;\n\n // 横轴\n ctx.strokeStyle = hColor;\n ctx.beginPath();\n ctx.moveTo(left, bottom);\n ctx.lineTo(right + 10, bottom); // arrow extra\n ctx.stroke();\n\n // 纵轴\n ctx.strokeStyle = vColor;\n ctx.beginPath();\n ctx.moveTo(left, bottom);\n ctx.lineTo(left, top - 10); // arrow extra\n ctx.stroke();\n\n ctx.globalAlpha = alpha;\n const fontFam = this.opts.textStyle?.fontFamily || ThreeRatioConfig.TEXT_STYLE.fontFamily;\n\n // 刻度数值\n if (opt2d.axis.tickLabelStyle.show) {\n ctx.font = `${opt2d.axis.tickLabelStyle.fontSize}px ${fontFam}`;\n const dist = opt2d.axis.tickLabelStyle.distance;\n vals.forEach((v, i) => {\n ctx.fillStyle = hColor;\n ctx.textAlign = 'center';\n ctx.fillText(labels[i], u2c(v, 0).cx, bottom + dist + opt2d.axis.tickLabelStyle.fontSize / 2);\n ctx.fillStyle = vColor;\n ctx.textAlign = 'right';\n ctx.fillText(labels[i], left - dist + 2, u2c(0, v).cy + opt2d.axis.tickLabelStyle.fontSize / 3);\n });\n }\n\n // 轴标签\n if (opt2d.axis.labelStyle.show) {\n ctx.font = `bold ${opt2d.axis.labelStyle.fontSize}px ${fontFam}`;\n const dist = opt2d.axis.labelStyle.distance;\n\n ctx.textAlign = 'center';\n ctx.fillStyle = hColor;\n ctx.fillText(axOpt[plane.hAxis].name, (left + right) / 2, bottom + dist + opt2d.axis.labelStyle.fontSize);\n\n ctx.save();\n ctx.translate(left - dist - opt2d.axis.labelStyle.fontSize, (top + bottom) / 2);\n ctx.rotate(-Math.PI / 2);\n ctx.fillStyle = vColor;\n ctx.fillText(axOpt[plane.vAxis].name, 0, 0);\n ctx.restore();\n }\n }\n\n // 绘制散点\n points.forEach((p) => {\n const pos = u2c(DGAScale.realToU(p.position[plane.hAxis]), DGAScale.realToU(p.position[plane.vAxis]));\n this.drawPointAt(pos, p, alpha);\n });\n\n ctx.restore();\n }\n}\n\n/**\n * ThreeRatioChart: 顶层组件类\n * 负责业务状态管理、DOM 构建、动画控制及事件分发\n */\nexport class ThreeRatioChart {\n static VIEWS = {\n '3d': { rotX: () => ThreeRatioConfig.CAM.elev, rotY: () => ThreeRatioConfig.CAM.yaw },\n xz: { rotX: 0, rotY: 0 },\n yz: { rotX: 0, rotY: 90 },\n xy: { rotX: 90, rotY: 0 },\n };\n\n /**\n * 构造函数\n * @param {string|HTMLElement} container 容器选择器或元素\n * @param {Object} opts 配置项\n * @param {string} opts.initialView 初始视角 (默认 '3d')\n * @param {string} opts.theme 初始主题 ('dark' | 'light')\n */\n constructor(container, opts = {}) {\n this.series = [];\n this.opts = opts;\n this.cam = {\n rotX: ThreeRatioConfig.CAM.elev,\n rotY: ThreeRatioConfig.CAM.yaw,\n zoomFactor: 1.0,\n };\n this.view = opts.initialView ?? '3d';\n this.layout = opts.layout ?? 'fill';\n this.drag = { active: false, lastX: 0, lastY: 0 };\n this.tween = {\n from: { rotX: 0, rotY: 0 },\n to: { rotX: 0, rotY: 0 },\n t: 1,\n };\n this.animId = null;\n this.pinchDist = null;\n this._bus = new EventBus();\n\n container = typeof container === 'string' ? document.querySelector(container) : container;\n if (!container) throw new Error('ThreeRatioChart: container not found');\n this.buildDOM(container);\n\n this.renderer = new Renderer3D(this.ctx, this.W, this.H, opts);\n this.bindEvents();\n this.applyView();\n this.render();\n }\n\n\n\n /**\n * 设置图表配置(主要用于更新数据或视角)\n * @param {Object} opt\n */\n setOption(opt) {\n if (!opt) return;\n this.opts = { ...this.opts, ...opt };\n if (opt.zone || opt.textStyle || opt.theme || opt.wallColors || opt.layout !== undefined || opt.grid !== undefined || opt.axis !== undefined || opt.wall !== undefined || opt.plane2D !== undefined) {\n this.renderer.updateOptions({\n zone: this.opts.zone,\n textStyle: this.opts.textStyle,\n theme: this.opts.theme,\n wallColors: this.opts.wallColors,\n layout: this.opts.layout,\n grid: this.opts.grid,\n axis: this.opts.axis,\n wall: this.opts.wall,\n plane2D: this.opts.plane2D,\n });\n }\n if (opt.series !== undefined) {\n const arr = Array.isArray(opt.series) ? opt.series : [opt.series];\n this.series = arr.map((p) => ({\n name: p.name ?? '',\n color: p.color ?? ThreeRatioConfig.POINT.defaultColor,\n itemStyle: p.itemStyle ?? {},\n textStyle: p.textStyle ?? {},\n glowStyle: p.glowStyle,\n position: p.position ?? { x: 0, y: 0, z: 0 },\n }));\n this.emit('dataChange', [...this.series]);\n this.render();\n }\n if (opt.view && opt.view !== this.view) this.setView(opt.view);\n return this;\n }\n\n setSeries(series) {\n return this.setOption({ series });\n }\n\n /**\n * 切换视图角度(包含平滑补间动画)\n * @param {string} v 视图 ID\n */\n setView(v) {\n if (!ThreeRatioChart.VIEWS[v]) return;\n this.view = v;\n cancelAnimationFrame(this.animId);\n const tgt = this.getViewTarget(v);\n this.tween = {\n from: { rotX: this.cam.rotX, rotY: this.cam.rotY },\n to: tgt,\n t: 0,\n };\n this.cv.style.cursor = v === '3d' ? 'grab' : 'default';\n this.runTween();\n this._bus.emit('viewChange', v);\n }\n\n /** 切换主题渲染 */\n setTheme(name) {\n this.renderer.setTheme(name);\n this.render();\n }\n\n /**\n * 诊断逻辑:根据输入的三比值 X, Y, Z 判断所属故障区域\n * @returns {Array} 匹配到的诊断区域信息数组\n */\n diagnose(x, y, z) {\n if (!this.renderer) return [{ ...(this.opts.unknown ?? ThreeRatioConfig.UNKNOWN) }];\n const hits = this.renderer.zone\n .filter((r) => {\n if (!r.coordinates || r.coordinates.length < 2) return false;\n const p1 = r.coordinates[0];\n const p2 = r.coordinates[1];\n return x >= p1[0] && x < p2[0] && y >= p1[1] && y < p2[1] && z >= p1[2] && z < p2[2];\n })\n .map((r) => ({ name: r.name, title: r.title, color: r.color || '#fff' }));\n return hits.length ? hits : [{ ...(this.opts.unknown ?? ThreeRatioConfig.UNKNOWN) }];\n }\n\n on(event, handler) {\n this._bus.on(event, handler);\n return this;\n }\n\n off(event, handler) {\n this._bus.off(event, handler);\n return this;\n }\n\n emit(event, ...args) {\n this._bus.emit(event, ...args);\n }\n\n render() {\n if (!this.renderer || !this.ctx) return;\n this.renderer.draw(this.cam, this.series, this.view, this.flatness());\n \n // 渲染完成后触发 diagnose 事件,与 Pentagon/Etra/Triangle 统一\n const results = [];\n this.series.forEach((s) => {\n if (s.position) {\n const zone = this.diagnose(s.position.x, s.position.y, s.position.z);\n results.push({\n series: s,\n zone: zone.length ? zone[0] : null,\n position: s.position\n });\n }\n });\n if (results.length > 0) {\n this._bus.emit('diagnose', results);\n }\n }\n\n dispose() {\n cancelAnimationFrame(this.animId);\n this.resizeObs?.disconnect();\n this.cv?.remove();\n window.removeEventListener('mousemove', this.onMouseMove);\n window.removeEventListener('mouseup', this.onMouseUp);\n this._bus?.dispose();\n }\n\n // 内部方法\n getViewTarget(v) {\n const d = ThreeRatioChart.VIEWS[v];\n return {\n rotX: typeof d.rotX === 'function' ? d.rotX() : d.rotX,\n rotY: typeof d.rotY === 'function' ? d.rotY() : d.rotY,\n };\n }\n\n applyView() {\n if (this.view !== '3d') {\n const t = this.getViewTarget(this.view);\n this.cam.rotX = t.rotX;\n this.cam.rotY = t.rotY;\n this.cv.style.cursor = 'default';\n }\n }\n\n flatness() {\n if (this.view === '3d') return 0;\n const t = this.getViewTarget(this.view);\n return Math.max(0, 1 - (Math.abs(this.cam.rotX - t.rotX) + Math.abs(this.cam.rotY - t.rotY)) / 30);\n }\n\n runTween() {\n this.tween.t = Math.min(1, this.tween.t + ThreeRatioConfig.TWEEN.step);\n const e = ((t) => (t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2))(this.tween.t);\n this.cam.rotX = this.tween.from.rotX + (this.tween.to.rotX - this.tween.from.rotX) * e;\n this.cam.rotY = this.tween.from.rotY + (this.tween.to.rotY - this.tween.from.rotY) * e;\n this.render();\n if (this.tween.t < 1) this.animId = requestAnimationFrame(() => this.runTween());\n }\n\n buildDOM(container) {\n const dpr = window.devicePixelRatio || 1;\n const rect = container.getBoundingClientRect();\n this.W = rect.width > 0 ? Math.round(rect.width) : 600;\n this.H = rect.height > 0 ? Math.round(rect.height) : 540;\n this.cv = document.createElement('canvas');\n this.cv.className = 'trc-canvas';\n this.cv.width = this.W * dpr;\n this.cv.height = this.H * dpr;\n this.cv.style.cssText = 'width:100%;height:100%;display:block;touch-action:none;';\n this.ctx = this.cv.getContext('2d');\n container.appendChild(this.cv);\n this.resizeObs = new ResizeObserver((entries) => {\n const { width, height } = entries[0].contentRect;\n if (width > 0 && height > 0) {\n const dpr = window.devicePixelRatio || 1;\n this.W = Math.round(width);\n this.H = Math.round(height);\n this.cv.width = this.W * dpr;\n this.cv.height = this.H * dpr;\n this.renderer?.resize(this.W, this.H);\n this.render();\n }\n });\n this.resizeObs.observe(container);\n }\n\n bindEvents() {\n const d = ThreeRatioConfig.DRAG,\n cv = this.cv;\n cv.addEventListener('mousedown', (e) => {\n if (this.view !== '3d') return;\n this.drag = { active: true, lastX: e.clientX, lastY: e.clientY };\n cv.style.cursor = 'grabbing';\n cancelAnimationFrame(this.animId);\n });\n this.onMouseMove = (e) => {\n if (!this.drag.active || this.view !== '3d') return;\n this.cam.rotY += (e.clientX - this.drag.lastX) * d.rotYSens;\n this.cam.rotX = Math.max(\n d.rotXMin,\n Math.min(d.rotXMax, this.cam.rotX + (e.clientY - this.drag.lastY) * d.rotXSens)\n );\n this.drag.lastX = e.clientX;\n this.drag.lastY = e.clientY;\n this.render();\n };\n this.onMouseUp = () => {\n this.drag.active = false;\n if (this.view === '3d') cv.style.cursor = 'grab';\n };\n window.addEventListener('mousemove', this.onMouseMove);\n window.addEventListener('mouseup', this.onMouseUp);\n cv.addEventListener(\n 'touchstart',\n (e) => {\n if (this.view !== '3d') return;\n this.drag = {\n active: true,\n lastX: e.touches[0].clientX,\n lastY: e.touches[0].clientY,\n };\n if (e.touches.length === 2)\n this.pinchDist = Math.hypot(\n e.touches[0].clientX - e.touches[1].clientX,\n e.touches[0].clientY - e.touches[1].clientY\n );\n },\n { passive: true }\n );\n cv.addEventListener(\n 'touchmove',\n (e) => {\n if (this.view !== '3d') return;\n if (e.touches.length === 2 && this.pinchDist !== null) {\n const dist = Math.hypot(\n e.touches[0].clientX - e.touches[1].clientX,\n e.touches[0].clientY - e.touches[1].clientY\n );\n this.cam.zoomFactor = Math.max(\n d.zoomMin,\n Math.min(d.zoomMax, (this.cam.zoomFactor * dist) / this.pinchDist)\n );\n this.pinchDist = dist;\n this.render();\n } else if (this.drag.active && e.touches.length === 1) {\n this.cam.rotY += (e.touches[0].clientX - this.drag.lastX) * d.rotYSens;\n this.cam.rotX = Math.max(\n d.rotXMin,\n Math.min(d.rotXMax, this.cam.rotX + (e.touches[0].clientY - this.drag.lastY) * d.rotXSens)\n );\n this.drag.lastX = e.touches[0].clientX;\n this.drag.lastY = e.touches[0].clientY;\n this.render();\n }\n },\n { passive: true }\n );\n cv.addEventListener(\n 'touchend',\n (e) => {\n if (e.touches.length < 2) this.pinchDist = null;\n if (e.touches.length === 0) this.drag.active = false;\n },\n { passive: true }\n );\n cv.addEventListener(\n 'wheel',\n (e) => {\n if (this.view !== '3d') return;\n e.preventDefault();\n this.cam.zoomFactor = Math.max(\n d.zoomMin,\n Math.min(d.zoomMax, this.cam.zoomFactor * (e.deltaY > 0 ? d.zoomOut : d.zoomIn))\n );\n this.render();\n },\n { passive: false }\n );\n }\n}\n\nfunction parseRgba(color) {\n const cleaned = color.trim().toLowerCase();\n if (cleaned.startsWith('#')) {\n let hex = cleaned.slice(1);\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n const a = hex.length === 8 ? parseInt(hex.substring(6, 8), 16) / 255 : 1;\n return [r, g, b, a];\n }\n const m = cleaned.match(/rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\)/);\n if (m) {\n return [\n parseInt(m[1], 10),\n parseInt(m[2], 10),\n parseInt(m[3], 10),\n m[4] !== undefined ? parseFloat(m[4]) : 1\n ];\n }\n if (cleaned === 'transparent') return [0, 0, 0, 0];\n return [255, 255, 255, 1];\n}\n\nfunction colorToRgba(color, alpha) {\n const [r, g, b, a] = parseRgba(color);\n return `rgba(${r},${g},${b},${alpha !== undefined ? alpha : a})`;\n}\n\nfunction interpolateColor(c1, c2, factor) {\n const [r1, g1, b1, a1] = parseRgba(c1);\n const [r2, g2, b2, a2] = parseRgba(c2);\n const r = Math.round(r1 + (r2 - r1) * factor);\n const g = Math.round(g1 + (g2 - g1) * factor);\n const b = Math.round(b1 + (b2 - b1) * factor);\n const a = a1 + (a2 - a1) * factor;\n return `rgba(${r},${g},${b},${a})`;\n}\n","/**\n * DGA 平面多边形类 (ETRA Chart)\n * 二维平面坐标系区域判定及渲染图表组件,通过对数缩放支持不同范围数据的展示。\n */\nimport { inPoly, hexToRgba, deepMerge, EventBus, ZoomController, DOMTooltip, parseGridBox, drawShapePath, DEFAULT_COLORS } from './utils.js';\nimport { ETRA_ZONES_A } from './zones.js';\n\n/** 将颜色转换为带有透明度的 RGBA 格式 */\nfunction colorToRgba(color, alpha) {\n if (!color) return `rgba(0,0,0,${alpha})`;\n if (color.startsWith('#')) return hexToRgba(color, alpha);\n if (color.startsWith('rgb')) {\n return color.replace(/rgb(a)?\\(([^)]+)\\)/, (m, a, content) => {\n const parts = content.split(',');\n const r = parts[0].trim();\n const g = parts[1].trim();\n const b = parts[2].trim();\n return `rgba(${r},${g},${b},${alpha})`;\n });\n }\n return color;\n}\n\n/** 图表默认配置项 */\nconst DEFAULTS = {\n colors: DEFAULT_COLORS,\n theme: 'light',\n backgroundColor: 'transparent',\n grid: {\n left: 72, right: 20, top: 20, bottom: 56,\n lineStyle: { type: 'solid', width: 0.4, color: null },\n majorLineStyle: { type: 'solid', width: 0.8, color: null }\n },\n zone: {\n data: ETRA_ZONES_A,\n alpha: 0.75,\n labelStyle: { show: true, fontSize: 12, borderRadius: 4 },\n borderStyle: { show: true, stroke: 1, type: 'solid', color: null }\n },\n xAxis: {\n title: '',\n min: -2, max: 3, // 以10为底的对数范围 (例如 -2 表示 10^-2 = 0.01)\n labelStyle: { fontSize: 11, fontWeight: 'normal', offsetX: 0, offsetY: 0, color: null, scientific: true, formatter: null },\n lineStyle: { show: true, stroke: 1.5, type: 'solid', color: null },\n titleStyle: { fontSize: 13, color: null, fontWeight: 'normal', align: 'center', offsetX: 0, offsetY: 0 }\n },\n yAxis: {\n title: '',\n min: -3, max: 3, // 以10为底的对数范围\n labelStyle: { fontSize: 11, fontWeight: 'normal', offsetX: 0, offsetY: 0, color: null, scientific: true, formatter: null },\n lineStyle: { show: true, stroke: 1.5, type: 'solid', color: null },\n titleStyle: { fontSize: 13, color: null, fontWeight: 'normal', align: 'center', offsetX: 0, offsetY: 0 }\n },\n tooltip: { show: true, formatter: null },\n series: []\n};\n\n/** 主题颜色配置 (浅色/深色) */\nconst THEME = {\n light: {\n backgroundColor: '#ffffff',\n text: '#333333',\n textSecondary: '#666666',\n gridLine: 'rgba(0,0,0,0.12)',\n gridLineMajor: 'rgba(0,0,0,0.22)',\n axisLine: 'rgba(0,0,0,0.5)',\n zoneBorder: 'rgba(0,0,0,0.35)',\n zoneLabelBg: 'rgba(255,255,255,0.75)',\n tooltipBg: 'rgba(255,255,255,0.95)',\n tooltipBorder: 'rgba(0,0,0,0.15)',\n tooltipTextColor: '#222222'\n },\n dark: {\n backgroundColor: '#1a1a2e',\n text: 'rgba(255,255,255,0.85)',\n textSecondary: 'rgba(255,255,255,0.5)',\n gridLine: 'rgba(255,255,255,0.08)',\n gridLineMajor: 'rgba(255,255,255,0.18)',\n axisLine: 'rgba(255,255,255,0.55)',\n zoneBorder: 'rgba(255,255,255,0.3)',\n zoneLabelBg: 'rgba(0,0,0,0.5)',\n tooltipBg: 'rgba(20,20,40,0.95)',\n tooltipBorder: 'rgba(255,255,255,0.15)',\n tooltipTextColor: 'rgba(255,255,255,0.9)'\n }\n};\n\n/** 将对数值格式化为 10 的幂次方字符串格式,例如 2 -> 10² */\nfunction fmtLog(v) {\n const e = Math.round(v);\n const sup = String(e).split('').map(c =>\n ({ '-': '⁻', '0': '⁰', '1': '¹', '2': '²', '3': '³', '4': '⁴', '5': '⁵', '6': '⁶', '7': '⁷', '8': '⁸', '9': '⁹' }[c] || c)\n ).join('');\n return '10' + sup;\n}\n\n/** ETRA 图表核心类 */\nexport class ETRAChart {\n /** 构造函数,初始化容器、合并配置并绑定事件 */\n constructor(container, option = {}) {\n if (typeof container === 'string') {\n container = document.querySelector(container);\n }\n if (!container) throw new Error('[ETRAChart] Container element not found');\n\n this._container = container;\n this._opt = deepMerge(deepMerge({}, DEFAULTS), option);\n this._bus = new EventBus();\n\n this._initDOM();\n\n // 统一组件\n this._zoom = new ZoomController(this._opt.zoom || {});\n\n this._tooltipRenderer = new DOMTooltip(this._container, this._theme);\n\n this._hoverZone = null;\n this._hoverPoint = null;\n\n // 监听容器尺寸变化\n if (typeof ResizeObserver !== 'undefined') {\n this._ro = new ResizeObserver(() => this.resize());\n this._ro.observe(this._container);\n }\n\n // 鼠标缩放和悬浮判定交互事件\n this._onWheel = (e) => {\n e.preventDefault();\n const rect = this._canvas.getBoundingClientRect();\n const ax = e.clientX - rect.left;\n const ay = e.clientY - rect.top;\n this._zoom.onWheel(e.deltaY, ax, ay);\n this._bus.emit('zoom', this._zoom.state);\n this._render();\n };\n\n this._onDown = (e) => {\n if (e.button !== 0) return;\n this._zoom.startDrag(e.clientX, e.clientY);\n this._canvas.style.cursor = 'grabbing';\n };\n\n this._onMove = (e) => {\n const rect = this._canvas.getBoundingClientRect();\n if (this._zoom.moveDrag(e.clientX, e.clientY, 1)) {\n this._render();\n return;\n }\n if (!this._coordMap || !this._drawnPoints) return;\n \n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n const { panX, panY, zoom } = this._zoom;\n const rawX = (mouseX - panX) / zoom;\n const rawY = (mouseY - panY) / zoom;\n\n let found = null;\n let minDist = Infinity;\n for (const pt of this._drawnPoints) {\n const dist = Math.hypot(rawX - pt.px, rawY - pt.py);\n const size = pt.series.size || 6;\n if (dist < size * 2 + 5 && dist < minDist) {\n minDist = dist;\n found = pt;\n }\n }\n if (found !== this._hoverPoint) {\n this._hoverPoint = found;\n this._render();\n if (found) {\n this._canvas.style.cursor = 'pointer';\n this._bus.emit('hover', found);\n } else {\n this._canvas.style.cursor = 'default';\n this._bus.emit('hover', null);\n }\n }\n };\n\n this._onUp = () => {\n if (!this._zoom.endDrag()) return;\n this._canvas.style.cursor = this._hoverPoint ? 'pointer' : 'default';\n this._bus.emit('zoom', this._zoom.state);\n };\n\n this._onLeave = () => {\n if (this._hoverPoint) {\n this._hoverPoint = null;\n this._canvas.style.cursor = 'default';\n this._render();\n this._bus.emit('hover', null);\n }\n };\n\n this._onDbl = () => {\n this._zoom.reset();\n this._bus.emit('zoom', this._zoom.state);\n this._render();\n };\n\n const cv = this._canvas;\n cv.addEventListener('wheel', this._onWheel, { passive: false });\n cv.addEventListener('mousedown', this._onDown);\n cv.addEventListener('mousemove', this._onMove);\n cv.addEventListener('mouseleave', this._onLeave);\n cv.addEventListener('dblclick', this._onDbl);\n window.addEventListener('mouseup', this._onUp);\n\n this._render();\n }\n\n /** 静态工厂方法,快速初始化图表实例 */\n static init(container, option) {\n return new ETRAChart(container, option);\n }\n\n /** 获取当前匹配的主题配置 */\n get _theme() {\n return THEME[this._opt.theme] || THEME.light;\n }\n\n /** 初始化 DOM 结构,创建内部 Canvas 画布 */\n _initDOM() {\n this._container.style.position = 'relative';\n this._container.style.overflow = 'hidden';\n\n this._canvas = document.createElement('canvas');\n this._canvas.style.display = 'block';\n this._canvas.style.width = '100%';\n this._canvas.style.height = '100%';\n this._container.appendChild(this._canvas);\n\n this._ctx = this._canvas.getContext('2d');\n }\n\n /** 设置或更新图表配置项,并触发重绘 */\n setOption(option) {\n this._opt = deepMerge(this._opt, option);\n if (option.series !== undefined) {\n this._opt.series = Array.isArray(option.series) ? option.series : [option.series];\n }\n this._coordMap = null;\n if (this._canvas && this._canvas.width > 0) this._render();\n return this;\n }\n\n /** 单独更新数据系列并重绘 */\n setSeries(series) {\n this._opt.series = Array.isArray(series) ? series : [series];\n this._render();\n return this;\n }\n\n /**\n * 诊断指定的坐标数据,返回命中的区域\n * @param {number} x - 原始或对数 X 坐标 (取决于实际的 logScale 配置)\n * @param {number} y - 原始或对数 Y 坐标\n * @returns {object|null} - 命中的故障区域对象\n */\n diagnose(x, y) {\n if (!this._opt.zone || !this._opt.zone.data) return null;\n for (const zone of this._opt.zone.data) {\n if (zone.coordinates && inPoly(x, y, zone.coordinates)) {\n return zone;\n }\n }\n return null;\n }\n\n /** 绑定事件监听器 (如 hover, zoom, diagnose) */\n on(event, handler) {\n this._bus.on(event, handler);\n return this;\n }\n\n /** 移除指定的事件监听器 */\n off(event, handler) {\n this._bus.off(event, handler);\n return this;\n }\n\n /** 强制触发图表尺寸重新计算并重绘 */\n resize() {\n this._render();\n return this;\n }\n\n /** 销毁图表实例,解绑事件清理 DOM 和内存 */\n dispose() {\n if (this._ro) this._ro.disconnect();\n this._tooltipRenderer.dispose();\n if (this._canvas && this._canvas.parentNode) {\n this._canvas.parentNode.removeChild(this._canvas);\n }\n this._bus.dispose();\n window.removeEventListener('mouseup', this._onUp);\n }\n\n /** 计算当前画布物理尺寸和图表可用绘图网格范围 */\n _dims() {\n const rect = this._container.getBoundingClientRect();\n const W = rect.width || 600;\n const H = rect.height || 400;\n\n const dpr = window.devicePixelRatio || 1;\n if (this._canvas.width !== Math.round(W * dpr) || this._canvas.height !== Math.round(H * dpr)) {\n this._canvas.width = Math.round(W * dpr);\n this._canvas.height = Math.round(H * dpr);\n }\n\n const box = parseGridBox(W, H, this._opt.grid, 0);\n return { W, H, box, dpr };\n }\n\n /** 核心主渲染流程 */\n _render() {\n const { W, H, box, dpr } = this._dims();\n const ctx = this._ctx;\n if (!ctx) return;\n\n const th = this._theme;\n const opt = this._opt;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, W, H);\n\n const bgColor = opt.backgroundColor || th.backgroundColor || 'transparent';\n if (bgColor && bgColor !== 'transparent') {\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, W, H);\n }\n\n // 坐标系范围定义\n const xMin = opt.xAxis.min;\n const xMax = opt.xAxis.max;\n const yMin = opt.yAxis.min;\n const yMax = opt.yAxis.max;\n\n const plotW = box.availW;\n const plotH = box.availH;\n const gL = box.left;\n const gT = box.top;\n\n const toPixX = (logVal) => gL + ((logVal - xMin) / (xMax - xMin)) * plotW;\n const toPixY = (logVal) => gT + ((yMax - logVal) / (yMax - yMin)) * plotH;\n \n // 保存映射函数和参数,供鼠标悬浮碰撞检测时复用\n this._coordMap = { xMin, xMax, yMin, yMax, plotW, plotH, gL, gT, toPixX, toPixY };\n\n // 保存上下文状态以应用缩放变换\n ctx.save();\n\n // 将缩放变换应用到图表各个元素 (网格、区域、坐标系内元素)\n this._zoom.applyTransform(ctx);\n\n this._drawGrid(ctx, toPixX, toPixY, th, opt);\n this._drawZones(ctx, toPixX, toPixY, th, opt);\n \n const results = this._drawSeries(ctx, toPixX, toPixY, th, opt);\n\n // 坐标轴在缩放上下文中绘制,实现刻度和平移联动\n this._drawAxes(ctx, toPixX, toPixY, th, opt, W, H, gL, gT, plotW, plotH);\n\n ctx.restore();\n\n // 更新悬浮提示框 (Tooltip)\n if (opt.tooltip.show && this._hoverPoint) {\n const hp = this._hoverPoint;\n const px = toPixX(hp.logX) * this._zoom.zoom + this._zoom.panX;\n const py = toPixY(hp.logY) * this._zoom.zoom + this._zoom.panY;\n \n let html = '';\n if (typeof opt.tooltip.formatter === 'function') {\n html = opt.tooltip.formatter({\n series: hp.series,\n logX: hp.logX,\n logY: hp.logY,\n rawX: Math.pow(10, hp.logX),\n rawY: Math.pow(10, hp.logY),\n zone: hp.zone\n });\n } else {\n html = this._defaultTooltipHTML(hp, opt);\n }\n this._tooltipRenderer.show(html, px, py, opt.tooltip, th, hp.zone);\n } else {\n this._tooltipRenderer.hide();\n }\n\n if (results.length > 0) this._bus.emit('diagnose', results);\n }\n\n /** 绘制背景对数网格(主网格和次级网格) */\n _drawGrid(ctx, toPixX, toPixY, th, opt) {\n const xMin = opt.xAxis.min;\n const xMax = opt.xAxis.max;\n const yMin = opt.yAxis.min;\n const yMax = opt.yAxis.max;\n const gL = this._coordMap.gL;\n const gT = this._coordMap.gT;\n const plotW = this._coordMap.plotW;\n const plotH = this._coordMap.plotH;\n\n const glStyle = opt.grid.lineStyle || {};\n const majorColor = glStyle.color || th.gridLineMajor;\n const minorColor = th.gridLine;\n\n // X 轴网格 (垂直线)\n for (let lx = Math.ceil(xMin); lx <= Math.floor(xMax); lx++) {\n const px = toPixX(lx);\n \n // Major\n ctx.beginPath();\n ctx.moveTo(px, gT);\n ctx.lineTo(px, gT + plotH);\n ctx.strokeStyle = majorColor;\n ctx.lineWidth = glStyle.width || 0.4;\n if (glStyle.type === 'dashed') ctx.setLineDash([4, 3]);\n else ctx.setLineDash([]);\n ctx.stroke();\n\n // Minor\n ctx.setLineDash([]);\n ctx.strokeStyle = minorColor;\n ctx.lineWidth = 0.25;\n for (let sub = 2; sub <= 9; sub++) {\n const lxm = lx + Math.log10(sub);\n if (lxm > xMax) break;\n const pxm = toPixX(lxm);\n ctx.beginPath();\n ctx.moveTo(pxm, gT);\n ctx.lineTo(pxm, gT + plotH);\n ctx.stroke();\n }\n }\n\n // Y 轴网格 (水平线)\n for (let ly = Math.ceil(yMin); ly <= Math.floor(yMax); ly++) {\n const py = toPixY(ly);\n \n // Major\n ctx.beginPath();\n ctx.moveTo(gL, py);\n ctx.lineTo(gL + plotW, py);\n ctx.strokeStyle = majorColor;\n ctx.lineWidth = glStyle.width || 0.4;\n if (glStyle.type === 'dashed') ctx.setLineDash([4, 3]);\n else ctx.setLineDash([]);\n ctx.stroke();\n\n // Minor\n ctx.setLineDash([]);\n ctx.strokeStyle = minorColor;\n ctx.lineWidth = 0.25;\n for (let sub = 2; sub <= 9; sub++) {\n const lym = ly + Math.log10(sub);\n if (lym > yMax) break;\n const pym = toPixY(lym);\n ctx.beginPath();\n ctx.moveTo(gL, pym);\n ctx.lineTo(gL + plotW, pym);\n ctx.stroke();\n }\n }\n }\n\n /** 绘制诊断区域多边形及其文本标签 */\n _drawZones(ctx, toPixX, toPixY, th, opt) {\n const zoneOpt = opt.zone;\n if (!zoneOpt || !zoneOpt.data) return;\n\n const gAlpha = zoneOpt.alpha;\n const colors = zoneOpt.colors || opt.colors || DEFAULT_COLORS;\n\n for (let i = 0; i < zoneOpt.data.length; i++) {\n const zone = zoneOpt.data[i];\n if (!zone.coordinates || zone.coordinates.length < 3) continue;\n\n ctx.beginPath();\n zone.coordinates.forEach((p, j) => {\n const px = toPixX(p[0]);\n const py = toPixY(p[1]);\n if (j === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n });\n ctx.closePath();\n\n // 区域背景颜色填充\n let baseColor = zone.color || colors[i % colors.length];\n if (gAlpha !== undefined && baseColor !== 'transparent') {\n baseColor = colorToRgba(baseColor, gAlpha);\n }\n ctx.fillStyle = baseColor;\n ctx.fill();\n\n // 区域边框线绘制\n if (zoneOpt.borderStyle.show) {\n let borderColor = zoneOpt.borderStyle.color || baseColor;\n if (zoneOpt.borderStyle.alpha !== undefined && borderColor !== 'transparent') {\n borderColor = colorToRgba(borderColor, zoneOpt.borderStyle.alpha);\n }\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = zoneOpt.borderStyle.width ?? 1.0;\n if (zoneOpt.borderStyle.type === 'dashed') ctx.setLineDash([5, 3]);\n else ctx.setLineDash([]);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n // 区域中心文字标签绘制\n if (zoneOpt.labelStyle.show && zone.name) {\n let sumX = 0, sumY = 0;\n zone.coordinates.forEach(p => { sumX += toPixX(p[0]); sumY += toPixY(p[1]); });\n const cx = sumX / zone.coordinates.length;\n const cy = sumY / zone.coordinates.length;\n\n // 松散限制标签坐标,防止完全超出图表区边界\n const gL = this._coordMap.gL;\n const gT = this._coordMap.gT;\n const plotW = this._coordMap.plotW;\n const plotH = this._coordMap.plotH;\n\n const lx = Math.max(gL + 4, Math.min(gL + plotW - 4, cx));\n const ly = Math.max(gT + 4, Math.min(gT + plotH - 4, cy));\n\n const fs = zoneOpt.labelStyle.fontSize || 12;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n \n const label = typeof zoneOpt.labelStyle.formatter === 'function' ? zoneOpt.labelStyle.formatter(zone) : zone.name;\n ctx.font = `${zoneOpt.labelStyle.fontWeight || '500'} ${fs}px system-ui, sans-serif`;\n ctx.fillStyle = zoneOpt.labelStyle.color || th.text;\n ctx.fillText(label, lx, ly);\n }\n }\n }\n\n _drawAxes(ctx, toPixX, toPixY, th, opt, W, H, gL, gT, plotW, plotH) {\n const xMin = opt.xAxis.min;\n const xMax = opt.xAxis.max;\n const yMin = opt.yAxis.min;\n const yMax = opt.yAxis.max;\n\n // 外边框绘制\n ctx.beginPath();\n ctx.rect(gL, gT, plotW, plotH);\n ctx.strokeStyle = th.axisLine;\n ctx.lineWidth = 1;\n ctx.stroke();\n\n const xLabelColor = opt.xAxis.labelStyle.color || th.textSecondary;\n const yLabelColor = opt.yAxis.labelStyle.color || th.textSecondary;\n\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n \n // 绘制 X 轴刻度标签文字\n for (let lx = Math.ceil(xMin); lx <= Math.floor(xMax); lx++) {\n const px = toPixX(lx);\n const xls = opt.xAxis.labelStyle;\n ctx.font = `${xls.fontWeight || 'normal'} ${xls.fontSize || 11}px system-ui, sans-serif`;\n ctx.fillStyle = xLabelColor;\n const text = typeof xls.formatter === 'function' \n ? xls.formatter(lx, Math.pow(10, lx)) \n : (xls.scientific === false ? String(Number(Math.pow(10, lx).toPrecision(4))) : fmtLog(lx));\n ctx.fillText(text, px + (xls.offsetX || 0), gT + plotH + 16 + (xls.offsetY || 0));\n }\n\n // 绘制 Y 轴刻度标签文字\n ctx.textAlign = 'right';\n for (let ly = Math.ceil(yMin); ly <= Math.floor(yMax); ly++) {\n const py = toPixY(ly);\n const yls = opt.yAxis.labelStyle;\n ctx.font = `${yls.fontWeight || 'normal'} ${yls.fontSize || 11}px system-ui, sans-serif`;\n ctx.fillStyle = yLabelColor;\n const text = typeof yls.formatter === 'function' \n ? yls.formatter(ly, Math.pow(10, ly)) \n : (yls.scientific === false ? String(Number(Math.pow(10, ly).toPrecision(4))) : fmtLog(ly));\n ctx.fillText(text, gL - 6 + (yls.offsetX || 0), py + (yls.offsetY || 0));\n }\n\n // 绘制 X 轴标题\n if (opt.xAxis.title) {\n const xts = opt.xAxis.titleStyle;\n const alignMap = { left: gL, center: gL + plotW / 2, right: gL + plotW };\n const tx = (alignMap[xts.align] || alignMap.center) + (xts.offsetX || 0);\n const ty = gT + plotH + 38 + (xts.offsetY || 0);\n \n ctx.textAlign = xts.align === 'left' ? 'left' : xts.align === 'right' ? 'right' : 'center';\n ctx.font = `${xts.fontWeight || 'normal'} ${xts.fontSize || 13}px system-ui, sans-serif`;\n ctx.fillStyle = xts.color || th.text;\n ctx.fillText(opt.xAxis.title, tx, ty);\n }\n\n // 绘制 Y 轴标题\n if (opt.yAxis.title) {\n const yts = opt.yAxis.titleStyle;\n const alignMap = { left: gT + plotH, center: gT + plotH / 2, right: gT };\n const ty_base = alignMap[yts.align] || alignMap.center;\n const tx = 14 + (yts.offsetX || 0);\n const ty = ty_base + (yts.offsetY || 0);\n \n ctx.save();\n ctx.translate(tx, ty);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = yts.align === 'left' ? 'right' : yts.align === 'right' ? 'left' : 'center';\n ctx.font = `${yts.fontWeight || 'normal'} ${yts.fontSize || 13}px system-ui, sans-serif`;\n ctx.fillStyle = yts.color || th.text;\n ctx.fillText(opt.yAxis.title, 0, 0);\n ctx.restore();\n }\n }\n\n /** 绘制所有数据点,并进行区域碰撞检测诊断 */\n _drawSeries(ctx, toPixX, toPixY, th, opt) {\n const results = [];\n \n for (const s of opt.series || []) {\n let logX = 0, logY = 0;\n\n // 归一化支持一维数组格式数据: data: [x, y]\n if (Array.isArray(s.data) && s.data.length >= 2) {\n const valX = typeof s.data[0] === 'object' ? s.data[0].value : s.data[0];\n const valY = typeof s.data[1] === 'object' ? s.data[1].value : s.data[1];\n logX = s.logScale === false ? valX : Math.log10(valX || 1e-9);\n logY = s.logScale === false ? valY : Math.log10(valY || 1e-9);\n } \n // 兼容自定义对象格式 {dataX, dataY}\n else if (s.dataX !== undefined && s.dataY !== undefined) {\n logX = s.logScale === false ? s.dataX : Math.log10(s.dataX || 1e-9);\n logY = s.logScale === false ? s.dataY : Math.log10(s.dataY || 1e-9);\n } else {\n continue;\n }\n\n const px = toPixX(logX);\n const py = toPixY(logY);\n\n // 判定数据点落在哪一个诊断区域中\n let matchZone = null;\n if (opt.zone && opt.zone.data) {\n for (const zone of opt.zone.data) {\n if (zone.coordinates && inPoly(logX, logY, zone.coordinates)) {\n matchZone = zone;\n break;\n }\n }\n }\n\n results.push({ series: s, zone: matchZone, logX, logY, px, py });\n\n const color = s.color || '#00e5ff';\n let size = s.size || 6;\n const shape = s.shape || 'circle';\n const isHover = this._hoverPoint && this._hoverPoint.series === s;\n if (isHover) size *= 1.5;\n\n ctx.save();\n ctx.translate(px, py);\n\n // 数据点发光特效 (Glow)\n const gs = s.glowStyle || {};\n if (gs.show || (isHover && gs.show !== false)) {\n ctx.shadowColor = gs.color || hexToRgba(color, 0.8);\n ctx.shadowBlur = gs.blur || 15;\n }\n\n ctx.fillStyle = color;\n ctx.strokeStyle = s.itemStyle?.borderColor || 'none';\n ctx.lineWidth = s.itemStyle?.borderWidth || 0;\n\n if (ctx.strokeStyle === 'none' || !s.itemStyle?.borderColor) ctx.lineWidth = 0;\n\n ctx.beginPath();\n drawShapePath(ctx, 0, 0, shape, size, 1, 0);\n\n ctx.fill();\n if (ctx.lineWidth > 0) ctx.stroke();\n\n // 数据点关联文本标签\n const ts = s.textStyle;\n if (ts && ts.show && s.name) {\n ctx.shadowBlur = 0; // 禁用文字的阴影,避免糊化\n const posOffsets = {\n top: [0, -(size + 6)], bottom: [0, size + 12],\n left: [-(size + 6), 4], right: [size + 6, 4]\n };\n const [ox, oy] = posOffsets[ts.position] || posOffsets.top;\n \n ctx.textAlign = ts.position === 'left' ? 'right' : ts.position === 'right' ? 'left' : 'center';\n ctx.textBaseline = 'middle';\n ctx.font = `${ts.fontWeight || 'normal'} ${ts.fontSize || 12}px system-ui, sans-serif`;\n ctx.fillStyle = ts.color || color;\n ctx.fillText(s.name, ox, oy);\n }\n\n ctx.restore();\n }\n\n this._drawnPoints = results;\n return results;\n }\n\n /** 生成默认的浮窗 (Tooltip) HTML 结构 */\n _defaultTooltipHTML(hp, opt) {\n const s = hp.series;\n const rawX = Math.pow(10, hp.logX).toPrecision(4);\n const rawY = Math.pow(10, hp.logY).toPrecision(4);\n const xTitle = opt.xAxis.title || 'X';\n const yTitle = opt.yAxis.title || 'Y';\n const ptName = s?.name || hp.name || 'Data Point';\n const pointNameStr = `<div style=\"font-size:14px; font-weight:bold; margin-bottom:4px; color:#fff;\">${ptName}</div>`;\n const zoneStr = hp.zone ? `${hp.zone.name || ''} ${hp.zone.title || hp.zone.desc || ''}`.trim() : 'Outside';\n const zoneColor = hp.zone ? (hp.zone.color || '#fff') : '#fff';\n\n return `\n ${pointNameStr}\n <div style=\"color:${zoneColor}; font-size:13px; font-weight:bold; padding-bottom:8px; margin-bottom:8px; border-bottom:1px solid rgba(255,255,255,0.07);\">\n ${zoneStr}\n </div>\n <div style=\"display:flex; align-items:center; margin-bottom:6px; font-size:13px;\">\n <span style=\"display:inline-block; width:8px; height:8px; border-radius:50%; background-color:#00e5ff; margin-right:8px;\"></span>\n <span style=\"color:#cbd5e1; flex-grow:1;\">${xTitle}</span>\n <span style=\"color:#fff; font-weight:bold; margin-left:20px;\">${rawX}</span>\n </div>\n <div style=\"display:flex; align-items:center; margin-bottom:6px; font-size:13px;\">\n <span style=\"display:inline-block; width:8px; height:8px; border-radius:50%; background-color:#ff6b35; margin-right:8px;\"></span>\n <span style=\"color:#cbd5e1; flex-grow:1;\">${yTitle}</span>\n <span style=\"color:#fff; font-weight:bold; margin-left:20px;\">${rawY}</span>\n </div>\n `;\n }\n}"],"names":["DEFAULT_COLORS","EventBus","ev","fn","f","d","ZoomController","cfg","deltaY","ax","ay","dir","nz","rat","cx","cy","scale","was","ctx","hexToRgba","hex","alpha","h","r","g","b","deepMerge","target","source","k","sv","inPoly","px","py","poly","inside","j","xi","yi","xj","yj","DOMTooltip","container","theme","tt","textStyle","padding","p","html","x","y","tooltipOpt","zone","bw","bc","rect","tw","th","left","top","parseGridBox","W","H","grid","defaultPadding","parse","val","max","def","right","bottom","availW","availH","drawShapePath","shape","size","offset","radius","inn","a","i","side","rx","ry","TRIANGLE_ZONES_1","TRIANGLE_ZONES_4","TRIANGLE_ZONES_5","PENTAGON_ZONES_1","PENTAGON_ZONES_2","ETRA_ZONES_A","ETRA_ZONES_B","THREE_RADIO_ZONES","computedPercent","values","nums","v","total","sum","n","pct","_pentagonRatioToDoc","H2","C2H2","C2H4","CH4","C2H6","vals","s","ratio","R","angles","_inPentagonPoly","DiagnosticTools","ch4","c2h4","c2h2","h2","c2h6","pt","last","colorToRgba","color","m","content","parts","_PentagonCoord","verts","bx","by","dx","dy","len2","t","t2","v0","v1","v2","denom","l0","l1","l2","tot","ang","_","polyPoint","vx","vy","data","gasOrder","isObj","item","decimals","__publicField","PentagonCoord","_ThemeManager","ThemeManager","ZoneRenderer","zoneOpt","S","gLabel","gBorder","gAlpha","colors","z","pts","baseColor","bStyle","borderColor","ff","lStyle","lx","ly","fs","fontStyle","text","padX","padY","bh","GridRenderer","vertexOpt","gridOpt","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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"}