ColorUtil.cs 2.0 KB

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