143 lines
4.4 KiB
C#
143 lines
4.4 KiB
C#
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(谨慎使用)
|
||
}
|
||
}
|
||
}
|