using System.Linq; using Windows.Foundation; using LiveCharts.Dtos; using LiveCharts.Uwp.Charts.Base; namespace LiveCharts.Uwp { /// /// /// public static class Extentions { /// /// Converts a point at screen to chart values scale /// /// Target chart /// point in screen /// axis x index /// axis y index /// public static Point ConvertToChartValues(this Chart chart, Point screenPoint, int axisX = 0, int axisY = 0) { if (chart.Model == null || chart.AxisX == null || chart.AxisX.Any(x => x.Model == null)) return new Point(); var uw = new CorePoint( chart.AxisX[axisX].Model.EvaluatesUnitWidth ? ChartFunctions.GetUnitWidth(AxisOrientation.X, chart.Model, axisX)/2 : 0, chart.AxisY[axisY].Model.EvaluatesUnitWidth ? ChartFunctions.GetUnitWidth(AxisOrientation.Y, chart.Model, axisY)/2 : 0); return new Point( ChartFunctions.FromPlotArea(screenPoint.X - uw.X, AxisOrientation.X, chart.Model, axisX), ChartFunctions.FromPlotArea(screenPoint.Y - uw.Y, AxisOrientation.Y, chart.Model, axisY)); } /// /// Converts a chart values pair to pixels /// /// Target chart /// point in screen /// axis x index /// axis y index /// public static Point ConvertToPixels(this Chart chart, Point chartPoint, int axisX = 0, int axisY = 0) { if (chart.Model == null || chart.AxisX.Any(x => x.Model == null)) return new Point(); var uw = new CorePoint( chart.AxisX[axisX].Model.EvaluatesUnitWidth ? ChartFunctions.GetUnitWidth(AxisOrientation.X, chart.Model, axisX) / 2 : 0, chart.AxisY[axisY].Model.EvaluatesUnitWidth ? ChartFunctions.GetUnitWidth(AxisOrientation.Y, chart.Model, axisY) / 2 : 0); return new Point( ChartFunctions.ToPlotArea(chartPoint.X, AxisOrientation.X, chart.Model, axisX) + uw.X, ChartFunctions.ToPlotArea(chartPoint.Y, AxisOrientation.Y, chart.Model, axisY) + uw.Y); } /// /// Converts a ChartPoint to Point /// /// point to convert /// public static Point AsPoint(this ChartPoint chartPoint) { return new Point(chartPoint.X, chartPoint.Y); } /// /// Converts a CorePoint to Point /// /// point to convert /// internal static Point AsPoint(this CorePoint point) { return new Point(point.X, point.Y); } } }