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

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 Point3D is a 0-dimensional geometry and represents a single location in 3D coordinate space. A Point3D has a x coordinate
  25. /// value, a y-coordinate value and a z-coordinate value. The boundary of a Point3D is the empty set.
  26.     /// </summary>
  27.     [Serializable]
  28. public class Point3D : Point
  29.     {
  30.         private double _Z;
  31. /// <summary>
  32. /// Initializes a new Point
  33. /// </summary>
  34. /// <param name="x">X coordinate</param>
  35. /// <param name="y">Y coordinate</param>
  36. /// <param name="z">Z coordinate</param>
  37.         public Point3D(double x, double y, double z) : base(x,y)
  38.         {
  39.             _Z = z;
  40.         }
  41. /// <summary>
  42. /// Initializes a new Point
  43. /// </summary>
  44. /// <param name="p">2D Point</param>
  45. /// <param name="z">Z coordinate</param>
  46. public Point3D(Point p, double z)
  47. : base(p.X, p.Y)
  48. {
  49. _Z = z;
  50. }
  51. /// <summary>
  52. /// Initializes a new Point at (0,0)
  53. /// </summary>
  54. public Point3D() : this(0, 0, 0) { this.SetIsEmpty = true; }
  55. /// <summary>
  56. /// Gets or sets the Z coordinate of the point
  57. /// </summary>
  58. public double Z
  59.         {
  60. get
  61. {
  62. if (!this.IsEmpty())
  63. return _Z;
  64. else throw new ApplicationException("Point is empty");
  65. }
  66.             set { _Z = value; this.SetIsEmpty=false; }
  67.         }
  68. /// <summary>
  69. /// Returns part of coordinate. Index 0 = X, Index 1 = Y, , Index 2 = Z
  70. /// </summary>
  71. /// <param name="index"></param>
  72. /// <returns></returns>
  73. public override double this[uint index]
  74. {
  75. get
  76. {
  77. if (index == 2)
  78. {
  79. if(this.IsEmpty())
  80. throw new ApplicationException("Point is empty");
  81. return this.Z;
  82. }
  83. else 
  84. return base[index];
  85. }
  86. set
  87. {
  88. if (index == 2)
  89. {
  90. this.Z = value;
  91. this.SetIsEmpty = false;
  92. }
  93. else base[index] = value;
  94. }
  95. }
  96. /// <summary>
  97. /// Returns the number of ordinates for this point
  98. /// </summary>
  99. public override int NumOrdinates
  100. {
  101. get { return 3; }
  102. }
  103. #region Operators
  104. /// <summary>
  105. /// Vector + Vector
  106. /// </summary>
  107. /// <param name="v1">Vector</param>
  108. /// <param name="v2">Vector</param>
  109. /// <returns></returns>
  110. public static Point3D operator +(Point3D v1, Point3D v2)
  111. { return new Point3D(v1.X + v2.X, v1.Y + v2.Y, v1.Z+v2.Z); }
  112. /// <summary>
  113. /// Vector - Vector
  114. /// </summary>
  115. /// <param name="v1">Vector</param>
  116. /// <param name="v2">Vector</param>
  117. /// <returns>Cross product</returns>
  118. public static Point3D operator -(Point3D v1, Point3D v2)
  119. { return new Point3D(v1.X - v2.X, v1.Y - v2.Y, v1.Z - v2.Z); }
  120. /// <summary>
  121. /// Vector * Scalar
  122. /// </summary>
  123. /// <param name="m">Vector</param>
  124. /// <param name="d">Scalar (double)</param>
  125. /// <returns></returns>
  126. public static Point3D operator *(Point3D m, double d)
  127. { return new Point3D(m.X * d, m.Y * d, m.Z * d); }
  128. #endregion
  129.         #region "Inherited methods from abstract class Geometry"
  130. /// <summary>
  131. /// Checks whether this instance is spatially equal to the Point 'o'
  132. /// </summary>
  133. /// <param name="p">Point to compare to</param>
  134. /// <returns></returns>
  135. public bool Equals(Point3D p)
  136. {
  137. return base.Equals(p) && p.Z == _Z;
  138. }
  139. /// <summary>
  140. /// Serves as a hash function for a particular type. <see cref="GetHashCode"/> is suitable for use 
  141. /// in hashing algorithms and data structures like a hash table.
  142. /// </summary>
  143. /// <returns>A hash code for the current <see cref="GetHashCode"/>.</returns>
  144. public override int GetHashCode()
  145. {
  146. return base.GetHashCode() ^ _Z.GetHashCode();
  147. }
  148. /// <summary>
  149. /// Returns the distance between this geometry instance and another geometry, as
  150. /// measured in the spatial reference system of this instance.
  151. /// </summary>
  152. /// <param name="geom"></param>
  153. /// <returns></returns>
  154.         public override double Distance(Geometry geom)
  155.         {
  156. if (geom.GetType() == typeof(SharpMap.Geometries.Point3D))
  157. {
  158. Point3D p = geom as Point3D;
  159. return Math.Sqrt(Math.Pow(this.X - p.X, 2) + Math.Pow(this.Y - p.Y, 2) + Math.Pow(this.Z - p.Z, 2));
  160. }
  161. else
  162. return base.Distance(geom);
  163.         }
  164. #endregion
  165. /// <summary>
  166. /// This method must be overridden using 'public new [derived_data_type] Clone()'
  167. /// </summary>
  168. /// <returns>Clone</returns>
  169. public new Point3D Clone()
  170. {
  171. return new Point3D(this.X, this.Y, this.Z);
  172. }
  173. #region IEqualityComparer<Point3D> Members
  174. /// <summary>
  175. /// Checks whether the two points are spatially equal
  176. /// </summary>
  177. /// <param name="p1">Point 1</param>
  178. /// <param name="p2">Point 2</param>
  179. /// <returns>true if the points a spatially equal</returns>
  180. public bool Equals(Point3D p1, Point3D p2)
  181. {
  182. return (p1.X==p2.X && p1.Y==p2.Y && p1.Z==p2.Z);
  183. }
  184. #endregion
  185. #region IComparable<Point> Members
  186. /// <summary>
  187. /// Comparator used for ordering point first by ascending X, then by ascending Y and then by ascending Z.
  188. /// </summary>
  189. /// <param name="other"></param>
  190. /// <returns></returns>
  191. public virtual int CompareTo(Point3D other)
  192. {
  193. if (this.X < other.X || this.X == other.X && this.Y < other.Y || this.X == other.X && this.Y == other.Y && this.Z < other.Z)
  194. return -1;
  195. else if (this.X > other.X || this.X == other.X && this.Y > other.Y || this.X == other.X && this.Y == other.Y && this.Z > other.Z)
  196. return 1;
  197. else// (this.X == other.X && this.Y == other.Y && this.Z == other.Z)
  198. return 0;
  199. }
  200. #endregion
  201. }
  202. }