//============================================================================ //RadarPointList Class //Copyright ?2006 John Champion, 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.Drawing; using System.Collections.Generic; namespace DrawGraph { /// /// A class containing a set of data values to be plotted as a RadarPlot. /// This class will effectively convert the data into objects /// by converting the polar coordinates to rectangular coordinates /// /// /// /// /// /// Jerry Vos and John Champion /// $Revision: 3.5 $ $Date: 2007/04/16 00:03:02 $ [Serializable] public class RadarPointList : List, IPointList, IPointListEdit { #region Fields /// /// Default to clockwise rotation as this is the standard for radar charts /// private bool _clockwise = true; /// /// Default to 90 degree rotation so main axis is in the 12 o'clock position, /// which is the standard for radar charts. /// private double _rotation = 90; #endregion #region Properties /// /// Indexer to access the specified object by /// its ordinal position in the list. This method does the calculations /// to convert the data from polar to rectangular coordinates. /// /// The ordinal position (zero-based) of the /// object to be accessed. /// A object reference. public new PointPair this[int index] { get { int count = this.Count; // The last point is a repeat of the first point if ( index == count - 1 ) index = 0; if ( index < 0 || index >= count ) return null; PointPair pt = (PointPair)base[index]; // double theta = (double) index / (double) count * 2.0 * Math.PI; double rotationRadians = _rotation * Math.PI / 180; double theta = rotationRadians + ( _clockwise ? -1.0d : 1.0d ) * ( (double) index / (double) (count-1) * 2.0 * Math.PI); double x = pt.Y * Math.Cos( theta ); double y = pt.Y * Math.Sin( theta ); return new PointPair( x, y, pt.Z, (string) pt.Tag ); } set { int count = this.Count; // The last point is a repeat of the first point if ( index == count - 1 ) index = 0; if ( index < 0 || index >= count ) return; PointPair pt = (PointPair)base[index]; pt.Y = Math.Sqrt( value.X * value.X + value.Y * value.Y ); } } /// /// Indicates if points should be added in clockwise or counter-clockwise order /// public bool Clockwise { get { return _clockwise; } set { _clockwise = value; } } /// /// Sets the angular rotation (starting angle) for the initial axis /// public double Rotation { get { return _rotation; } set { _rotation = value; } } /// /// Get the raw data /// /// /// private PointPair GetAt( int index ) { return base[index]; } /// /// gets the number of points available in the list /// public new int Count { get { return base.Count + 1; } } #endregion #region Constructors /// /// Default Constructor /// public RadarPointList() : base() { } /// /// Copy Constructor /// public RadarPointList( RadarPointList rhs ) { for ( int i = 0; i < rhs.Count; i++ ) this.Add( rhs.GetAt(i) ); } /// /// 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 RadarPointList Clone() { return new RadarPointList( this ); } #endregion #region Methods /* * /// /// Add the specified PointPair to the collection. /// /// The PointPair to be added /// The ordinal position in the list where the point was added public int Add( PointPair pt ) { return List.Add( pt ); } /// /// Add a single point to the from a value of type double. /// /// The radial coordinate value /// The zero-based ordinal index where the point was added in the list. /// public int Add( double r ) { return List.Add( new PointPair( PointPair.Missing, r ) ); } */ /// /// Add a single point to the from two values of type double. /// /// The radial coordinate value /// The 'Z' coordinate value, which is not normally used for plotting, /// but can be used for type fills /// The zero-based ordinal index where the point was added in the list. public void Add( double r, double z ) { Add( new PointPair( PointPair.Missing, r, z ) ); } #endregion } }