Label.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. namespace SharpMap.Rendering
  20. {
  21. /// <summary>
  22. /// Defines an axis-aligned box around a label, used for collision detection
  23. /// </summary>
  24. public class LabelBox : IComparable<LabelBox>
  25. {
  26. /// <summary>
  27. /// Initializes a new LabelBox instance
  28. /// </summary>
  29. /// <param name="left">Left side of box</param>
  30. /// <param name="top">Top of box</param>
  31. /// <param name="width">Width of the box</param>
  32. /// <param name="height">Height of the box</param>
  33. public LabelBox(float left, float top, float width, float height)
  34. {
  35. _left = left;
  36. _top = top;
  37. _width = width;
  38. _height = height;
  39. }
  40. /// <summary>
  41. /// Initializes a new LabelBox instance based on a rectangle
  42. /// </summary>
  43. /// <param name="rectangle"></param>
  44. public LabelBox(System.Drawing.RectangleF rectangle)
  45. {
  46. _left = rectangle.X;
  47. _top = rectangle.Y;
  48. _width = rectangle.Width;
  49. _height = rectangle.Height;
  50. }
  51. private float _left;
  52. /// <summary>
  53. /// The Left tie-point for the Label
  54. /// </summary>
  55. public float Left
  56. {
  57. get { return _left; }
  58. set { _left = value; }
  59. }
  60. private float _top;
  61. /// <summary>
  62. /// The Top tie-point for the label
  63. /// </summary>
  64. public float Top
  65. {
  66. get { return _top; }
  67. set { _top = value; }
  68. }
  69. private float _width;
  70. /// <summary>
  71. /// Width of the box
  72. /// </summary>
  73. public float Width
  74. {
  75. get { return _width; }
  76. set { _width = value; }
  77. }
  78. private float _height;
  79. /// <summary>
  80. /// Height of the box
  81. /// </summary>
  82. public float Height
  83. {
  84. get { return _height; }
  85. set { _height = value; }
  86. }
  87. /// <summary>
  88. /// Right side of the box
  89. /// </summary>
  90. public float Right
  91. {
  92. get { return _left + _width; }
  93. }
  94. /// <summary>
  95. /// Bottom of th ebox
  96. /// </summary>
  97. public float Bottom
  98. {
  99. get { return _top - _height; }
  100. }
  101. /// <summary>
  102. /// Determines whether the boundingbox intersects another boundingbox
  103. /// </summary>
  104. /// <param name="box"></param>
  105. /// <returns></returns>
  106. public bool Intersects(LabelBox box)
  107. {
  108. return !(box.Left > this.Left+this.Width ||
  109.  box.Left+box.Width < this.Left ||
  110.  box.Top-box.Height > this.Top ||
  111.  box.Top < this.Top-this.Height);
  112. }
  113. #region IComparable<LabelBox> Members
  114. /// <summary>
  115. /// Returns 0 if the boxes intersects each other
  116. /// </summary>
  117. /// <param name="other">labelbox to perform intersectiontest with</param>
  118. /// <returns>0 if the intersect</returns>
  119. public int CompareTo(LabelBox other)
  120. {
  121. if (this.Intersects(other))
  122. return 0;
  123. else if (other.Left > this.Left+this.Width ||
  124. other.Top - other.Height > this.Top)
  125. return 1;
  126. else
  127. return -1;
  128. }
  129. #endregion
  130. }
  131. /// <summary>
  132. /// Class for storing a label instance
  133. /// </summary>
  134. public class Label : IComparable<Label>, IComparer<Label>
  135. {
  136. /// <summary>
  137. /// Initializes a new Label instance
  138. /// </summary>
  139. /// <param name="text">Text to write</param>
  140. /// <param name="labelpoint">Position of label</param>
  141. /// <param name="rotation">Rotation</param>
  142. /// <param name="priority">Label priority used for collision detection</param>
  143. /// <param name="collisionbox">Box around label for collision detection</param>
  144. /// <param name="style">The style of the label</param>
  145. public Label(string text, System.Drawing.PointF labelpoint, float rotation, int priority, LabelBox collisionbox, SharpMap.Styles.LabelStyle style)
  146. {
  147. _Text = text;
  148. _LabelPoint = labelpoint;
  149. _Rotation = rotation;
  150. _Priority = priority;
  151. _box = collisionbox;
  152. _Style = style;
  153. }
  154. private string _Text;
  155. /// <summary>
  156. /// The text of the label
  157. /// </summary>
  158. public string Text
  159. {
  160. get { return _Text; }
  161. set { _Text = value; }
  162. }
  163. private System.Drawing.PointF _LabelPoint;
  164. /// <summary>
  165. /// Label position
  166. /// </summary>
  167. public System.Drawing.PointF LabelPoint
  168. {
  169. get { return _LabelPoint; }
  170. set { _LabelPoint = value; }
  171. }
  172. private System.Drawing.Font _Font;
  173. /// <summary>
  174. /// Label font
  175. /// </summary>
  176. public System.Drawing.Font Font
  177. {
  178. get { return _Font; }
  179. set { _Font = value; }
  180. }
  181. private float _Rotation;
  182. /// <summary>
  183. /// Label rotation
  184. /// </summary>
  185. public float Rotation
  186. {
  187. get { return _Rotation; }
  188. set { _Rotation = value; }
  189. }
  190. private int _Priority;
  191. /// <summary>
  192. /// Text rotation in radians
  193. /// </summary>
  194. public int Priority
  195. {
  196. get { return _Priority; }
  197. set { _Priority = value; }
  198. }
  199. private LabelBox _box;
  200. /// <summary>
  201. /// Label box
  202. /// </summary>
  203. public LabelBox Box
  204. {
  205. get { return _box; }
  206. set { _box = value; }
  207. }
  208. private SharpMap.Styles.LabelStyle _Style;
  209. /// <summary>
  210. /// Gets or sets the <see cref="SharpMap.Styles.LabelStyle"/> of this label
  211. /// </summary>
  212. public SharpMap.Styles.LabelStyle Style
  213. {
  214. get { return _Style; }
  215. set { _Style = value; }
  216. }
  217. #region IComparable<Label> Members
  218. /// <summary>
  219. /// Tests if two label boxes intersects
  220. /// </summary>
  221. /// <param name="other"></param>
  222. /// <returns></returns>
  223. public int CompareTo(Label other)
  224. {
  225. if (this == other)
  226. return 0;
  227. else if (_box == null)
  228. return -1;
  229. else if (other.Box == null)
  230. return 1;
  231. else
  232. return _box.CompareTo(other.Box);
  233. }
  234. #endregion
  235. #region IComparer<Label> Members
  236. /// <summary>
  237. /// Checks if two labels intersect
  238. /// </summary>
  239. /// <param name="x"></param>
  240. /// <param name="y"></param>
  241. /// <returns></returns>
  242. public int Compare(Label x, Label y)
  243. {
  244. return x.CompareTo(y);
  245. }
  246. #endregion
  247. }
  248. }