// sort by angle, then closeness to the station (dp -> data point) private int AsteriodSort(DataPoint2D dp1, DataPoint2D dp2) { if (dp1.val == dp2.val) { int dis1 = dp1.DistanceFrom(_station); int dis2 = dp2.DistanceFrom(_station); return(dis1 == dis2 ? 0 : (dis1 > dis2 ? 1 : -1)); } else { return(dp1.val > dp2.val ? 1 : -1); } }
protected bool Equals(DataPoint2D <x, y> other) { return(other != null && Equals(X, other.X) && Equals(Y, other.Y)); }
private Quad GetQuad(double ColumnValue, double RowValue, List <double> ColumnHeaders, List <double> RowHeaders, List <List <double> > Data) { //check for boundaries double ColumnLeft, ColumnRight, RowAbove, RowBelow; int columnLeftIndex, columnRightIndex, rowAboveIndex, rowBelowIndex; if (RowHeaders.Count != Data.Count || ColumnHeaders.Count != Data[0].Count) { throw new Exception("Inconsistent data. Row or column headers do not match data."); } //SPECIAL CASES: coumn or row value out of range //---------------------------------------------------- if (ColumnValue < ColumnHeaders[0] || ColumnValue > ColumnHeaders[ColumnHeaders.Count - 1] || RowValue <RowHeaders[0] || RowValue> RowHeaders[RowHeaders.Count - 1]) { if (ColumnValue < ColumnHeaders[0] || ColumnValue > ColumnHeaders[ColumnHeaders.Count - 1]) { if (ColumnValue < ColumnHeaders[0]) { columnLeftIndex = 0; columnRightIndex = 0; } else // if ( ColumnValue > ColumnHeaders[ColumnHeaders.Count - 1]) { columnLeftIndex = ColumnHeaders.Count - 1; columnRightIndex = ColumnHeaders.Count - 1; } //Find low and high ROW values RowAbove = RowHeaders.Where(rv => rv <= RowValue).Max(); rowAboveIndex = RowHeaders.LastIndexOf(RowAbove); RowBelow = RowHeaders.Where(rv => rv >= RowValue).Min(); rowBelowIndex = RowHeaders.LastIndexOf(RowBelow); } else //if (RowValue < RowHeaders[0] || RowValue > RowHeaders[RowHeaders.Count - 1]) { if (RowValue < RowHeaders[0]) { rowAboveIndex = 0; rowBelowIndex = 0; } else //if (RowValue > RowHeaders[RowHeaders.Count-1]) { rowAboveIndex = RowHeaders.Count - 1; rowBelowIndex = RowHeaders.Count - 1; } //Find low and high COLUMN values ColumnLeft = ColumnHeaders.Where(cv => cv <= ColumnValue).Max(); columnLeftIndex = RowHeaders.LastIndexOf(ColumnLeft); ColumnRight = ColumnHeaders.Where(cv => cv >= ColumnValue).Min(); columnRightIndex = RowHeaders.LastIndexOf(ColumnRight); } } else { //Interpolated value within data table // REGULAR CASE //---------------------------------------------------- List <List <DataPoint2D> > DataPoints = new List <List <DataPoint2D> >(); //Create array of datapoints for (int i = 0; i < RowHeaders.Count; i++) { int j = 0; List <DataPoint2D> thisRowOfPoints = new List <DataPoint2D>(); foreach (var item in Data[i]) { thisRowOfPoints.Add(new DataPoint2D((decimal)ColumnHeaders[j], (decimal)RowHeaders[i], (decimal)Data[i][j])); } DataPoints.Add(thisRowOfPoints); } ColumnLeft = ColumnHeaders.Where(cv => cv <= ColumnValue).Max(); columnLeftIndex = ColumnHeaders.FindIndex(x => x == ColumnLeft); ColumnRight = ColumnHeaders.Where(cv => cv >= ColumnValue).Min(); columnRightIndex = ColumnHeaders.FindIndex(x => x == ColumnRight); RowAbove = RowHeaders.Where(cv => cv <= RowValue).Max(); rowAboveIndex = RowHeaders.FindIndex(x => x == RowAbove); RowBelow = RowHeaders.Where(cv => cv >= RowValue).Min(); rowBelowIndex = RowHeaders.FindIndex(x => x == RowBelow); } DataPoint2D lowerLeftPoint = new DataPoint2D((decimal)ColumnHeaders[columnLeftIndex], (decimal)RowHeaders[rowBelowIndex], (decimal)Data[rowBelowIndex][columnLeftIndex]); DataPoint2D lowerRightPoint = new DataPoint2D((decimal)ColumnHeaders[columnRightIndex], (decimal)RowHeaders[rowBelowIndex], (decimal)Data[rowBelowIndex][columnRightIndex]); DataPoint2D upperLeftPoint = new DataPoint2D((decimal)ColumnHeaders[columnLeftIndex], (decimal)RowHeaders[rowAboveIndex], (decimal)Data[rowAboveIndex][columnLeftIndex]); DataPoint2D upperRightPoint = new DataPoint2D((decimal)ColumnHeaders[columnRightIndex], (decimal)RowHeaders[rowAboveIndex], (decimal)Data[rowAboveIndex][columnRightIndex]); Quad q = new Quad() { LowerLeftPoint = lowerLeftPoint, LowerRightPoint = lowerRightPoint, UpperLeftPoint = upperLeftPoint, UpperRightPoint = upperRightPoint }; return(q); }
public int DistanceFrom(DataPoint2D p) { Func <int, int> square = n => n * n; return((int)Math.Round(Math.Sqrt(square(p.x - x) + square(p.y - y)))); }