Files
2026-01-16 19:25:21 +08:00

143 lines
4.4 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Sunny.UI;
namespace LaserFlashTesterControl.Prossces
{
/// <summary>
/// 弃用改用UIProcessBar
/// </summary>
public class DataProcessor
{
private UIProcessBar _progressBar;
// 构造函数注入ProgressBar
public DataProcessor(UIProcessBar progressBar)
{
_progressBar = progressBar ?? throw new ArgumentNullException(nameof(progressBar));
}
public List<double> Smoothing(List<double> rawData, int step)
{
if (rawData == null || rawData.Count == 0)
return new List<double>();
// 初始化进度条
InitProgressBar(rawData.Count);
List<double> smooth = new List<double>(new double[rawData.Count]);
for (int i = step; i < rawData.Count; i++)
{
double total = 0;
int count = 0;
// 计算当前点前后step范围内的平均值
for (int j = i - step; j <= i + step; j++)
{
if (j >= 0 && j < rawData.Count)
{
total += rawData[j];
count++;
}
}
smooth[i] = total / count;
// 更新进度条每处理10个点更新一次避免频繁刷新
if (i % 10 == 0 || i == rawData.Count - 1)
{
UpdateProgressBar(i + 1); // i是0-based所以+1
}
}
// 填充头部数据前step个点
for (int i = 0; i < step; i++)
{
smooth[i] = smooth[step];
}
// 填充尾部数据
int tailStart = rawData.Count - (rawData.Count % (step + 1)) - 1;
for (int j = tailStart; j < rawData.Count; j++)
{
smooth[j] = smooth[tailStart - 1];
}
// 处理完成设置进度条为100%
_progressBar.Value = _progressBar.Maximum;
return smooth;
}
public List<double> OptimizedSmoothing(List<double> rawData, int windowSize)
{
if (rawData == null || rawData.Count == 0)
return new List<double>();
List<double> smooth = new List<double>(rawData.Count);
double windowSum = 0;
int actualWindowSize = windowSize * 2 + 1;
// 初始化第一个窗口
for (int i = 0; i < Math.Min(actualWindowSize, rawData.Count); i++)
{
windowSum += rawData[i];
}
for (int i = 0; i < rawData.Count; i++)
{
int left = i - windowSize - 1;
int right = i + windowSize;
// 移除离开窗口的左元素
if (left >= 0)
{
windowSum -= rawData[left];
}
// 添加进入窗口的右元素
if (right < rawData.Count)
{
windowSum += rawData[right];
}
// 计算当前窗口的有效大小
int effectiveWindowSize = Math.Min(i + windowSize + 1, rawData.Count) - Math.Max(i - windowSize, 0);
smooth.Add(windowSum / effectiveWindowSize);
}
return smooth;
}
private void InitProgressBar(int totalSteps)
{
// 确保在UI线程上操作
if (_progressBar.InvokeRequired)
{
_progressBar.Invoke(new Action<int>(InitProgressBar), totalSteps);
return;
}
// _progressBar.
_progressBar.Maximum = totalSteps;
_progressBar.Value = 0;
_progressBar.Step = 1;
}
private void UpdateProgressBar(int currentStep)
{
// 确保在UI线程上操作
if (_progressBar.InvokeRequired)
{
_progressBar.Invoke(new Action<int>(UpdateProgressBar), currentStep);
return;
}
_progressBar.Value = Math.Min(currentStep, _progressBar.Maximum);
Application.DoEvents(); // 强制刷新UI谨慎使用
}
}
}