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