Point.cs
上传用户:sex100000
上传日期:2013-11-09
资源大小:1377k
文件大小:12k
源码类别:

GIS编程

开发平台:

C#

  1. // Copyright 2005, 2006 - Morten Nielsen (www.iter.dk)
  2. //
  3. // This file is part of SharpMap.
  4. // SharpMap is free software; you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation; either version 2 of the License, or
  7. // (at your option) any later version.
  8. // 
  9. // SharpMap is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. // GNU Lesser General Public License for more details.
  13. // You should have received a copy of the GNU Lesser General Public License
  14. // along with SharpMap; if not, write to the Free Software
  15. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
  16. using System;
  17. using System.Collections.Generic;
  18. using System.Text;
  19. using System.Runtime.Serialization;
  20. using System.Runtime.InteropServices;
  21. namespace SharpMap.Geometries
  22. {
  23. /// <summary>
  24. /// A Point is a 0-dimensional geometry and represents a single location in 2D coordinate space. A Point has a x coordinate
  25. /// value and a y-coordinate value. The boundary of a Point is the empty set.
  26. /// </summary>
  27. [Serializable]
  28. public class Point : Geometry, IComparable<Point>
  29. {
  30. private double _X;
  31. private double _Y;
  32. private bool _IsEmpty = false;
  33. /// <summary>
  34. /// Sets whether this object is empty
  35. /// </summary>
  36. protected bool SetIsEmpty
  37. {
  38. set { _IsEmpty = value; }
  39. }
  40. /// <summary>
  41. /// Initializes a new Point
  42. /// </summary>
  43. /// <param name="x">X coordinate</param>
  44. /// <param name="y">Y coordinate</param>
  45. public Point(double x, double y)
  46. {
  47. _X = x; _Y = y;
  48. }
  49. /// <summary>
  50. /// Initializes a new empty Point
  51. /// </summary>
  52. public Point() : this(0, 0) { _IsEmpty = true; }
  53. /// <summary>
  54. /// Returns a point based on degrees, minutes and seconds notation.
  55. /// For western or southern coordinates, add minus '-' in front of all longitude and/or latitude values
  56. /// </summary>
  57. /// <param name="longDegrees">Longitude degrees</param>
  58. /// <param name="longMinutes">Longitude minutes</param>
  59. /// <param name="longSeconds">Longitude seconds</param>
  60. /// <param name="latDegrees">Latitude degrees</param>
  61. /// <param name="latMinutes">Latitude minutes</param>
  62. /// <param name="latSeconds">Latitude seconds</param>
  63. /// <returns>Point</returns>
  64. public static Point FromDMS(double longDegrees, double longMinutes, double longSeconds,
  65. double latDegrees, double latMinutes, double latSeconds)
  66. {
  67. return new Point(longDegrees + longMinutes / 60 + longSeconds / 3600,
  68. latDegrees + latMinutes / 60 + latSeconds / 3600);
  69. }
  70. /// <summary>
  71. /// Returns a 2D <see cref="Point"/> instance from this <see cref="Point3D"/>
  72. /// </summary>
  73. /// <returns><see cref="Point"/></returns>
  74. public Point AsPoint()
  75. {
  76. return new Point(_X, _Y);
  77. }
  78. /// <summary>
  79. /// Gets or sets the X coordinate of the point
  80. /// </summary>
  81. public double X
  82. {
  83. get
  84. {
  85. if (!_IsEmpty)
  86. return _X;
  87. else throw new ApplicationException("Point is empty");
  88. }
  89. set { _X = value; _IsEmpty = false; }
  90. }
  91. /// <summary>
  92. /// Gets or sets the Y coordinate of the point
  93. /// </summary>
  94. public double Y
  95. {
  96. get
  97. {
  98. if (!_IsEmpty)
  99. return _Y;
  100. else throw new ApplicationException("Point is empty");
  101. }
  102. set { _Y = value; _IsEmpty = false; }
  103. }
  104. /// <summary>
  105. /// Returns part of coordinate. Index 0 = X, Index 1 = Y
  106. /// </summary>
  107. /// <param name="index"></param>
  108. /// <returns></returns>
  109. public virtual double this[uint index]
  110. {
  111. get
  112. {
  113. if (_IsEmpty)
  114. throw new ApplicationException("Point is empty");
  115. else if (index == 0)
  116. return this.X;
  117. else if
  118. (index == 1)
  119. return this.Y;
  120. else
  121. throw (new System.Exception("Point index out of bounds"));
  122. }
  123. set
  124. {
  125. if (index == 0)
  126. this.X = value;
  127. else if (index == 1)
  128. this.Y = value;
  129. else
  130. throw (new System.Exception("Point index out of bounds"));
  131. _IsEmpty = false;
  132. }
  133. }
  134. /// <summary>
  135. /// Returns the number of ordinates for this point
  136. /// </summary>
  137. public virtual int NumOrdinates
  138. {
  139. get { return 2; }
  140. }
  141. /// <summary>
  142. /// Transforms the point to image coordinates, based on the map
  143. /// </summary>
  144. /// <param name="map">Map to base coordinates on</param>
  145. /// <returns>point in image coordinates</returns>
  146. public System.Drawing.PointF TransformToImage(Map map)
  147. {
  148. return SharpMap.Utilities.Transform.WorldtoMap(this, map);
  149. }
  150. #region Operators
  151. /// <summary>
  152. /// Vector + Vector
  153. /// </summary>
  154. /// <param name="v1">Vector</param>
  155. /// <param name="v2">Vector</param>
  156. /// <returns></returns>
  157. public static Point operator +(Point v1, Point v2)
  158. { return new Point(v1.X + v2.X, v1.Y + v2.Y); }
  159. /// <summary>
  160. /// Vector - Vector
  161. /// </summary>
  162. /// <param name="v1">Vector</param>
  163. /// <param name="v2">Vector</param>
  164. /// <returns>Cross product</returns>
  165. public static Point operator -(Point v1, Point v2)
  166. { return new Point(v1.X - v2.X, v1.Y - v2.Y); }
  167. /// <summary>
  168. /// Vector * Scalar
  169. /// </summary>
  170. /// <param name="m">Vector</param>
  171. /// <param name="d">Scalar (double)</param>
  172. /// <returns></returns>
  173. public static Point operator *(Point m, double d)
  174. { return new Point(m.X * d, m.Y * d); }
  175. #endregion
  176. #region "Inherited methods from abstract class Geometry"
  177. /// <summary>
  178. /// Checks whether this instance is spatially equal to the Point 'o'
  179. /// </summary>
  180. /// <param name="p">Point to compare to</param>
  181. /// <returns></returns>
  182. public virtual bool Equals(Point p)
  183. {
  184. return p != null && p.X == _X && p.Y == _Y && this._IsEmpty == p.IsEmpty();
  185. }
  186. /// <summary>
  187. /// Serves as a hash function for a particular type. <see cref="GetHashCode"/> is suitable for use 
  188. /// in hashing algorithms and data structures like a hash table.
  189. /// </summary>
  190. /// <returns>A hash code for the current <see cref="GetHashCode"/>.</returns>
  191. public override int GetHashCode()
  192. {
  193. return _X.GetHashCode() ^ _Y.GetHashCode() ^ _IsEmpty.GetHashCode();
  194. }
  195. /// <summary>
  196. ///  The inherent dimension of this Geometry object, which must be less than or equal to the coordinate dimension.
  197. /// </summary>
  198. public override int Dimension
  199. {
  200. get { return 0; }
  201. }
  202. /// <summary>
  203. /// If true, then this Geometry represents the empty point set,