using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MarketData.CNNProcessing { public class PointMapping { public PointMapping(double width,double height,double xDataExtent,double xDataExtentMin,double yDataExtent,double yDataExtentMin,double xMarginExtent=0.00,double yMarginExtent=0.00) { Width=width; Height=height; XMargin=xMarginExtent; YMargin=yMarginExtent; XDataExtent=xDataExtent; XDataExtentMin=xDataExtentMin; YDataExtent=yDataExtent; YDataExtentMin=yDataExtentMin; XScalingFactor=(Width-(XMargin*2.00))/(XDataExtent-XDataExtentMin); YScalingFactor=(Height-(YMargin*2.00))/(YDataExtent-YDataExtentMin); } // MapPoint will both scale the given point and translate the given point from an upper left origin system to a bottom left origin system public Point MapPoint(Point sourcePoint) { int x = (int)((sourcePoint.X - XDataExtentMin) * XScalingFactor + XMargin); int y = (int)(Height - 1 - ((sourcePoint.Y - YDataExtentMin) * YScalingFactor) - YMargin); // clamp to bounds x = Math.Max(0, Math.Min(x, (int)Width - 1)); y = Math.Max(0, Math.Min(y, (int)Height - 1)); return new Point(x, y); } // TranslatePoint will only translate the given point from an upper left origin system to a bottom left origin system public Point TranslatePoint(Point sourcePoint) { Point mappedPoint=new Point((int)sourcePoint.X,(int)(Height-sourcePoint.Y-1)); return mappedPoint; } public double Width{get;private set;} public double Height{get;private set;} public double XDataExtent{get;private set;} public double XDataExtentMin{get;private set;} public double XRange{get{return XDataExtent-XDataExtentMin;}} public double YDataExtent{get;private set;} public double YDataExtentMin{get;private set;} public double YRange{get{return YDataExtent-YDataExtentMin;}} public double XMargin{get;private set;} public double YMargin{get;private set;} public double XScalingFactor{get;private set;} public double YScalingFactor{get;private set;} } }