using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace RealTimeGraphX.DataPoints { public class DateTimeDataPoint : GraphDataPoint { /// /// Initializes a new instance of the class. /// public DateTimeDataPoint() : base() { } /// /// Initializes a new instance of the class. /// /// The value. public DateTimeDataPoint(DateTime value) : base(value) { } /// /// Performs an implicit conversion from to . /// /// The value. /// /// The result of the conversion. /// public static implicit operator DateTimeDataPoint(DateTime value) { return new DateTimeDataPoint(value); } /// /// Implements the operator -. /// /// a. /// The b. /// /// The result of the operator. /// public static DateTimeDataPoint operator -(DateTimeDataPoint a, DateTimeDataPoint b) { return new DateTimeDataPoint(new DateTime(a.Value.Ticks - b.Value.Ticks)); } /// /// Implements the operator +. /// /// a. /// The b. /// /// The result of the operator. /// public static DateTimeDataPoint operator +(DateTimeDataPoint a, DateTimeDataPoint b) { return new DateTimeDataPoint(new DateTime(a.Value.Ticks + b.Value.Ticks)); } /// /// Sums the value of this instance with another instance value and returns the result. /// /// The other instance. /// public override IGraphDataPoint Add(IGraphDataPoint other) { return new DateTimeDataPoint(new DateTime(this.Value.Ticks + (other as DateTimeDataPoint).Value.Ticks)); } /// /// Subtract the value of another instance from this instance and returns the result. /// /// The other instance. /// public override IGraphDataPoint Subtract(IGraphDataPoint other) { return new DateTimeDataPoint(new DateTime(this.Value.Ticks - (other as DateTimeDataPoint).Value.Ticks)); } /// /// Multiplies the value of this instance with another instance value and returns the result. /// /// The other instance. /// public override IGraphDataPoint Multiply(IGraphDataPoint other) { return new DateTimeDataPoint(new DateTime(this.Value.Ticks * (other as DateTimeDataPoint).Value.Ticks)); } /// /// Divides the value of this instance with another instance value and returns the result. /// /// The other instance. /// public override IGraphDataPoint Divide(IGraphDataPoint other) { return new DateTimeDataPoint(new DateTime(this.Value.Ticks / (other as DateTimeDataPoint).Value.Ticks)); } /// /// Returns the percentage value of this instance between the specified minimum and maximum values. /// /// The minimum. /// The maximum. /// public override double ComputeRelativePosition(IGraphDataPoint min, IGraphDataPoint max) { DateTime dMin = min as DateTimeDataPoint; DateTime dMax = max as DateTimeDataPoint; if (dMax.Ticks - dMin.Ticks == 0) //Prevent divide by zero { return dMin.Ticks; } var result = ((Value.Ticks - dMin.Ticks) * 100) / (dMax.Ticks - dMin.Ticks); return double.IsNaN(result) ? dMin.Ticks : result; } /// /// Returns the absolute value of the specified percentage value between the specified minimum and maximum values. /// /// The minimum. /// The maximum. /// The percentage. /// public override IGraphDataPoint ComputeAbsolutePosition(IGraphDataPoint min, IGraphDataPoint max, double percentage) { double minimum = ((DateTime)min.GetValue()).Ticks; double maximum = ((DateTime)max.GetValue()).Ticks; return new DateTimeDataPoint(new DateTime((long)(minimum + (maximum - minimum) * percentage))); } /// /// Creates a range of values from the specified minimum and maximum. /// /// The minimum. /// The maximum. /// The count. /// public override IEnumerable CreateRange(IGraphDataPoint min, IGraphDataPoint max, int count) { double minimum = ((DateTime)min.GetValue()).Ticks; double maximum = ((DateTime)max.GetValue()).Ticks; return Enumerable.Range(0, count). Select(i => minimum + (maximum - minimum) * ((double)i / (count - 1))). Select(x => new DateTimeDataPoint(new DateTime((long)x))); } /// /// Returns a formated string of this data point. /// /// The format. /// public override string ToString(string format) { return Value.ToString(format); } /// /// Parses the specified value and returns a new instance of data point. /// /// The value. /// public override IGraphDataPoint Parse(string value) { return new DateTimeDataPoint(DateTime.Parse(value)); } } }