root/plot/Pybrary.Plot/Data/MultipointCollection.cs

Revision 746, 4.0 kB (checked in by mfenniak, 2 years ago)

--

Line 
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace Pybrary.Plot.Data
6 {
7     public class MultipointCollection : EventObject
8     {
9         private double[] x = new double[0];
10         private double?[][] y = new double?[0][];
11
12         private double? minX_gt_zero;
13         private double? minX;
14         private double? maxX;
15
16         private bool setFromDateTime = false;
17         private bool setFromTimeSpan = false;
18         private bool setFromNumber = false;
19
20         private void setFromObject(object[] x, IList<double?>[] y, ObjectToDoubleConverter converter)
21         {
22             foreach (List<double?> yv in y)
23                 if (x.Length != yv.Count)
24                     throw new ArgumentException("y array must have same length as x array", "y");
25
26             this.x = new double[x.Length];
27             this.y = new double?[x.Length][];
28             for (int i = 0; i < x.Length; i++)
29                 this.y[i] = new double?[y.Length];
30
31             minX_gt_zero = minX = maxX = null;
32
33             for (int i = 0; i < x.Length; i++)
34             {
35                 double xv = converter(x[i]);
36                 this.x[i] = xv;
37
38                 if (xv > 0 && (minX_gt_zero == null || xv < minX_gt_zero.Value))
39                     minX_gt_zero = xv;
40                 if (minX == null || xv < minX.Value)
41                     minX = xv;
42                 if (maxX == null || xv > maxX.Value)
43                     maxX = xv;
44
45                 for (int j = 0; j < y.Length; j++)
46                     this.y[i][j] = y[j][i];
47             }
48
49             raiseEvent();
50         }
51
52         public void Set(double[] x, IList<double?>[] y)
53         {
54             setFromDateTime = setFromTimeSpan = false;
55             setFromNumber = true;
56             object[] xnew = new object[x.Length];
57             x.CopyTo(xnew, 0);
58             setFromObject(xnew, y, delegate(object a) { return (double)a; });
59         }
60
61         public void Set(DateTime[] x, IList<double?>[] y)
62         {
63             setFromNumber = setFromTimeSpan = false;
64             setFromDateTime = true;
65             object[] xnew = new object[x.Length];
66             x.CopyTo(xnew, 0);
67             setFromObject(xnew, y, delegate(object a) { return ((DateTime)a).ToOADate(); });
68         }
69
70         public void Set(TimeSpan[] x, IList<double?>[] y)
71         {
72             setFromNumber = setFromDateTime = false;
73             setFromTimeSpan = true;
74             object[] xnew = new object[x.Length];
75             x.CopyTo(xnew, 0);
76             setFromObject(xnew, y, delegate(object a) { return ((TimeSpan)a).Ticks / TimeSpan.TicksPerDay; });
77         }
78
79         public void Clear()
80         {
81             minX_gt_zero = minX = maxX = null;
82             this.x = new double[0];
83             this.y = new double?[0][];
84             raiseEvent();
85         }
86
87         public double GetX(int idx)
88         {
89             return x[idx];
90         }
91
92         public double?[] GetY(int idx)
93         {
94             return y[idx];
95         }
96
97         public bool IsSetFromDateTime
98         {
99             get
100             {
101                 return setFromDateTime;
102             }
103         }
104
105         public bool IsSetFromTimeSpan
106         {
107             get
108             {
109                 return setFromTimeSpan;
110             }
111         }
112
113         public bool IsSetFromNumber
114         {
115             get
116             {
117                 return setFromNumber;
118             }
119         }
120
121         public int Count
122         {
123             get
124             {
125                 return x.Length;
126             }
127         }
128
129         public double? MinX_gt_Zero
130         {
131             get
132             {
133                 return minX_gt_zero;
134             }
135         }
136
137         public double? MinX
138         {
139             get
140             {
141                 return minX;
142             }
143         }
144
145         public double? MaxX
146         {
147             get
148             {
149                 return maxX;
150             }
151         }
152     }
153 }
Note: See TracBrowser for help on using the browser.