{"version":3,"file":"particleflow.cjs","sources":["../../../../../src/elements/oscilloscope/renderers/particleflow.js"],"sourcesContent":["import paper from '@chnak/paper';\n\n/**\n * 粒子流样式默认配置\n */\nexport const defaultConfig = {\n  flowParticleCount: 100, // 粒子流粒子数量\n  flowSpeed: 1.0, // 粒子流速度\n  showWaveform: true, // 是否显示基础波形\n  particleColors: [ // 粒子颜色数组\n    '#ff0080', '#ff4080', '#ff8000', '#ffc000',\n    '#ffff00', '#80ff00', '#00ff80', '#00ffff',\n    '#0080ff', '#8000ff', '#ff00ff', '#ff0080',\n  ],\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 renderParticleFlow(element, data, x, y, width, height, time, config = {}) {\n  // 合并默认配置\n  const cfg = { ...defaultConfig, ...config };\n  \n  if (!data || data.length === 0) return;\n  \n  const centerY = y + height / 2;\n  const stepX = width / data.length;\n  const amplitude = (height / 2) * element.sensitivity;\n  \n  // 初始化粒子\n  if (!element.flowParticles) {\n    element.flowParticles = [];\n    const particleCount = cfg.flowParticleCount;\n    const dataLength = data.length || 1000; // 默认值，避免初始化时出错\n    \n    for (let i = 0; i < particleCount; i++) {\n      element.flowParticles.push({\n        position: Math.random() * dataLength, // 在波形上的位置\n        speed: 0.3 + Math.random() * 0.7, // 流动速度\n        size: 2 + Math.random() * 4, // 粒子大小\n        colorIndex: Math.floor(Math.random() * (cfg.particleColors?.length || 10)),\n        life: Math.random() // 生命周期（0-1）\n      });\n    }\n  }\n  \n  // 更新粒子\n  for (let particle of element.flowParticles) {\n    // 更新位置\n    particle.position += particle.speed * cfg.flowSpeed;\n    if (particle.position >= data.length) {\n      particle.position = 0;\n      particle.life = 0; // 重置生命周期\n    }\n    \n    // 更新生命周期\n    particle.life += 0.01;\n    if (particle.life > 1) {\n      particle.life = 0;\n    }\n    \n    // 获取当前位置的波形数据\n    const dataIndex = Math.floor(particle.position);\n    if (dataIndex >= 0 && dataIndex < data.length) {\n      const waveValue = data[dataIndex];\n      const px = x + dataIndex * stepX;\n      const py = centerY - waveValue * amplitude;\n      \n      // 根据波形值调整粒子大小\n      const dynamicSize = particle.size * (1 + Math.abs(waveValue) * element.sensitivity * 0.5);\n      \n      // 选择颜色\n      let particleColor;\n      if (cfg.particleColors && cfg.particleColors.length > 0) {\n        const colorIndex = (particle.colorIndex + Math.floor(particle.position / 10)) % cfg.particleColors.length;\n        particleColor = cfg.particleColors[colorIndex];\n      } else {\n        const hue = (particle.position / data.length) * 360;\n        particleColor = {\n          hue: hue,\n          saturation: 0.8,\n          brightness: 1\n        };\n      }\n      \n      // 绘制粒子\n      const circle = new paper.Path.Circle({\n        center: new paper.Point(px, py),\n        radius: dynamicSize\n      });\n      \n      circle.fillColor = particleColor;\n      circle.fillColor.alpha = 0.6 + Math.abs(waveValue) * 0.4;\n      \n      // 添加拖尾效果\n      if (element.particleTrail && Math.abs(waveValue) > 0.1) {\n        const trailLength = element.particleTrailLength || 3;\n        const prevDataIndex = Math.max(0, dataIndex - trailLength);\n        const prevWaveValue = data[prevDataIndex];\n        const prevPx = x + prevDataIndex * stepX;\n        const prevPy = centerY - prevWaveValue * amplitude;\n        \n        const trail = new paper.Path();\n        trail.strokeColor = particleColor;\n        trail.strokeWidth = dynamicSize * 0.5;\n        trail.strokeColor.alpha = 0.3;\n        trail.moveTo(new paper.Point(prevPx, prevPy));\n        trail.lineTo(new paper.Point(px, py));\n      }\n      \n      // 高亮粒子（根据波形值）\n      if (Math.abs(waveValue) > 0.5) {\n        const glow = new paper.Path.Circle({\n          center: new paper.Point(px, py),\n          radius: dynamicSize * 2\n        });\n        glow.fillColor = particleColor;\n        glow.fillColor.alpha = 0.2;\n        glow.blendMode = 'screen';\n      }\n    }\n  }\n  \n  // 绘制基础波形路径（可选，作为背景）\n  if (cfg.showWaveform !== false) {\n    const path = new paper.Path();\n    path.strokeColor = element.waveColor;\n    path.strokeWidth = element.lineWidth * 0.5;\n    path.strokeColor.alpha = 0.2;\n    \n    for (let i = 0; i < data.length; i += 2) { // 降低采样率以提高性能\n      const px = x + i * stepX;\n      const py = centerY - data[i] * amplitude;\n      \n      if (i === 0) {\n        path.moveTo(new paper.Point(px, py));\n      } else {\n        path.lineTo(new paper.Point(px, py));\n      }\n    }\n  }\n}\n\nrenderParticleFlow.style = 'particleflow';\n\n"],"names":[],"mappings":"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"}