C# 每个chartArea显示最小值、平均值、最大值

csharp 复制代码
private void AddStatisticsAnnotations(ChartArea chartArea, int channelIndex)
{
    RemoveExistingAnnotations(channelIndex);

    // 获取ChartArea的相对坐标(百分比)
    float chartAreaX = chartArea.Position.X; // X坐标(百分比)
    float chartAreaY = chartArea.Position.Y; // Y坐标(百分比)
    float chartAreaWidth = chartArea.Position.Width; // 宽度(百分比)
    float chartAreaHeight = chartArea.Position.Height; // 高度(百分比)

    // 设置相对偏移量(百分比)
    float offsetX = 10f;  // 水平偏移(百分比)
    float offsetY = 5f;  // 垂直偏移(百分比)

    // 计算注释的相对坐标(相对于整个Chart控件)
    float posX = chartAreaX + offsetX;
    float posY = chartAreaY + offsetY;

    // 创建并配置注释
    Color textColor = _channelColors[channelIndex % _channelColors.Length];

    // 创建包含所有统计信息的多行文本
    string annotationText = $"Max: - V\nAvg: - V\nMin: - V";

    TextAnnotation annotation = new TextAnnotation
    {
        Name = $"StatsAnnotation{channelIndex}",
        Text = annotationText,
        ForeColor = textColor,
        X = posX,
        Y = posY,
        Alignment = ContentAlignment.TopLeft,
        ClipToChartArea = chartArea.Name,
        IsSizeAlwaysRelative = true, // 使用相对坐标
        Font = new Font("Arial", 10)  // 设置合适的字体大小
    };

    chartWaveform.Annotations.Add(annotation);
    //Console.WriteLine($"Added {annotation.Name} at ({annotation.X}%, {annotation.Y}%)");        
}

private void RemoveExistingAnnotations(int channelIndex)
{       
    // 移除旧的统计注释
    string annotationName = $"StatsAnnotation{channelIndex}";
    var annotation = chartWaveform.Annotations.FindByName(annotationName);
    if (annotation != null)
    {
        chartWaveform.Annotations.Remove(annotation);
    }
}

private void UpdateChannelStatistics(int channelIndex, List<ushort> values)
{
    if (values == null || values.Count == 0) return;

    // 计算统计值
    double maxAdc = values[0];
    double minAdc = values[0];
    double sumAdc = 0;

    foreach (var value in values)
    {
        if (value > maxAdc) maxAdc = value;
        if (value < minAdc) minAdc = value;
        sumAdc += value;
    }

    double avgAdc = sumAdc / values.Count;

    // 转换为电压值
    double maxAdcValue = Math.Pow(2, adcBit) - 1;
    double maxVoltage = vref / 1000.0;

    double maxV = (maxAdc / maxAdcValue) * maxVoltage;
    double minV = (minAdc / maxAdcValue) * maxVoltage;
    double avgV = (avgAdc / maxAdcValue) * maxVoltage;

    // 更新单个注释的文本
    UpdateStatsAnnotationText(channelIndex, maxV, avgV, minV);
}

private void UpdateStatsAnnotationText(int channelIndex, double maxV, double avgV, double minV)
{
    string annotationName = $"StatsAnnotation{channelIndex}";
    var annotation = chartWaveform.Annotations.FindByName(annotationName) as TextAnnotation;
    if (annotation != null)
    {
        annotation.Text = $"Max: {maxV:F3}V\nAvg: {avgV:F3}V\nMin: {minV:F3}V";
    }
}  

// 为每个通道添加统计注释
AddStatisticsAnnotations(chartWaveform.ChartAreas[ch], ch);
// 计算并更新统计信息
UpdateChannelStatistics(ch, channelValues[ch]);
相关推荐
牛哇网络工作室17 小时前
UnityHDRP写实数字人全流程基础5—语音输入和语音识别
android·unity·c#·游戏引擎·aigc·语音识别·xcode
hsjiasb17 小时前
FreeRTOS学习(二十七)——任务栈与栈溢出检测
开发语言·stm32·学习·学习笔记·freertos
丰锋ff18 小时前
3.1 Qt事件之事件处理器
开发语言·qt
多弗朗皮卡丘18 小时前
C语言梦开始的地方7:函数
c语言·开发语言
月华路18 小时前
G1 垃圾回收:脏卡队列、记忆集与并发精化线程机制
java·开发语言
gugucoding19 小时前
47. 【Java】Java内存模型(JMM)与可见性
java·开发语言
m0_3807438719 小时前
从零调用 Claude 教程
开发语言·python·node.js
起床学FPGA19 小时前
AI回答问题之后,会自动跳到最下面的问题
开发语言·javascript·ecmascript
x_x-F20 小时前
网络数据从网卡到用户态:一场基于内存所有权转移的接力赛
开发语言·网络·php
名字还没想好☜21 小时前
Java 线上内存泄漏排查实战:jmap 导堆、MAT 找 GC Roots 与四类常见泄漏
java·开发语言·jvm·内存泄漏