using System;
using System.Windows;
using System.Windows.Controls;
using SciChart.Charting3D.Model.DataSeries.Waterfall;
using SciChart.Examples.ExternalDependencies.Data;
namespace SciChart.Examples.Examples.Charts3D.CreateA3DChart
{
///
/// Interaction logic for CreateAContouredChart.xaml
///
public partial class CreateAWaterfall3DChart : UserControl
{
private readonly FFT2 _transform = new FFT2();
private readonly Random _random = new Random();
public CreateAWaterfall3DChart()
{
InitializeComponent();
Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
var pointsPerSlice = 100;
var sliceCount = 20;
var logBase = 10;
var slicePositions = new double[sliceCount];
for (int i = 0; i < sliceCount; ++i)
{
slicePositions[i] = Math.Pow(logBase, i);
}
var dataSeries = new WaterfallDataSeries3D(pointsPerSlice, slicePositions)
{
SeriesName = "Waterfall",
StartX = 10,
StepX = 1000,
StartZ = 0,
StepZ = 1000
};
_transform.init((uint)Math.Log(pointsPerSlice, 2));
FillDataSeries(dataSeries, sliceCount, pointsPerSlice);
WaterfallSeries.DataSeries = dataSeries;
}
private void FillDataSeries(WaterfallDataSeries3D dataSeries, int sliceCount, int pointsPerSlice)
{
var count = pointsPerSlice * 2;
var re = new double[count];
var im = new double[count];
for (int sliceIndex = 0; sliceIndex < sliceCount; ++sliceIndex)
{
for (var i = 0; i < count; i++)
{
re[i] = 2.0 * Math.Sin(2 * Math.PI * i / 20) +
5 * Math.Sin(2 * Math.PI * i / 10) +
2.0 * _random.NextDouble();
im[i] = -10;
}
_transform.run(re, im);
var scaleCoef = Math.Pow(1.5, sliceIndex * 0.3) / Math.Pow(1.5, sliceCount * 0.3);
for (var pointIndex = 0; pointIndex < pointsPerSlice; pointIndex++)
{
var mag = Math.Sqrt(re[pointIndex] * re[pointIndex] + im[pointIndex] * im[pointIndex]);
var yVal = _random.Next(10,20) * Math.Log10(mag / pointsPerSlice);
yVal = (yVal < -25 || yVal > -5)
? (yVal < -25) ? -25 : _random.Next(-6, -3)
: yVal;
dataSeries[sliceIndex, pointIndex] = -yVal * scaleCoef;
}
}
}
}
}