Beispiel #1
0
 // 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);
     }
 }
Beispiel #2
0
 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);
        }
Beispiel #4
0
    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))));
    }