using 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 Points { get; set; } public List ActualValues { get; set; } public int TotalPoints { get { return Points.Count; } } public RealTimeGraphExReachPolygon() { Points = new List(); ActualValues = new List(); } 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 ToPolygonPointsFill(double width, double height) { lock (Points) { List points = new List(); 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 ToPolygonPointsFill(double width, double height, double scaleFactor, Func scaleY) { double xValue = 0; lock (Points) { List points = new List(); 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 ToPolygonPoints(double width, double height, double scaleFactor, Func scaleY) { double xValue = 0; lock (Points) { List points = new List(); for (int i = 0; i < Points.Count; i++) { points.Add(new Point(xValue, scaleY(Points[i].Y))); xValue += scaleFactor; } return points; } } public List ToPolygonPointsWaveFill(double width, double height) { lock (Points) { List points = new List(); 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 ToPolygonPointsWaveFill(double width, double height, double scaleFactor, Func scaleY) { if (Points.Count == 0) return new List(); double xValue = 0; lock (Points) { List points = new List(); 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 ToPolygonPointsWave(double width, double height, double scaleFactor, Func scaleY) { if (Points.Count == 0) return new List(); double xValue = 0; lock (Points) { List points = new List(); 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; } } } }