【问题标题】:Merging multiple pointpairlist合并多个点对列表
【发布时间】:2014-03-06 09:22:39
【问题描述】:

我有一个 .wav 文件,我正在使用 ZedGraph 绘制波形。我正在计算每秒 .wav 文件的能量,如果能量小于 4,我想用不同的颜色绘制样本。我创建了两个PointPairLlistLineItem 来执行此操作,但是合并这两个列表时出现问题。这是我的代码以及我的图表的显示方式。

LineItem myCurveAudio;
LineItem myCurveAudio2;
PointPairList list1 = new PointPairList();
PointPairList list2 = new PointPairList();
while(true)
{
for (int i = 0; i < fmainBuffer.Length; i++)
{
   float segmentSquare = fmainBuffer[i] * fmainBuffer[i];
   listOfSquaredSegment.Add(segmentSquare);
}
float energy = (float)Math.Sqrt(listOfSquaredSegment.Sum());
if (energy < 4)
{
    for (int i = 0; i < read; i += (int)window)
    {
       list1.Add((float)(count / ((float)read / (float)window)), fmainBuffer[i]);
       count++;
    }
}
else
{
   for (int i = 0; i < read; i += (int)window)
   {
       list4.Add((float)(count / ((float)read / (float)window)), fmainBuffer[i]);
       count++;
   }
}
}
zgc.MasterPane.PaneList[1].XAxis.Scale.MaxAuto = true;
zgc.MasterPane.PaneList[1].XAxis.Scale.MinAuto = true;
zgc.MasterPane.PaneList[1].XAxis.Type = AxisType.Linear;
zgc.MasterPane.PaneList[1].XAxis.Scale.Format = "";
zgc.MasterPane.PaneList[1].XAxis.Scale.Min = 0;
myCurveAudio = zgc.MasterPane.PaneList[1].AddCurve(null, list1, Color.Lime, SymbolType.None);
myCurveAudio2 = zgc.MasterPane.PaneList[1].AddCurve(null, list4, Color.Red, SymbolType.None);

myCurveAudio 和 myCurveAudio2 的线相交,如图所示。

如何合并这两个列表以防止这些交叉点?

我也尝试将 `double.NaN 添加到列表末尾,但没有成功。

【问题讨论】:

    标签: c# winforms zedgraph


    【解决方案1】:

    试试下面的代码,我根据“this thread”修改了你的代码

    LineItem myCurveAudio;
    LineItem myCurveAudio2;
    PointPairList list1 = new PointPairList();
    PointPairList list2 = new PointPairList();
    double lastAddedHighEnergy = double.NaN;
    double lastAddedLowEnergy = double.NaN;
    while (true)
    {
        for (int i = 0; i < fmainBuffer.Length; i++)
        {
            float segmentSquare = fmainBuffer[i] * fmainBuffer[i];
            listOfSquaredSegment.Add(segmentSquare);
        }
        float energy = (float)Math.Sqrt(listOfSquaredSegment.Sum());
        if (energy < 4)
        {
            for (int i = 0; i < read; i += (int)window)
            {
                lastAddedLowEnergy = (double)(count / ((double)read / (double)window));
                if (lastAddedHighEnergy != double.NaN)
                {
                    list1.Add(lastAddedHighEnergy + ((lastAddedLowEnergy - lastAddedHighEnergy) / 2.0), double.NaN);
                    lastAddedHighEnergy = double.NaN;
                }
    
                list1.Add(lastAddedLowEnergy, fmainBuffer[i]);
                count++;
            }
        }
        else
        {
            for (int i = 0; i < read; i += (int)window)
            {
                lastAddedHighEnergy = (double)(count / ((double)read / (double)window));
                if (lastAddedLowEnergy != double.NaN)
                {
                    list2.Add(lastAddedLowEnergy + ((lastAddedHighEnergy - lastAddedLowEnergy) / 2.0), double.NaN);
                    lastAddedLowEnergy = double.NaN;
                }
    
                list2.Add(lastAddedHighEnergy, fmainBuffer[i]);
                count++;
            }
        }
    }
    
    zgc.MasterPane.PaneList[1].XAxis.Scale.MaxAuto = true;
    zgc.MasterPane.PaneList[1].XAxis.Scale.MinAuto = true;
    zgc.MasterPane.PaneList[1].XAxis.Type = AxisType.Linear;
    zgc.MasterPane.PaneList[1].XAxis.Scale.Format = "";
    zgc.MasterPane.PaneList[1].XAxis.Scale.Min = 0;
    myCurveAudio = zgc.MasterPane.PaneList[1].AddCurve(null, list1, Color.Lime, SymbolType.None);
    myCurveAudio2 = zgc.MasterPane.PaneList[1].AddCurve(null, list2, Color.Red, SymbolType.None);
    

    如果上述代码不起作用,请按照this thread中给出的步骤进行操作

    【讨论】:

    • 这不起作用。还是有交集的。此外,我认为您链接的线程解释了与我的代码相同的想法。
    • 我修改了上面的代码。以前我没有取中心点来绘制空点来断线。现在,我计算了中心 X 轴点并在曲线中添加了空点。现在试试上面的代码..
    • 我尝试了您共享的链接和您的代码。仍然有交叉点,因为我必须根据我的文件长度合并 6 个或更多数据。此代码仅防止前两部分数据相交。
    【解决方案2】:

    Gradient Fills to Color Line Segments

    本教程帮助我解决了我的问题。不需要两个或多个PointPairList 这是我的代码:

    float energy = (float)Math.Sqrt(listOfSquaredSegment.Sum());
    for (int i = 0; i < fmainBuffer.Length; i += (int)window)
    {
         listaudio.Add((float)(count / ((float)8000 / (float)window)) / 5, fmainBuffer[i], energy > 4 ? 2.0 : 1.0);
         count++;
    }
    myCurveAudio = zgc.MasterPane.PaneList[1].AddCurve(null, listaudio, Color.Lime, SymbolType.None);
    Fill fill = new Fill(Color.Lime, Color.Red);
    fill.RangeMin = 1;
    fill.RangeMax = 2;
    fill.Type = FillType.GradientByZ;
    myCurveAudio.Line.GradientFill = fill;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 2014-08-18
      • 2017-03-23
      • 2019-12-07
      相关资源
      最近更新 更多