/* * NPlot - A charting library for .NET * * Transform2D.cs * Copyright (C) 2003-2006 Matt Howlett and others. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of NPlot nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ using System.Drawing; namespace NPlot { /// /// Encapsulates functionality for transforming world to physical coordinates optimally. /// /// The existence of the whole ITransform2D thing might need revising. Not convinced it's the best way. public class Transform2D { /// /// Constructs the optimal ITransform2D object for the supplied x and y axes. /// /// The xAxis to use for the world to physical transform. /// The yAxis to use for the world to physical transform. /// An ITransform2D derived object for converting from world to physical coordinates. public static ITransform2D GetTransformer(PhysicalAxis xAxis, PhysicalAxis yAxis) { ITransform2D ret = null; // if (xAxis.Axis.IsLinear && yAxis.Axis.IsLinear && !xAxis.Axis.Reversed && !yAxis.Axis.Reversed) // ret = new FastTransform2D( xAxis, yAxis ); // else // ret = new DefaultTransform2D( xAxis, yAxis ); ret = new DefaultTransform2D(xAxis, yAxis); return ret; } /// /// This class does world -> physical transforms for the general case /// public class DefaultTransform2D : ITransform2D { private readonly PhysicalAxis xAxis_; private readonly PhysicalAxis yAxis_; /// /// Constructor /// /// The x-axis to use for transforms /// The y-axis to use for transforms public DefaultTransform2D(PhysicalAxis xAxis, PhysicalAxis yAxis) { xAxis_ = xAxis; yAxis_ = yAxis; } /// /// Transforms the given world point to physical coordinates /// /// x coordinate of world point to transform. /// y coordinate of world point to transform. /// the corresponding physical point. public PointF Transform(double x, double y) { return new PointF( xAxis_.WorldToPhysical(x, false).X, yAxis_.WorldToPhysical(y, false).Y); } /// /// Transforms the given world point to physical coordinates /// /// the world point to transform /// the corresponding physical point public PointF Transform(PointD worldPoint) { return new PointF( xAxis_.WorldToPhysical(worldPoint.X, false).X, yAxis_.WorldToPhysical(worldPoint.Y, false).Y); } } /// /// This class does highly efficient world->physical and physical->world transforms /// for linear axes. /// public class FastTransform2D : ITransform2D { private readonly PageAlignedPhysicalAxis xAxis_; private readonly PageAlignedPhysicalAxis yAxis_; /// /// Constructor /// /// The x-axis to use for transforms /// The y-axis to use for transforms public FastTransform2D(PhysicalAxis xAxis, PhysicalAxis yAxis) { xAxis_ = new PageAlignedPhysicalAxis(xAxis); yAxis_ = new PageAlignedPhysicalAxis(yAxis); } /// /// Transforms the given world point to physical coordinates /// /// x coordinate of world point to transform. /// y coordinate of world point to transform. /// the corresponding physical point. public PointF Transform(double x, double y) { return new PointF( xAxis_.WorldToPhysicalClipped(x), yAxis_.WorldToPhysicalClipped(y)); } /// /// Transforms the given world point to physical coordinates /// /// the world point to transform /// the corresponding physical point public PointF Transform(PointD worldPoint) { return new PointF( xAxis_.WorldToPhysical(worldPoint.X), yAxis_.WorldToPhysical(worldPoint.Y)); } } } }