{"version":3,"file":"trail.cjs","sources":["../../../../../src/elements/oscilloscope/renderers/trail.js"],"sourcesContent":["import paper from '@chnak/paper';\n\n/**\n * 轨迹追踪样式默认配置\n */\nexport const defaultConfig = {\n  trailParticleCount: 20, // 轨迹粒子数量\n  trailLength: 50, // 轨迹长度\n  trailSpeed: 1.0, // 轨迹移动速度\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 renderTrail(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.trailParticles) {\n    element.trailParticles = [];\n    const particleCount = cfg.trailParticleCount;\n    const dataLength = data.length || 1000; // 默认值，避免初始化时出错\n    \n    for (let i = 0; i < particleCount; i++) {\n      element.trailParticles.push({\n        position: Math.random() * dataLength, // 在波形上的位置（索引）\n        speed: 0.5 + Math.random() * 1.5, // 移动速度\n        trail: [], // 轨迹点数组\n        colorIndex: i\n      });\n    }\n  }\n  \n  // 更新粒子位置和轨迹\n  for (let particle of element.trailParticles) {\n    // 更新位置\n    particle.position += particle.speed * cfg.trailSpeed;\n    if (particle.position >= data.length) {\n      particle.position = 0;\n      particle.trail = []; // 重置轨迹\n    }\n    \n    // 获取当前位置的波形数据\n    const dataIndex = Math.floor(particle.position);\n    if (dataIndex >= 0 && dataIndex < data.length) {\n      const px = x + dataIndex * stepX;\n      const py = centerY - data[dataIndex] * amplitude;\n      \n      // 添加到轨迹\n      particle.trail.push({\n        point: new paper.Point(px, py),\n        time: time\n      });\n      \n      // 限制轨迹长度\n      const maxTrailLength = cfg.trailLength;\n      if (particle.trail.length > maxTrailLength) {\n        particle.trail.shift();\n      }\n    }\n  }\n  \n  // 绘制轨迹\n  for (let particle of element.trailParticles) {\n    if (particle.trail.length < 2) continue;\n    \n    // 选择颜色\n    let trailColor;\n    if (cfg.particleColors && cfg.particleColors.length > 0) {\n      const colorIndex = particle.colorIndex % cfg.particleColors.length;\n      trailColor = cfg.particleColors[colorIndex];\n    } else {\n      trailColor = element.waveColor;\n    }\n    \n    // 绘制轨迹路径（渐变透明度）\n    const path = new paper.Path();\n    path.strokeColor = trailColor;\n    path.strokeWidth = element.lineWidth * 1.5;\n    \n    for (let i = 0; i < particle.trail.length; i++) {\n      const trailPoint = particle.trail[i];\n      const progress = i / particle.trail.length;\n      const alpha = progress * 0.8; // 从透明到不透明\n      \n      if (i === 0) {\n        path.moveTo(trailPoint.point);\n      } else {\n        path.lineTo(trailPoint.point);\n      }\n      \n      // 设置每段的透明度\n      if (i > 0) {\n        const segment = path.segments[i];\n        if (segment) {\n          // 使用渐变效果\n          path.strokeColor.alpha = alpha;\n        }\n      }\n    }\n    \n    // 绘制粒子头部（高亮）\n    if (particle.trail.length > 0) {\n      const headPoint = particle.trail[particle.trail.length - 1];\n      const headSize = 4 + Math.abs(data[Math.floor(particle.position)] || 0) * element.sensitivity * 8;\n      \n      const headCircle = new paper.Path.Circle({\n        center: headPoint.point,\n        radius: headSize\n      });\n      headCircle.fillColor = trailColor;\n      headCircle.fillColor.alpha = 1.0;\n      \n      // 添加光晕效果\n      const glowCircle = new paper.Path.Circle({\n        center: headPoint.point,\n        radius: headSize * 2\n      });\n      glowCircle.fillColor = trailColor;\n      glowCircle.fillColor.alpha = 0.2;\n      glowCircle.blendMode = 'screen';\n    }\n  }\n}\n\nrenderTrail.style = 'trail';\n\n"],"names":[],"mappings":"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"}