Объединение нескольких pointpairlist
у меня есть .wav-файл, и я строю форму волны с помощью ZedGraph. Я рассчитываю энергию .wav-файл каждой секунды, и если энергия меньше 4, я хочу нарисовать образец в другом цвете. Я создал два PointPairLlist
и LineItem
для этого, но есть проблема при объединении этих двух списков. Вот мой код и как выглядит мой график.
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 и mycurveaudio 2 пересекаются, как на картинке.
как я могу слиться эти два списка предотвращают эти пересечения?
Я также попытался добавить двойную.NaN до конца списков, но это не сработало.
2 ответов
попробуйте код ниже, я изменил ваш код на основе "этой теме"
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);
если приведенный выше код не работает, выполните действия, указанные в этой теме
градиентная заливка в цвет отрезков
этот учебник помог мне решить мою проблему. Нет необходимости в двух или более 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;