using Systemusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace RealTimeGraphEx.Models
{
public class RealTimeGraphExReachPolygon
{
public List<Point> Points { get; set; }
public List<double> ActualValues { get; set; }
public int TotalPoints
{
get { return Points.Count; }
}
public RealTimeGraphExReachPolygon()
{
Points = new List<Point>();
ActualValues = new List<double>();
}
public Point Add(double xValue, double yValue, double actualValue)
{
var p = new Point(xValue, yValue);
Points.Add(p);
ActualValues.Add(actualValue);
return p;
}
public Point Replace(double xValue, double yValue, double actualValue, int index)
{
var p = new Point(xValue, yValue);
Points.RemoveAt(index);
Points.Insert(index, p);
ActualValues.RemoveAt(index);
ActualValues.Insert(index, actualValue);
return p;
}
public void RemoveFromStart(int count)
{
lock (Points)
{
Points.RemoveRange(0, count);
ActualValues.RemoveRange(0, count);
double offSet = Points[0].X;
for (int i = 0; i < Points.Count; i++)
{
Points[i] = new Point(Points[i].X - offSet, Points[i].Y);
}
}
}
public void ClearPoints()
{
Points.Clear();
}
public void ClearActualPoints()
{
ActualValues.Clear();
}
public List<Point> ToPolygonPointsFill(double width, double height)
{
lock (Points)
{
List<Point> points = new List<Point>();
for (int i = 0; i < Points.Count; i++)
{
points.Add(Points[i]);
}
points.Add(new Point(width, height));
points.Add(new Point(0, height));
points.Add(new Point(0, points[0].Y));
return points;
}
}
public List<Point> ToPolygonPointsFill(double width, double height, double scaleFactor, Func<double, double> scaleY)
{
double xValue = 0;
lock (Points)
{
List<Point> points = new List<Point>();
for (int i = 0; i < Points.Count; i++)
{
points.Add(new Point(xValue, scaleY(Points[i].Y)));
xValue += scaleFactor;
}
points.Add(new Point(xValue, height));
points.Add(new Point(0, height));
points.Add(new Point(0, points[0].Y));
return points;
}
}
public List<Point> ToPolygonPoints(double width, double height, double scaleFactor, Func<double, double> scaleY)
{
double xValue = 0;
lock (Points)
{
List<Point> points = new List<Point>();
for (int i = 0; i < Points.Count; i++)
{
points.Add(new Point(xValue, scaleY(Points[i].Y)));
xValue += scaleFactor;
}
return points;
}
}
public List<Point> ToPolygonPointsWaveFill(double width, double height)
{
lock (Points)
{
List<Point> points = new List<Point>();
for (int i = 0; i < Points.Count; i++)
{
points.Add(Points[i]);
}
for (int i = Points.Count - 1; i >= 0; i--)
{
points.Add(new Point(Points[i].X, (height - Points[i].Y)));
}
points.Add(new Point(points[0].X, (height / 2)));
points.Add(new Point(0, (height / 2)));
points.Add(new Point(0, points[0].Y));
return points;
}
}
public List<Point> ToPolygonPointsWaveFill(double width, double height, double scaleFactor, Func<double, double> scaleY)
{
if (Points.Count == 0) return new List<Point>();
double xValue = 0;
lock (Points)
{
List<Point> points = new List<Point>();
for (int i = 0; i < Points.Count; i++)
{
points.Add(new Point(xValue, scaleY(Points[i].Y)));
xValue += scaleFactor;
}
//points.Add(new Point(width, points[points.Count - 1].Y));
points.Add(new Point(width, (height / 2)));
points.Add(new Point(width, (height - scaleY(Points[Points.Count - 1].Y))));
xValue -= scaleFactor;
for (int i = Points.Count - 1; i >= 0; i--)
{
points.Add(new Point(xValue, (height - scaleY(Points[i].Y))));
xValue -= scaleFactor;
}
points.Add(new Point(0, points[points.Count - 1].Y));
points.Add(new Point(0, (height / 2)));
points.Add(new Point(0, (height / 2)));
points.Add(new Point(0, points[0].Y));
return points;
}
}
public List<Point> ToPolygonPointsWave(double width, double height, double scaleFactor, Func<double, double> scaleY)
{
if (Points.Count == 0) return new List<Point>();
double xValue = 0;
lock (Points)
{
List<Point> points = new List<Point>();
for (int i = 0; i < Points.Count; i++)
{
points.Add(new Point(xValue, scaleY(Points[i].Y)));
xValue += scaleFactor;
}
//points.Add(new Point(width, points[points.Count - 1].Y));
points.Add(new Point(width, (height / 2)));
points.Add(new Point(width, (height - scaleY(Points[Points.Count - 1].Y))));
xValue -= scaleFactor;
for (int i = Points.Count - 1; i >= 0; i--)
{
points.Add(new Point(xValue, (height - scaleY(Points[i].Y))));
xValue -= scaleFactor;
}
points.Add(new Point(0, points[points.Count - 1].Y));
points.Add(new Point(0, (height / 2)));
points.Add(new Point(0, (height / 2)));
points.Add(new Point(0, points[0].Y));
return points;
}
}
}
}