2 * Karinto Library Project
\r
4 * This software is distributed under a zlib-style license.
\r
5 * See license.txt for more information.
\r
9 using System.Collections.Generic;
\r
14 public class PointList : List<Point>, ICloneable
\r
22 get { return this[0]; }
\r
30 get { return this[this.Count - 1]; }
\r
36 public double[] XArray
\r
40 double[] array = new double[this.Count];
\r
41 for (int i = 0; i < this.Count; ++i) { array[i] = this[i].X; }
\r
46 if (value.Length != this.Count)
\r
48 throw new ArgumentException("The input array is too short or long.");
\r
50 for (int i = 0; i < value.Length; ++i) { this[i].X = value[i]; }
\r
57 public double[] YArray
\r
61 double[] array = new double[this.Count];
\r
62 for (int i = 0; i < this.Count; ++i) { array[i] = this[i].Y; }
\r
67 if (value.Length != this.Count)
\r
69 throw new ArgumentException("The input array is too short or long.");
\r
71 for (int i = 0; i < value.Length; ++i) { this[i].Y = value[i]; }
\r
82 double min = XArray[0];
\r
83 foreach (Point p in this) { if (min > p.X) min = p.X; }
\r
95 double max = XArray[0];
\r
96 foreach (Point p in this) { if (max < p.X) max = p.X; }
\r
108 double min = YArray[0];
\r
109 foreach (Point p in this) { if (min > p.Y) min = p.Y; }
\r
121 double max = YArray[0];
\r
122 foreach (Point p in this) { if (max < p.Y) max = p.Y; }
\r
130 public double XAverage
\r
135 foreach (Point p in this) { sum += p.X; }
\r
136 return sum / this.Count;
\r
143 public double YAverage
\r
148 foreach (Point p in this) { sum += p.Y; }
\r
149 return sum / this.Count;
\r
156 public double XVariance
\r
160 double avg = this.XAverage;
\r
162 foreach (Point d in this)
\r
164 double dif = (d.X - avg);
\r
167 return var / this.Count;
\r
174 public double YVariance
\r
178 double avg = this.YAverage;
\r
180 foreach (Point d in this)
\r
182 double dif = (d.Y - avg);
\r
185 return var / this.Count;
\r
192 public double Covariance
\r
196 double avgX = this.XAverage;
\r
197 double avgY = this.YAverage;
\r
199 foreach (Point d in this)
\r
201 var += (d.X - avgX) * (d.Y - avgY);
\r
203 return var / this.Count;
\r
214 double cov = Covariance;
\r
215 double var = XVariance * YVariance;
\r
217 if (Math.Abs(cov) < Double.Epsilon && Math.Abs(var) < Double.Epsilon)
\r
219 return 1.0; // とりあえず実質1点のみの場合は1 数学的には不定の方が正しい?
\r
221 return cov * cov / var;
\r
228 public Range XRange
\r
232 return new Range(XMin, XMax);
\r
239 public Range YRange
\r
243 return new Range(YMin, YMax);
\r
250 public bool MonotonicallyIncreasing
\r
254 PointList sorted = (PointList)Clone();
\r
256 double yPrev = sorted.First.Y;
\r
257 for (int i = 1; i < Count; ++i)
\r
259 double yCur = this[i].Y;
\r
260 if (yCur < yPrev) return false;
\r
270 public bool MonotonicallyDecreasing
\r
274 PointList sorted = (PointList)Clone();
\r
276 double yPrev = sorted.First.Y;
\r
277 for (int i = 1; i < Count; ++i)
\r
279 double yCur = this[i].Y;
\r
280 if (yCur > yPrev) return false;
\r
288 #region constructors
\r
290 public PointList() : base() { }
\r
292 public PointList(PointList points)
\r
293 : base(points.Count)
\r
295 foreach (Point p in points) { this.Add(new Point(p)); }
\r
298 public PointList(Point[] points)
\r
299 : base(points.Length)
\r
301 foreach (Point p in points) { this.Add(new Point(p)); }
\r
304 public PointList(double[] xArray, double[] yArray)
\r
305 : base(xArray.Length)
\r
307 if (xArray.Length != yArray.Length)
\r
309 throw new ArgumentException("xArray and yArray must be same length");
\r
311 for (int i = 0; i < xArray.Length; ++i)
\r
313 this.Add(xArray[i], yArray[i]);
\r
317 public PointList(FilePath path)
\r
319 CsvReader<Point> reader = new CsvReader<Point>();
\r
320 List<Point> points = reader.Read(path);
\r
321 foreach (Point p in points) { this.Add(new Point(p)); }
\r
325 #region public methods
\r
329 /// <param name="x">点のx値</param>
\r
330 /// <param name="y">点のy値</param>
\r
331 public void Add(double x, double y)
\r
333 this.Add(new Point(x, y));
\r
336 public Object Clone()
\r
338 return (Object)new PointList(this);
\r
344 public void SortByX()
\r
346 Sort(Point.XComparer);
\r
352 public void SortByY()
\r
354 Sort(Point.YComparer);
\r
360 /// <param name="scale">x,yそれぞれに掛ける係数からなる点</param>
\r
361 public void Stretch(Point scale)
\r
363 for (int i = 0; i < Count; ++i)
\r
365 this[i] = this[i].Stretch(scale);
\r
369 public void SwapXY()
\r
371 for (int i = 0; i < Count; ++i)
\r
377 public DataTable ToDataTable()
\r
379 DataTable table = new Xml.Data.PointListDataTable();
\r
380 for (int i = 0; i < Count; ++i)
\r
382 Xml.Data.PointListRow row = table.NewRow() as Xml.Data.PointListRow;
\r
385 table.Rows.Add(row);
\r