//============================================================================ //ZedGraph Class Library - A Flexible Charting Library for .Net //Copyright ?2005 John Champion and Jerry Vos // //This library is free software; you can redistribute it and/or //modify it under the terms of the GNU Lesser General Public //License as published by the Free Software Foundation; either //version 2.1 of the License, or (at your option) any later version. // //This library is distributed in the hope that it will be useful, //but WITHOUT ANY WARRANTY; without even the implied warranty of //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU //Lesser General Public License for more details. // //You should have received a copy of the GNU Lesser General Public //License along with this library; if not, write to the Free Software //Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //============================================================================= using System; using System.Collections; using System.Text; using System.Drawing; namespace DrawGraph { /// /// An enum used to specify the X or Y data type of interest -- see /// and . /// public enum PerfDataType { /// /// The time (seconds) at which these data are measured /// Time, /// /// The distance traveled, meters /// Distance, /// /// The instantaneous velocity, meters per second /// Velocity, /// /// The instantaneous acceleration, meters per second squared /// Acceleration }; /// /// Sample data structure containing a variety of data values, in this case the values /// are related in that they correspond to the same time value. /// public class PerformanceData { /// /// The time (seconds) at which these data are measured /// public double time; /// /// The distance traveled, meters /// public double distance; /// /// The instantaneous velocity, meters per second /// public double velocity; /// /// The instantaneous acceleration, meters per second squared /// public double acceleration; /// /// Constructor that specifies each data value in the PerformanceData struct /// /// The time (seconds) at which these data are measured /// The distance traveled, meters /// The instantaneous velocity, meters per second /// The instantaneous acceleration, meters per second squared public PerformanceData( double time, double distance, double velocity, double acceleration ) { this.time = time; this.distance = distance; this.velocity = velocity; this.acceleration = acceleration; } /// /// Gets or sets the data value as specified by the enum /// /// The required data value type public double this[ PerfDataType type ] { get { switch( type ) { default: case PerfDataType.Time: return time; case PerfDataType.Distance: return distance; case PerfDataType.Velocity: return velocity; case PerfDataType.Acceleration: return acceleration; } } set { switch( type ) { case PerfDataType.Time: time = value; break; case PerfDataType.Distance: distance = value; break; case PerfDataType.Velocity: velocity = value; break; case PerfDataType.Acceleration: acceleration = value; break; } } } } /// /// A sample class that holds an internal collection, and implements the /// interface so that it can be used by ZedGraph as curve data. /// /// /// This particular class efficiently implements the data storage so that the class /// can be cloned without duplicating the data points. For example, you can create /// a , populate it with values, and set /// = and /// = . /// You can then clone this to a new one, and set /// = . /// Each of these 's can then be used as an /// argument, /// thereby plotting a distance vs time curve and a velocity vs time curve. There /// will still be only one copy of the data in memory. /// [Serializable] public class SampleMultiPointList : IPointList { /// /// This is where the data are stored. Duplicating the /// copies the reference to this , but does not actually duplicate /// the data. /// private ArrayList DataCollection; /// /// Determines what X data will be returned by the indexer of this list. /// public PerfDataType XData; /// /// Determines what Y data will be returned by the indexer of this list. /// public PerfDataType YData; /// /// Default constructor /// public SampleMultiPointList() { XData = PerfDataType.Time; YData = PerfDataType.Distance; DataCollection = new ArrayList(); } /// /// The Copy Constructor. This method does NOT duplicate the data, it merely makes /// another "Window" into the same collection. You can make multiple copies and /// set the and/or properties to different /// values to plot different data, while maintaining only one copy of the original values. /// /// The from which to copy public SampleMultiPointList( SampleMultiPointList rhs ) { DataCollection = rhs.DataCollection; XData = rhs.XData; YData = rhs.YData; } /// /// Implement the interface in a typesafe manner by just /// calling the typed version of /// /// A deep copy of this object object ICloneable.Clone() { return this.Clone(); } /// /// Typesafe, deep-copy clone method. /// /// A new, independent copy of this class public SampleMultiPointList Clone() { return new SampleMultiPointList( this ); } /// /// Indexer to access the data. This gets the appropriate data and converts to /// the struct that is compatible with ZedGraph. The /// actual data returned depends on the values of and /// . /// /// The ordinal position of the desired point in the list /// A corresponding to the specified ordinal data position public PointPair this[ int index ] { get { double xVal, yVal; if ( index >= 0 && index < this.Count ) { // grab the specified PerformanceData struct PerformanceData perfData = (PerformanceData) DataCollection[index]; // extract the values from the struct according to the user-set // enum values of XData and YData xVal = perfData[XData]; yVal = perfData[YData]; } else { xVal = PointPair.Missing; yVal = PointPair.Missing; } // insert the values into a pointpair and return return new PointPair( xVal, yVal, PointPair.Missing, null ); } } /// /// Gets the number of data points in the collection /// public int Count { get { return DataCollection.Count; } } /// /// Adds the specified struct to the end of the collection. /// /// A struct to be added /// The ordinal position in the collection where the values were added public int Add( PerformanceData perfData ) { return DataCollection.Add( perfData ); } /// /// Remove the struct from the list at the specified /// ordinal location. /// /// The ordinal location of the /// struct to be removed public void RemoveAt( int index ) { DataCollection.RemoveAt( index ); } /// /// Insert the specified struct into the list at /// the specified ordinal location. /// /// The ordinal location at which to insert /// The struct to be inserted public void Insert( int index, PerformanceData perfData ) { DataCollection.Insert( index, perfData ); } } }