{"version":3,"file":"waterfall.cjs","sources":["../../../../../src/elements/oscilloscope/renderers/waterfall.js"],"sourcesContent":["import paper from '@chnak/paper';\n\n/**\n * 瀑布图样式默认配置\n */\nexport const defaultConfig = {\n  waterfallHeight: 200, // 瀑布图高度\n  waterfallBands: 64, // 频段数量\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 renderWaterfall(element, data, x, y, width, height, time, config = {}) {\n  // 合并默认配置\n  const cfg = { ...defaultConfig, ...config };\n  \n  const centerY = y + height / 2;\n  const barCount = cfg.waterfallBands;\n  const step = Math.max(1, Math.floor(data.length / barCount));\n  const barWidth = width / barCount;\n  const amplitude = (height / 2) * element.sensitivity;\n  \n  // 存储历史数据用于瀑布效果\n  if (!element.waterfallHistory) {\n    element.waterfallHistory = [];\n  }\n  \n  // 计算当前帧的频谱数据\n  const currentSpectrum = [];\n  for (let i = 0; i < barCount; i++) {\n    const dataIndex = i * step;\n    if (dataIndex >= data.length) break;\n    \n    let sumSquares = 0;\n    let count = 0;\n    for (let j = dataIndex; j < Math.min(dataIndex + step, data.length); j++) {\n      sumSquares += data[j] * data[j];\n      count++;\n    }\n    const rms = count > 0 ? Math.sqrt(sumSquares / count) : 0;\n    currentSpectrum.push(rms);\n  }\n  \n  // 添加到历史记录\n  element.waterfallHistory.unshift(currentSpectrum);\n  if (element.waterfallHistory.length > Math.floor(height / 2)) {\n    element.waterfallHistory.pop();\n  }\n  \n  // 绘制瀑布图（从下往上，从新到旧）\n  for (let row = 0; row < element.waterfallHistory.length; row++) {\n    const spectrum = element.waterfallHistory[row];\n    const rowY = centerY - row;\n    const alpha = 1 - (row / element.waterfallHistory.length) * 0.8;\n    \n    for (let i = 0; i < spectrum.length; i++) {\n      const barHeight = spectrum[i] * amplitude;\n      const barX = x + i * barWidth;\n      \n      // 根据强度选择颜色（从蓝到红）\n      const intensity = spectrum[i];\n      let color;\n      if (intensity < 0.33) {\n        color = new paper.Color(0, intensity * 3, 1);\n      } else if (intensity < 0.66) {\n        color = new paper.Color((intensity - 0.33) * 3, 1, 1 - (intensity - 0.33) * 3);\n      } else {\n        color = new paper.Color(1, 1 - (intensity - 0.66) * 3, 0);\n      }\n      \n      const bar = new paper.Path.Rectangle({\n        rectangle: new paper.Rectangle(barX, rowY, barWidth - 1, barHeight),\n        fillColor: color,\n      });\n      bar.fillColor.alpha = alpha;\n    }\n  }\n}\n\nrenderWaterfall.style = 'waterfall';\n\n"],"names":[],"mappings":"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"}