{"version":3,"file":"particles.cjs","sources":["../../../../../src/elements/oscilloscope/renderers/particles.js"],"sourcesContent":["import paper from '@chnak/paper';\n\n/**\n * 粒子/圆点样式默认配置\n */\nexport const defaultConfig = {\n  particleCount: 50, // 圆点数量\n  particleMinSize: 3, // 圆点最小尺寸\n  particleMaxSize: 15, // 圆点最大尺寸\n  particleColors: [ // 圆点颜色数组（渐变色）\n    '#ff0080', '#ff0080', '#ff4080', '#ff4080',\n    '#ff8000', '#ff8000', '#ffc000', '#ffc000',\n    '#ffff00', '#ffff00', '#80ff00', '#80ff00',\n    '#00ff80', '#00ff80', '#00ffff', '#00ffff',\n    '#0080ff', '#0080ff', '#8000ff', '#8000ff',\n  ],\n  particleTrail: true, // 是否显示拖尾效果\n  particleTrailLength: 5, // 拖尾长度\n};\n\n/**\n * 粒子/圆点波形渲染器（多彩圆点随音律跳动）\n * @param {Object} element - 元素实例\n * @param {Array} data - 波形数据\n * @param {number} x - X坐标\n * @param {number} y - Y坐标\n * @param {number} width - 宽度\n * @param {number} height - 高度\n * @param {number} time - 当前时间\n * @param {Object} config - 配置对象（合并了默认配置和用户配置）\n */\nexport default function renderParticles(element, data, x, y, width, height, time, config = {}) {\n  // 合并默认配置\n  const cfg = { ...defaultConfig, ...config };\n  \n  const centerX = x + width / 2;\n  const centerY = y + height / 2;\n  const maxRadius = Math.min(width, height) / 2 - 10;\n  \n  // 计算每个圆点对应的数据索引\n  const step = Math.max(1, Math.floor(data.length / cfg.particleCount));\n  const colorStep = cfg.particleColors.length / cfg.particleCount;\n  \n  // 存储上一帧的位置（用于拖尾效果）\n  if (!element.lastParticlePositions) {\n    element.lastParticlePositions = [];\n  }\n  \n  for (let i = 0; i < cfg.particleCount; i++) {\n    const dataIndex = Math.min(i * step, data.length - 1);\n    const amplitude = Math.abs(data[dataIndex]) * element.sensitivity;\n    \n    // 计算圆点大小（根据振幅）\n    const sizeRange = cfg.particleMaxSize - cfg.particleMinSize;\n    const particleSize = cfg.particleMinSize + amplitude * sizeRange;\n    \n    // 计算圆点位置（圆形分布）\n    const angle = (i / cfg.particleCount) * Math.PI * 2;\n    const baseRadius = maxRadius * 0.6; // 基础半径\n    const radiusOffset = amplitude * maxRadius * 0.4; // 根据振幅偏移\n    const radius = baseRadius + radiusOffset;\n    \n    const px = centerX + Math.cos(angle) * radius;\n    const py = centerY + Math.sin(angle) * radius;\n    \n    // 选择颜色（根据索引从渐变色数组中选取）\n    const colorIndex = Math.floor(i * colorStep) % cfg.particleColors.length;\n    const color = cfg.particleColors[colorIndex];\n    \n    // 绘制拖尾效果\n    if (cfg.particleTrail && element.lastParticlePositions[i]) {\n      const lastPos = element.lastParticlePositions[i];\n      const trailPath = new paper.Path();\n      trailPath.strokeColor = color;\n      trailPath.strokeWidth = particleSize * 0.3;\n      trailPath.strokeColor.alpha = 0.3;\n      \n      // 绘制从上一帧到当前帧的线条\n      trailPath.moveTo(new paper.Point(lastPos.x, lastPos.y));\n      trailPath.lineTo(new paper.Point(px, py));\n    }\n    \n    // 绘制圆点\n    const circle = new paper.Path.Circle({\n      center: new paper.Point(px, py),\n      radius: particleSize / 2,\n    });\n    \n    // 使用渐变色填充\n    circle.fillColor = color;\n    \n    // 添加发光效果（外圈）\n    if (amplitude > 0.3) {\n      const glowCircle = new paper.Path.Circle({\n        center: new paper.Point(px, py),\n        radius: particleSize / 2 + 2,\n      });\n      glowCircle.fillColor = color;\n      glowCircle.fillColor.alpha = 0.2;\n      glowCircle.sendToBack();\n    }\n    \n    // 保存当前位置用于下一帧\n    element.lastParticlePositions[i] = { x: px, y: py };\n  }\n  \n  // 如果启用镜像，在中心绘制对称的圆点\n  if (element.mirror) {\n    for (let i = 0; i < cfg.particleCount; i++) {\n      const dataIndex = Math.min(i * step, data.length - 1);\n      const amplitude = Math.abs(data[dataIndex]) * element.sensitivity;\n      \n      const sizeRange = cfg.particleMaxSize - cfg.particleMinSize;\n      const particleSize = cfg.particleMinSize + amplitude * sizeRange;\n      \n      const angle = (i / cfg.particleCount) * Math.PI * 2;\n      const baseRadius = maxRadius * 0.3; // 内圈基础半径\n      const radiusOffset = amplitude * maxRadius * 0.2;\n      const radius = baseRadius + radiusOffset;\n      \n      const px = centerX + Math.cos(angle) * radius;\n      const py = centerY + Math.sin(angle) * radius;\n      \n      const colorIndex = Math.floor(i * colorStep) % cfg.particleColors.length;\n      const color = cfg.particleColors[colorIndex];\n      \n      const circle = new paper.Path.Circle({\n        center: new paper.Point(px, py),\n        radius: particleSize / 3, // 内圈圆点稍小\n      });\n      circle.fillColor = color;\n      circle.fillColor.alpha = 0.6;\n    }\n  }\n}\n\nrenderParticles.style = 'particles';\n\n"],"names":[],"mappings":"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"}