00001 /* 00002 NPlot - A charting library for .NET 00003 00004 PageAlignedPhysicalAxis.cs 00005 Copyright (C) 2005 00006 Matt Howlett 00007 00008 Redistribution and use of NPlot or parts there-of in source and 00009 binary forms, with or without modification, are permitted provided 00010 that the following conditions are met: 00011 00012 1. Re-distributions in source form must retain at the head of each 00013 source file the above copyright notice, this list of conditions 00014 and the following disclaimer. 00015 00016 2. Any product ("the product") that makes use NPlot or parts 00017 there-of must either: 00018 00019 (a) allow any user of the product to obtain a complete machine- 00020 readable copy of the corresponding source code for the 00021 product and the version of NPlot used for a charge no more 00022 than your cost of physically performing source distribution, 00023 on a medium customarily used for software interchange, or: 00024 00025 (b) reproduce the following text in the documentation, about 00026 box or other materials intended to be read by human users 00027 of the product that is provided to every human user of the 00028 product: 00029 00030 "This product includes software developed as 00031 part of the NPlot library project available 00032 from: http://www.nplot.com/" 00033 00034 The words "This product" may optionally be replace with 00035 the actual name of the product. 00036 00037 ------------------------------------------------------------------------ 00038 00039 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 00040 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00041 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 00042 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 00043 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 00044 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 00045 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 00046 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00047 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 00048 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00049 00050 */ 00051 00052 using System; 00053 using System.Collections; 00054 00055 namespace NPlot 00056 { 00057 00063 public class PageAlignedPhysicalAxis 00064 { 00065 00066 private int pMin_; 00067 private int pMax_; 00068 private int pLength_; // cached. 00069 00070 private double worldMin_; 00071 private double worldMax_; 00072 private double worldLength_; // cached. 00073 00074 00079 public PageAlignedPhysicalAxis( PhysicalAxis physicalAxis ) 00080 { 00081 worldMin_ = physicalAxis.Axis.WorldMin; 00082 worldMax_ = physicalAxis.Axis.WorldMax; 00083 worldLength_ = worldMax_ - worldMin_; 00084 00085 if ( physicalAxis.PhysicalMin.X == physicalAxis.PhysicalMax.X ) 00086 { 00087 pMin_ = physicalAxis.PhysicalMin.Y; 00088 pMax_ = physicalAxis.PhysicalMax.Y; 00089 } 00090 else if ( physicalAxis.PhysicalMin.Y == physicalAxis.PhysicalMax.Y ) 00091 { 00092 pMin_ = physicalAxis.PhysicalMin.X; 00093 pMax_ = physicalAxis.PhysicalMax.X; 00094 } 00095 else 00096 { 00097 throw new NPlotException( "Physical axis is not page aligned" ); 00098 } 00099 00100 pLength_ = pMax_ - pMin_; 00101 00102 } 00103 00104 00110 public float WorldToPhysical( double world ) 00111 { 00112 return (float)(((world-worldMin_) / worldLength_) * (float)pLength_ + (float)pMin_); 00113 } 00114 00115 00122 public float WorldToPhysicalClipped( double world ) 00123 { 00124 if (world > worldMax_) 00125 { 00126 return pMax_; 00127 } 00128 00129 if (world < worldMin_) 00130 { 00131 return pMin_; 00132 } 00133 00134 // is this quicker than returning WorldToPhysical? 00135 return (float)(((world-worldMin_) / worldLength_) * (float)pLength_ + (float)pMin_); 00136 } 00137 00138 00144 public double PhysicalToWorld( float physical ) 00145 { 00146 return ((float)(physical-pMin_) / (float)pLength_) * worldLength_ + worldMin_; 00147 } 00148 00149 00150 } 00151 }