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