ColorUtil.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. //---------------------------------------------------------------------------------
  2. // Written by Michael Hoffman
  3. // Find the full tutorial at: http://gamedev.tutsplus.com/series/vector-shooter-xna/
  4. //----------------------------------------------------------------------------------
  5. using System;
  6. using AtomicEngine;
  7. namespace AtomicBlaster
  8. {
  9. static class ColorUtil
  10. {
  11. public static Vector3 ColorToHSV(Color color)
  12. {
  13. Vector3 c = new Vector3(color.R, color.G, color.B);
  14. float v = Math.Max(c.X, Math.Max(c.Y, c.Z));
  15. float chroma = v - Math.Min(c.X, Math.Min(c.Y, c.Z));
  16. if (chroma == 0f)
  17. return new Vector3(0, 0, v);
  18. float s = chroma / v;
  19. if (c.X >= c.Y && c.Y >= c.Z)
  20. {
  21. float h = (c.Y - c.Z) / chroma;
  22. if (h < 0)
  23. h += 6;
  24. return new Vector3(h, s, v);
  25. }
  26. else if (c.Y >= c.Z && c.Y >= c.X)
  27. return new Vector3((c.Z - c.X) / chroma + 2, s, v);
  28. else
  29. return new Vector3((c.X - c.Y) / chroma + 4, s, v);
  30. }
  31. public static Color HSVToColor(Vector3 hsv)
  32. {
  33. return HSVToColor(hsv.X, hsv.Y, hsv.Z);
  34. }
  35. public static Color HSVToColor(float h, float s, float v)
  36. {
  37. if (h == 0 && s == 0)
  38. return new Color(v, v, v);
  39. float c = s * v;
  40. float x = c * (1 - Math.Abs(h % 2 - 1));
  41. float m = v - c;
  42. if (h < 1) return new Color(c + m, x + m, m);
  43. else if (h < 2) return new Color(x + m, c + m, m);
  44. else if (h < 3) return new Color(m, c + m, x + m);
  45. else if (h < 4) return new Color(m, x + m, c + m);
  46. else if (h < 5) return new Color(x + m, m, c + m);
  47. else return new Color(c + m, m, x + m);
  48. }
  49. }
  50. }