/// <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; }
/// <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; }
//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; }