You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

233 lines
8.8 KiB
C#

using Arction.Wpf.ChartingMVVM;
using Arction.Wpf.ChartingMVVM.Axes;
using Arction.Wpf.ChartingMVVM.SeriesPolar;
using Arction.Wpf.ChartingMVVM.Views.ViewPolar;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Txgy.Microseismic.BaseLib
{
public class AmplitudeModel
{
public PolarSeriesPoint[] GenerateAmplitudeSeries(int pointCounter)
{
PolarSeriesPoint[] points = new PolarSeriesPoint[pointCounter];
Random rand = new Random();
double amplitude;
for (int i = 0; i < pointCounter; i++)
{
amplitude = 45 + 30.0 * Math.Sin(5.0 * 2.0 * Math.PI * i / 360.0) + rand.NextDouble() * 10.0;
if (amplitude < 0)
amplitude = 0;
// points.Add(new PolarSeriesPoint(i, amplitude));
points[i].Amplitude = amplitude;
points[i].Angle = i;
}
return points;
}
public PolarSeriesPoint[] GenerateAmplitudeSeries(List<WaveDataModel> showWaveDataList)
{
PolarSeriesPoint[] points = new PolarSeriesPoint[361];
double avrDist = showWaveDataList.Average(awd => awd.waveHeader.ToEventDist);
double amplitude;
for (int i = 0; i < 361; i++)
{
var amp = showWaveDataList.Find(swd => swd.waveHeader.ToEventAngle == i);
if (amp != null)
{
amplitude = (amp.waveHeader.MaxAmp * amp.waveHeader.ToEventDist / avrDist) * 100000;
}
else
{
amplitude = 0;
}
// points.Add(new PolarSeriesPoint(i, amplitude));
points[i].Amplitude = amplitude;
points[i].Angle = i;
}
return points;
}
public PointLineSeriesPolarCollection GenerateData(List<WaveDataModel> showWaveDataList)
{
PointLineSeriesPolarCollection polarCollection1 = new PointLineSeriesPolarCollection();
PointLineSeriesPolar lineSeriesGradient = new PointLineSeriesPolar();
lineSeriesGradient.LineStyle.Width = 2;
lineSeriesGradient.PointsVisible = false;
lineSeriesGradient.Title.Visible = false;
//lineSeriesGradient.Title.
Comparison<WaveDataModel> MyComparison = WaveDataModelComparison;
showWaveDataList.Sort((s1, s2) =>
{
if (s1.waveHeader.ToEventAngle != s2.waveHeader.ToEventAngle)
{
return s2.waveHeader.ToEventAngle.CompareTo(s1.waveHeader.ToEventAngle);
}
else return 0;
});
double avrDist = showWaveDataList.Average(awd => awd.waveHeader.ToEventDist);
//Console.WriteLine("平均距离="+avrDist);
//showWaveDataList.Sort(swd=>swd.waveHeader.)
lineSeriesGradient.Points = new PolarSeriesPoint[showWaveDataList.Count];
for (int i = 0; i < showWaveDataList.Count; i++)
{
//double fx = showWaveDataList[i].waveHeader.MaxAmp * (showWaveDataList[i].waveHeader.ToEventDist / avrDist);
double fx = CalValue(showWaveDataList[i], avrDist);
lineSeriesGradient.Points[i] = new PolarSeriesPoint(showWaveDataList[i].waveHeader.ToEventAngle,
(fx) * 100000);
Console.WriteLine(showWaveDataList[i].waveHeader.StationName + "\t" + Math.Round(showWaveDataList[i].waveHeader.MaxAmp, 5) +
"\t" + showWaveDataList[i].waveHeader.ToEventDist);
//Console.WriteLine("台站=" + showWaveDataList[i].waveHeader.StationName + "\t振幅=" + Math.Round(showWaveDataList[i].waveHeader.MaxAmp, 5) +
// "\t到事件点的距离=" + showWaveDataList[i].waveHeader.ToEventDist + "\tRn/R0=" + Math.Round(showWaveDataList[i].waveHeader.ToEventDist / avrDist, 3));
//Console.WriteLine("台站=" + showWaveDataList[i].waveHeader.StationName + "\t振幅=" + Math.Round(showWaveDataList[i].waveHeader.MaxAmp, 5) +
// "\t到事件点的距离=" + Math.Round(showWaveDataList[i].waveHeader.ToEventDist/avrDist, 3));
}
lineSeriesGradient.ClosedLine = true;
polarCollection1.Add(lineSeriesGradient);
//// Create a series, which will have solid color transitions, from point-to-point
//PointLineSeriesPolar lineSeriesSolid = new PointLineSeriesPolar();
//lineSeriesSolid.LineStyle.Width = 5;
//lineSeriesSolid.PointsVisible = false;
////Create data for series
//lineSeriesSolid.Points = new PolarSeriesPoint[]
//{
// new PolarSeriesPoint(210, 20, Colors.Red),
// new PolarSeriesPoint(240, 15, Colors.Yellow),
// new PolarSeriesPoint(270, 25, Colors.Lime),
// new PolarSeriesPoint(300, 18, Colors.Turquoise),
// new PolarSeriesPoint(330, 13, Colors.Purple),
//};
//polarCollection1.Add(lineSeriesSolid);
return polarCollection1;
}
public double CalValue(WaveDataModel wdm,double r0)
{
double result = 0;
double vn = wdm.waveHeader.MaxAmp;
double rn = wdm.waveHeader.ToEventDist;
double h = wdm.mmEvent.Z;
double rup = vn * Math.Sqrt(Math.Pow(2.5 * h, 2) + rn * rn);
double rdown = Math.Sqrt(Math.Pow(2.5 * h, 2) + r0 * r0);
result = rup / rdown;
return result;
}
public AxisPolarCollection GenerateAxes()
{
AxisPolarCollection axisPolars = new AxisPolarCollection();
AxisPolar axis = new AxisPolar();
axis.MinorGrid.Visible = false;
axis.Title.Visible = false;
axis.AmplitudeAxisLineVisible = false;
axis.AmplitudeLabelsVisible = true;
axis.TickMarkLocation = RoundGridTickmarkLocation.Outside;
//axis.InnerCircleRadiusPercentage = 5;
//axis.MinAmplitude = 100;
axis.MaxAmplitude = 200;
axis.AngleOrigin = 270;
axis.Reversed = true;
axis.MajorDivCount = 6;
axis.Units.RadialOffsetPercentage = 100;
//axis.AmplitudeAxisAngle = 90;
axis.AngularAxisAutoDivSpacing = false;
//axis.AmplitudeLabelsAngle = 90;
axis.AngularAxisMajorDivCount = 16;
axis.AutoFormatLabels = false;
//显示单位
axis.Units.Visible = false;
axis.SupplyCustomAngleString += this.AngleAsString;
//axis.SupplyCustomAmplitudeString += axis1_SupplyCustomAmplitudeString;
axisPolars.Add(axis);
return axisPolars;
}
public static int WaveDataModelComparison(WaveDataModel p1, WaveDataModel p2)
{
if (p1.waveHeader.ToEventAngle != p2.waveHeader.ToEventAngle)
{
return p1.waveHeader.ToEventAngle.CompareTo(p2.waveHeader.ToEventAngle);
}
else return 0;
}
private void axis1_SupplyCustomAmplitudeString(object sender, SupplyCustomAmplitudeStringEventArgs e)
{
e.ValueAsString = e.Value.ToString("F0") + " m/s";
}
/// <summary>
/// Axis angle value as string.
/// </summary>
/// <param name="sender">Sender.</param>
/// <param name="e">Arguments for axis angle event.</param>
private void AngleAsString(object sender, SupplyCustomAngleStringEventArgs e)
{
int degrees = (int)Math.Round(180f * e.Angle / Math.PI);
switch (degrees)
{
case 0:
e.AngleAsString = "NORTH";
break;
case 90:
e.AngleAsString = "EAST";
break;
case 45:
e.AngleAsString = "NE";
break;
case 360:
e.AngleAsString = "NORTH";
break;
case 315:
e.AngleAsString = "NW";
break;
case 270:
e.AngleAsString = "WEST";
break;
case 225:
e.AngleAsString = "SW";
break;
case 180:
e.AngleAsString = "SOUTH";
break;
case 135:
e.AngleAsString = "SE";
break;
default:
e.AngleAsString = "";
break;
}
}
}
}