Files
DynamicDataDisplay/Charts/Filters/FrequencyFilter2.cs
2024-02-23 00:46:06 -05:00

91 lines
1.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Research.DynamicDataDisplay.Charts.Filters;
using System.Windows;
namespace Microsoft.Research.DynamicDataDisplay.Filters
{
public class FrequencyFilter2 : PointsFilterBase
{
private Rect screenRect;
public override void SetScreenRect(Rect screenRect)
{
this.screenRect = screenRect;
}
public override List<Point> Filter(List<Point> points)
{
List<Point> result = new List<Point>();
using (var enumerator = points.GetEnumerator())
{
double currentX = Double.NegativeInfinity;
double minX = 0, maxX = 0, minY = 0, maxY = 0;
Point left = new Point(), right = new Point(), top = new Point(), bottom = new Point();
bool isFirstPoint = true;
while (enumerator.MoveNext())
{
Point currPoint = enumerator.Current;
double x = currPoint.X;
double y = currPoint.Y;
double xInt = Math.Floor(x);
if (xInt == currentX)
{
if (x > maxX)
{
maxX = x;
right = currPoint;
}
if (y > maxY)
{
maxY = y;
top = currPoint;
}
else if (y < minY)
{
minY = y;
bottom = currPoint;
}
}
else
{
if (!isFirstPoint)
{
result.Add(left);
Point leftY = top.X < bottom.X ? top : bottom;
Point rightY = top.X > bottom.X ? top : bottom;
if (top != bottom)
{
result.Add(leftY);
result.Add(rightY);
}
else if (top != left)
result.Add(top);
if (right != rightY)
result.Add(right);
}
currentX = xInt;
left = right = top = bottom = currPoint;
minX = maxX = x;
minY = maxY = y;
}
isFirstPoint = false;
}
}
return result;
}
}
}