public void AffineTransform(float xScaleFactor, float yScaleFactor, float translateToX, float translateToY, TraceGroupCornerEnum referenceCorner) { var outTraceGroup = new TraceGroup(); float xReference = 0f, yReference = 0f; float x, y; if (xScaleFactor <= 0) //invalid { } if (yScaleFactor <= 0) { //invalid } var box = GetBoundingBox(); switch (referenceCorner) { case TraceGroupCornerEnum.XMin_YMin: xReference = box.XMin; yReference = box.YMin; break; case TraceGroupCornerEnum.XMin_YMax: xReference = box.XMin; yReference = box.YMax; break; case TraceGroupCornerEnum.XMax_YMin: xReference = box.XMax; yReference = box.YMin; break; case TraceGroupCornerEnum.XMax_YMax: xReference = box.XMax; yReference = box.YMax; break; default: break; } foreach (var trace in Traces) { var xVec = trace.ChannelX; var yVec = trace.ChannelY; var scaleTrace = new Trace(); foreach (var point in trace.Points) { //the additive term is to translate back the scaled tracegroup //so that the corner asked for is preserved at the destination //(translateToX,translateToY) x = (point.X * xScaleFactor) / XScaleFactor + (translateToX - (xReference * (xScaleFactor / XScaleFactor))); //the additive term is to translate back the scaled tracegroup //so that the corner asked for is preserved at the destination //(translateToX,translateToY) y = (point.Y * yScaleFactor) / YScaleFactor + (translateToY - (yReference * (yScaleFactor / YScaleFactor))); scaleTrace.Points.Add(new PenPoint { X = x, Y = y }); } outTraceGroup.Traces.Add(scaleTrace); } Traces = outTraceGroup.Traces; XScaleFactor = xScaleFactor; YScaleFactor = yScaleFactor; //return outTraceGroup; }
public void AffineTransform(float xScaleFactor, float yScaleFactor, float translateToX, float translateToY, TraceGroupCornerEnum referenceCorner) { var outTraceGroup = new TraceGroup(); float xReference = 0f, yReference = 0f; float x, y; if (xScaleFactor <= 0) //invalid { } if (yScaleFactor <= 0) { //invalid } var box = GetBoundingBox(); switch (referenceCorner) { case TraceGroupCornerEnum.XMin_YMin: xReference = box.XMin; yReference = box.YMin; break; case TraceGroupCornerEnum.XMin_YMax: xReference = box.XMin; yReference = box.YMax; break; case TraceGroupCornerEnum.XMax_YMin: xReference = box.XMax; yReference = box.YMin; break; case TraceGroupCornerEnum.XMax_YMax: xReference = box.XMax; yReference = box.YMax; break; default: break; } foreach(var trace in Traces) { var xVec = trace.ChannelX; var yVec = trace.ChannelY; var scaleTrace = new Trace(); foreach (var point in trace.Points) { //the additive term is to translate back the scaled tracegroup //so that the corner asked for is preserved at the destination //(translateToX,translateToY) x = (point.X*xScaleFactor)/XScaleFactor + (translateToX - (xReference*(xScaleFactor/XScaleFactor))); //the additive term is to translate back the scaled tracegroup //so that the corner asked for is preserved at the destination //(translateToX,translateToY) y = (point.Y*yScaleFactor)/YScaleFactor + (translateToY - (yReference*(yScaleFactor/YScaleFactor))); scaleTrace.Points.Add(new PenPoint{X=x, Y=y}); } outTraceGroup.Traces.Add(scaleTrace); } Traces = outTraceGroup.Traces; XScaleFactor = xScaleFactor; YScaleFactor = yScaleFactor; //return outTraceGroup; }