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

GIS编程

开发平台:

C#

  1. // Copyright 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.Drawing;
  20. using System.Drawing.Drawing2D;
  21. namespace SharpMap.Rendering.Thematics
  22. {
  23. /// <summary>
  24. /// Defines arrays of colors and positions used for interpolating color blending in a multicolor gradient.
  25. /// </summary>
  26. /// <seealso cref="SharpMap.Rendering.Thematics.GradientTheme"/>
  27. public class ColorBlend
  28. {
  29. private System.Drawing.Color[] _Colors;
  30. /// <summary>
  31. /// Gets or sets an array of colors that represents the colors to use at corresponding positions along a gradient.
  32. /// </summary>
  33. /// <value>An array of <see cref="System.Drawing.Color"/> structures that represents the colors to use at corresponding positions along a gradient.</value>
  34. /// <remarks>
  35. /// This property is an array of <see cref="System.Drawing.Color"/> structures that represents the colors to use at corresponding positions
  36. /// along a gradient. Along with the Positions property, this property defines a multicolor gradient.
  37. /// </remarks>
  38. public System.Drawing.Color[] Colors
  39. {
  40. get { return _Colors; }
  41. set { _Colors = value; }
  42. }
  43. private float[] _Positions;
  44. /// <summary>
  45. /// Gets or sets the positions along a gradient line.
  46. /// </summary>
  47. /// <value>An array of values that specify percentages of distance along the gradient line.</value>
  48. /// <remarks>
  49. /// <para>The elements of this array specify percentages of distance along the gradient line.
  50. /// For example, an element value of 0.2f specifies that this point is 20 percent of the total
  51. /// distance from the starting point. The elements in this array are represented by float
  52. /// values between 0.0f and 1.0f, and the first element of the array must be 0.0f and the
  53. /// last element must be 1.0f.</para>
  54. /// <pre>Along with the Colors property, this property defines a multicolor gradient.</pre>
  55. /// </remarks>
  56. public float[] Positions
  57. {
  58. get { return _Positions; }
  59. set { _Positions = value; }
  60. }
  61. internal ColorBlend() { }
  62. /// <summary>
  63. /// Initializes a new instance of the ColorBlend class.
  64. /// </summary>
  65. /// <param name="colors">An array of Color structures that represents the colors to use at corresponding positions along a gradient.</param>
  66. /// <param name="positions">An array of values that specify percentages of distance along the gradient line.</param>
  67. public ColorBlend(System.Drawing.Color[] colors, float[] positions)
  68. {
  69. _Colors = colors;
  70. _Positions = positions;
  71. }
  72. /// <summary>
  73. /// Gets the color from the scale at position 'pos'.
  74. /// </summary>
  75. /// <remarks>If the position is outside the scale [0..1] only the fractional part
  76. /// is used (in other words the scale restarts for each integer-part).</remarks>
  77. /// <param name="pos">Position on scale between 0.0f and 1.0f</param>
  78. /// <returns>Color on scale</returns>
  79. public System.Drawing.Color GetColor(float pos)
  80. {
  81. if (_Colors.Length != _Positions.Length)
  82. throw (new ArgumentException("Colors and Positions arrays must be of equal length"));
  83. if (_Colors.Length < 2)
  84. throw (new ArgumentException("At least two colors must be defined in the ColorBlend"));
  85. if (_Positions[0] != 0f)
  86. throw (new ArgumentException("First position value must be 0.0f"));
  87. if (_Positions[_Positions.Length - 1] != 1f)
  88. throw (new ArgumentException("Last position value must be 1.0f"));
  89. if (pos > 1 || pos < 0) pos -= (float)Math.Floor(pos);
  90. int i = 1;
  91. while (i < _Positions.Length && _Positions[i] < pos)
  92. i++;
  93. float frac = (pos - _Positions[i - 1]) / (_Positions[i] - _Positions[i - 1]);
  94. int R = (int)Math.Round((_Colors[i - 1].R * (1 - frac) + _Colors[i].R * frac));
  95. int G = (int)Math.Round((_Colors[i - 1].G * (1 - frac) + _Colors[i].G * frac));
  96. int B = (int)Math.Round((_Colors[i - 1].B * (1 - frac) + _Colors[i].B * frac));
  97. int A = (int)Math.Round((_Colors[i - 1].A * (1 - frac) + _Colors[i].A * frac));
  98. return Color.FromArgb(A, R, G, B);
  99. }
  100. /// <summary>
  101. /// Converts the color blend to a gradient brush
  102. /// </summary>
  103. /// <param name="rectangle"></param>
  104. /// <param name="angle"></param>
  105. /// <returns></returns>
  106. public System.Drawing.Drawing2D.LinearGradientBrush ToBrush(Rectangle rectangle, float angle)
  107. {
  108. LinearGradientBrush br = new LinearGradientBrush(rectangle, Color.Black, Color.Black, angle, true);
  109. System.Drawing.Drawing2D.ColorBlend cb = new System.Drawing.Drawing2D.ColorBlend();
  110. cb.Colors = _Colors;
  111. cb.Positions = _Positions;
  112. br.InterpolationColors = cb;
  113. return br;
  114. }
  115. #region Predefined color scales
  116. /// <summary>
  117. /// Gets a linear gradient scale with seven colours making a rainbow from red to violet.
  118. /// </summary>
  119. /// <remarks>
  120. /// Colors span the following with an interval of 1/6:
  121. /// { Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Blue, Color.Indigo, Color.Violet }
  122. /// </remarks>
  123. public static ColorBlend Rainbow7
  124. {
  125. get
  126. {
  127. ColorBlend cb = new ColorBlend();
  128. cb._Positions = new float[7];
  129. for (int i = 1; i < 7; i++)
  130. cb.Positions[i] = i / 6f;
  131. cb.Colors = new Color[] { Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Blue, Color.Indigo, Color.Violet };
  132. return cb;
  133. }
  134. }
  135. /// <summary>
  136. /// Gets a linear gradient scale with five colours making a rainbow from red to blue.
  137. /// </summary>
  138. /// <remarks>
  139. /// Colors span the following with an interval of 0.25:
  140. /// { Color.Red, Color.Yellow, Color.Green, Color.Cyan, Color.Blue }
  141. /// </remarks>
  142. public static ColorBlend Rainbow5
  143. {
  144. get
  145. {
  146. return new ColorBlend(
  147. new Color[] { Color.Red, Color.Yellow, Color.Green, Color.Cyan, Color.Blue },
  148. new float[] { 0f, 0.25f, 0.5f, 0.75f, 1f });
  149. }
  150. }
  151. /// <summary>
  152. /// Gets a linear gradient scale from black to white
  153. /// </summary>
  154. public static ColorBlend BlackToWhite
  155. {
  156. get
  157. {
  158. return new ColorBlend(new Color[] { Color.Black, Color.White }, new float[] { 0f, 1f });
  159. }
  160. }
  161. /// <summary>
  162. /// Gets a linear gradient scale from white to black
  163. /// </summary>
  164. public static ColorBlend WhiteToBlack
  165. {
  166. get
  167. {
  168. return new ColorBlend(new Color[] { Color.White, Color.Black }, new float[] { 0f, 1f });
  169. }
  170. }
  171. /// <summary>
  172. /// Gets a linear gradient scale from red to green
  173. /// </summary>
  174. public static ColorBlend RedToGreen
  175. {
  176. get
  177. {
  178. return new ColorBlend(new Color[] { Color.Red, Color.Green }, new float[] { 0f, 1f });
  179. }
  180. }
  181. /// <summary>
  182. /// Gets a linear gradient scale from green to red
  183. /// </summary>
  184. public static ColorBlend GreenToRed
  185. {
  186. get
  187. {
  188. return new ColorBlend(new Color[] { Color.Green, Color.Red }, new float[] { 0f, 1f });
  189. }
  190. }
  191. /// <summary>
  192. /// Gets a linear gradient scale from blue to green
  193. /// </summary>
  194. public static ColorBlend BlueToGreen
  195. {
  196. get
  197. {
  198. return new ColorBlend(new Color[] { Color.Blue, Color.Green }, new float[] { 0f, 1f });
  199. }
  200. }
  201. /// <summary>
  202. /// Gets a linear gradient scale from green to blue
  203. /// </summary>
  204. public static ColorBlend GreenToBlue
  205. {
  206. get
  207. {
  208. return new ColorBlend(new Color[] { Color.Green, Color.Blue }, new float[] { 0f, 1f });
  209. }
  210. }
  211. /// <summary>
  212. /// Gets a linear gradient scale from red to blue
  213. /// </summary>
  214. public static ColorBlend RedToBlue
  215. {
  216. get
  217. {
  218. return new ColorBlend(new Color[] { Color.Red, Color.Blue }, new float[] { 0f, 1f });
  219. }
  220. }
  221. /// <summary>
  222. /// Gets a linear gradient scale from blue to red
  223. /// </summary>
  224. public static ColorBlend BlueToRed
  225. {
  226. get
  227. {
  228. return new ColorBlend(new Color[] { Color.Blue, Color.Red }, new float[] { 0f, 1f });
  229. }
  230. }
  231. #endregion
  232. #region Constructor helpers
  233. /// <summary>
  234. /// Creates a linear gradient scale from two colors
  235. /// </summary>
  236. /// <param name="fromColor"></param>
  237. /// <param name="toColor"></param>
  238. /// <returns></returns>
  239. public static ColorBlend TwoColors(System.Drawing.Color fromColor, System.Drawing.Color toColor)
  240. {
  241. return new ColorBlend(new Color[] { fromColor, toColor }, new float[] { 0f, 1f });
  242. }
  243. /// <summary>
  244. /// Creates a linear gradient scale from three colors
  245. /// </summary>
  246. public static ColorBlend ThreeColors(System.Drawing.Color fromColor, System.Drawing.Color middleColor, System.Drawing.Color toColor)
  247. {
  248. return new ColorBlend(new Color[] { fromColor, middleColor, toColor }, new float[] { 0f, 0.5f, 1f });
  249. }
  250. #endregion
  251. }
  252. }