199 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections;
 | |
| using System.Text;
 | |
| 
 | |
| namespace DrawGraph
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// enumeration used to indicate which type of data will be plotted.
 | |
| 	/// </summary>
 | |
| 	public enum SampleType
 | |
| 	{
 | |
| 		/// <summary>
 | |
| 		/// Designates the "Time" property will be used
 | |
| 		/// </summary>
 | |
| 		Time,
 | |
| 		/// <summary>
 | |
| 		/// Designates the "Position" property will be used
 | |
| 		/// </summary>
 | |
| 		Position,
 | |
| 		/// <summary>
 | |
| 		/// Designates the Instantaneous Velocity property will be used
 | |
| 		/// </summary>
 | |
| 		VelocityInst,
 | |
| 		/// <summary>
 | |
| 		/// Designates the "Time since start" property will be used
 | |
| 		/// </summary>
 | |
| 		TimeDiff,
 | |
| 		/// <summary>
 | |
| 		/// Designates the Average Velocity property will be used
 | |
| 		/// </summary>
 | |
| 		VelocityAvg
 | |
| 	};
 | |
| 
 | |
| 	/// <summary>
 | |
| 	/// A simple storage class to maintain an individual sampling of data
 | |
| 	/// </summary>
 | |
| 	public class Sample : System.Object
 | |
| 	{
 | |
| 		private DateTime	_time;
 | |
| 		private double		_position;
 | |
| 		private double		_velocity;
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// The time of the sample
 | |
| 		/// </summary>
 | |
| 		public DateTime Time
 | |
| 		{
 | |
| 			get { return _time; }
 | |
| 			set { _time = value; }
 | |
| 		}
 | |
| 		/// <summary>
 | |
| 		/// The position at sample time
 | |
| 		/// </summary>
 | |
| 		public double Position
 | |
| 		{
 | |
| 			get { return _position; }
 | |
| 			set { _position = value; }
 | |
| 		}
 | |
| 		/// <summary>
 | |
| 		/// The instantaneous velocity at sample time
 | |
| 		/// </summary>
 | |
| 		public double Velocity
 | |
| 		{
 | |
| 			get { return _velocity; }
 | |
| 			set { _velocity = value; }
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/// <summary>
 | |
| 	/// A collection class to maintain a set of samples
 | |
| 	/// </summary>
 | |
| 	[Serializable]
 | |
| 	public class SamplePointList : IPointList
 | |
| 	{
 | |
| 		/// <summary>
 | |
| 		/// Determines what data type gets plotted for the X values
 | |
| 		/// </summary>
 | |
| 		public SampleType XType;
 | |
| 		/// <summary>
 | |
| 		/// Determines what data type gets plotted for the Y values
 | |
| 		/// </summary>
 | |
| 		public SampleType YType;
 | |
| 
 | |
| 		// Stores the collection of samples
 | |
| 		private ArrayList list;
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Indexer: get the Sample instance at the specified ordinal position in the list
 | |
| 		/// </summary>
 | |
| 		/// <param name="index">The ordinal position in the list of samples</param>
 | |
| 		/// <returns>Returns a <see cref="PointPair" /> instance containing the
 | |
| 		/// data specified by <see cref="XType" /> and <see cref="YType" />
 | |
| 		/// </returns>
 | |
| 		public PointPair this[int index]
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				PointPair pt = new PointPair();
 | |
| 				Sample sample = (Sample) list[index];
 | |
| 				pt.X = GetValue( sample, XType );
 | |
| 				pt.Y = GetValue( sample, YType );
 | |
| 				return pt;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Gets the number of samples in the collection
 | |
| 		/// </summary>
 | |
| 		public int Count
 | |
| 		{
 | |
| 			get { return list.Count; }
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Get the specified data type from the specified sample
 | |
| 		/// </summary>
 | |
| 		/// <param name="sample">The sample instance of interest</param>
 | |
| 		/// <param name="type">The data type to be extracted from the sample</param>
 | |
| 		/// <returns>A double value representing the requested data</returns>
 | |
| 		public double GetValue( Sample sample, SampleType type )
 | |
| 		{
 | |
| 			switch ( type )
 | |
| 			{
 | |
| 				case SampleType.Position:
 | |
| 					return sample.Position;
 | |
| 				case SampleType.Time:
 | |
| 					return sample.Time.ToOADate();
 | |
| 				case SampleType.TimeDiff:
 | |
| 					return sample.Time.ToOADate() - ( (Sample)list[0] ).Time.ToOADate();
 | |
| 				case SampleType.VelocityAvg:
 | |
| 					double timeDiff = sample.Time.ToOADate() - ( (Sample)list[0] ).Time.ToOADate();
 | |
| 					if ( timeDiff <= 0 )
 | |
| 						return PointPair.Missing;
 | |
| 					else
 | |
| 						return ( sample.Position - ( (Sample)list[0] ).Position ) / timeDiff;
 | |
| 				case SampleType.VelocityInst:
 | |
| 					return sample.Velocity;
 | |
| 				default:
 | |
| 					return PointPair.Missing;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Append a sample to the collection
 | |
| 		/// </summary>
 | |
| 		/// <param name="sample">The sample to append</param>
 | |
| 		/// <returns>The ordinal position at which the sample was added</returns>
 | |
| 		public int Add( Sample sample )
 | |
| 		{
 | |
| 			return list.Add( sample );
 | |
| 		}
 | |
| 
 | |
| 		// generic Clone: just call the typesafe version
 | |
| 		object ICloneable.Clone()
 | |
| 		{
 | |
| 			return this.Clone();
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// typesafe clone method
 | |
| 		/// </summary>
 | |
| 		/// <returns>A new cloned SamplePointList.  This returns a copy of the structure,
 | |
| 		/// but it does not duplicate the data (it just keeps a reference to the original)
 | |
| 		/// </returns>
 | |
| 		public SamplePointList Clone()
 | |
| 		{
 | |
| 			return new SamplePointList( this );
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// default constructor
 | |
| 		/// </summary>
 | |
| 		public SamplePointList()
 | |
| 		{
 | |
| 			XType = SampleType.Time;
 | |
| 			YType = SampleType.Position;
 | |
| 			list = new ArrayList();
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// copy constructor -- this returns a copy of the structure,
 | |
| 		/// but it does not duplicate the data (it just keeps a reference to the original)
 | |
| 		/// </summary>
 | |
| 		/// <param name="rhs">The SamplePointList to be copied</param>
 | |
| 		public SamplePointList( SamplePointList rhs )
 | |
| 		{
 | |
| 			XType = rhs.XType;
 | |
| 			YType = rhs.YType;
 | |
| 
 | |
| 			// Don't duplicate the data values, just copy the reference to the ArrayList
 | |
| 			this.list = rhs.list;
 | |
| 
 | |
| 			//foreach ( Sample sample in rhs )
 | |
| 			//	list.Add( sample );
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| }
 |