예제 #1
0
        /// <summary>
        /// Given a set of datapoints, convert them to inches and return the points.
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private static IList<Datatype.DoublePoint> convertToInches(Datatype.ImageData data, Datatype.Stats stats)
        {
            Point oldX = data.scale.horizontal;
            Point oldY = data.scale.vertical;
            Point oldOrigin = data.scale.middle;

            //Change so oldX and oldY are in reference to origin of (0, 0)
            oldX = pointSubtract(oldX, oldOrigin);
            oldY = pointSubtract(oldY, oldOrigin);

            //Declare new points.  Data.scale.___length is the scale and origin of (0,0)
            Datatype.DoublePoint inchesX = new Datatype.DoublePoint(data.scale.horizontalLength, 0);
            Datatype.DoublePoint inchesY = new Datatype.DoublePoint(0, data.scale.verticalLength);
            Datatype.DoublePoint inchesOrigin = new Datatype.DoublePoint(0, 0);

            inchesX = pointSubtract(inchesX, inchesOrigin);
            inchesY = pointSubtract(inchesY, inchesOrigin);

            //Convert by using transformation matrix A:
            //A * oldPoint = newPoint
            //A = [ a  b
            //      c  d ]

            //Assuming oldX, oldY, newX, and newY are all measured from an origin of 0:
            double a = (double)inchesX.X / (double)oldX.X;
            double b = (double)inchesX.Y / (double)oldX.X;
            double c = (double)inchesY.X / ((double)oldY.Y - ((double)oldY.X / (double)oldX.X) * (double)oldX.Y);
            double d = (double)inchesY.Y / ((double)oldY.Y - ((double)oldY.X / (double)oldX.X) * (double)oldX.Y);

            //Convert each point by multiplying by matrix A:
            // [a b  *  [oldX  = [newX
            //  c d]     oldY]    newY]
            Datatype.DoublePoint doublePoint = new Datatype.DoublePoint();
            IList<Datatype.DoublePoint> newPoints = new List<Datatype.DoublePoint>();

            for (int point = 0; point < data.points.Count; point++)
            {
                doublePoint.X = a * data.points[point].X + c * data.points[point].Y;
                doublePoint.Y = b * data.points[point].X + d * data.points[point].Y;
                newPoints.Add(doublePoint);
            }

            return newPoints;
        }
예제 #2
0
        /// <summary>
        /// Given a set of datapoints, vertically flip them.
        /// </summary>
        /// <param name="newData"></param>
        /// <returns></returns>
        private static IList<Datatype.DoublePoint> verticallyFlip(IList<Datatype.DoublePoint> dataPoints)
        {
            Datatype.DoublePoint newPoint = new Datatype.DoublePoint();
            for (int point = 0; point < dataPoints.Count; point++)
            {
                newPoint.X = dataPoints[point].X;
                newPoint.Y = dataPoints[point].Y;

                dataPoints[point] = newPoint;
            }
            return dataPoints;
        }
예제 #3
0
 //Translate so center is at the origin.
 private static IList<Datatype.DoublePoint> translatePoints(IList<Datatype.DoublePoint> pointList)
 {
     Datatype.DoublePoint center = Stats.ComputeCenter(pointList);
     Datatype.DoublePoint temp = new Datatype.DoublePoint();
     for (int i = 0; i < pointList.Count; i++ )
     {
         temp.X = pointList[i].X - center.X;
         temp.Y = pointList[i].Y - center.Y;
         pointList[i] = temp;
     }
     return pointList;
 }