2532
Dependencies: QEI WS2812 PixelArray DFPlayerMini MODSERIAL PCA9685_ pca9685
rgbhsv.h@6:4b007c7f0b7a, 2019-06-26 (annotated)
- Committer:
- dimavb
- Date:
- Wed Jun 26 18:06:30 2019 +0000
- Revision:
- 6:4b007c7f0b7a
- Parent:
- 2:ed1f45f9b06a
activation trigger
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dimavb | 2:ed1f45f9b06a | 1 | typedef struct { |
dimavb | 2:ed1f45f9b06a | 2 | double r; // a fraction between 0 and 1 |
dimavb | 2:ed1f45f9b06a | 3 | double g; // a fraction between 0 and 1 |
dimavb | 2:ed1f45f9b06a | 4 | double b; // a fraction between 0 and 1 |
dimavb | 2:ed1f45f9b06a | 5 | } rgb; |
dimavb | 2:ed1f45f9b06a | 6 | |
dimavb | 2:ed1f45f9b06a | 7 | typedef struct { |
dimavb | 2:ed1f45f9b06a | 8 | double h; // angle in degrees |
dimavb | 2:ed1f45f9b06a | 9 | double s; // a fraction between 0 and 1 |
dimavb | 2:ed1f45f9b06a | 10 | double v; // a fraction between 0 and 1 |
dimavb | 2:ed1f45f9b06a | 11 | } hsv; |
dimavb | 2:ed1f45f9b06a | 12 | |
dimavb | 2:ed1f45f9b06a | 13 | hsv rgb2hsv(rgb in); |
dimavb | 2:ed1f45f9b06a | 14 | rgb hsv2rgb(hsv in); |
dimavb | 2:ed1f45f9b06a | 15 | |
dimavb | 2:ed1f45f9b06a | 16 | hsv rgb2hsv(rgb in) |
dimavb | 2:ed1f45f9b06a | 17 | { |
dimavb | 2:ed1f45f9b06a | 18 | hsv out; |
dimavb | 2:ed1f45f9b06a | 19 | double min, max, delta; |
dimavb | 2:ed1f45f9b06a | 20 | |
dimavb | 2:ed1f45f9b06a | 21 | min = in.r < in.g ? in.r : in.g; |
dimavb | 2:ed1f45f9b06a | 22 | min = min < in.b ? min : in.b; |
dimavb | 2:ed1f45f9b06a | 23 | |
dimavb | 2:ed1f45f9b06a | 24 | max = in.r > in.g ? in.r : in.g; |
dimavb | 2:ed1f45f9b06a | 25 | max = max > in.b ? max : in.b; |
dimavb | 2:ed1f45f9b06a | 26 | |
dimavb | 2:ed1f45f9b06a | 27 | out.v = max; // v |
dimavb | 2:ed1f45f9b06a | 28 | delta = max - min; |
dimavb | 2:ed1f45f9b06a | 29 | if (delta < 0.00001) |
dimavb | 2:ed1f45f9b06a | 30 | { |
dimavb | 2:ed1f45f9b06a | 31 | out.s = 0; |
dimavb | 2:ed1f45f9b06a | 32 | out.h = 0; // undefined, maybe nan? |
dimavb | 2:ed1f45f9b06a | 33 | return out; |
dimavb | 2:ed1f45f9b06a | 34 | } |
dimavb | 2:ed1f45f9b06a | 35 | if( max > 0.0 ) { // NOTE: if Max is == 0, this divide would cause a crash |
dimavb | 2:ed1f45f9b06a | 36 | out.s = (delta / max); // s |
dimavb | 2:ed1f45f9b06a | 37 | } else { |
dimavb | 2:ed1f45f9b06a | 38 | // if max is 0, then r = g = b = 0 |
dimavb | 2:ed1f45f9b06a | 39 | // s = 0, h is undefined |
dimavb | 2:ed1f45f9b06a | 40 | out.s = 0.0; |
dimavb | 2:ed1f45f9b06a | 41 | out.h = NAN; // its now undefined |
dimavb | 2:ed1f45f9b06a | 42 | return out; |
dimavb | 2:ed1f45f9b06a | 43 | } |
dimavb | 2:ed1f45f9b06a | 44 | if( in.r >= max ) // > is bogus, just keeps compilor happy |
dimavb | 2:ed1f45f9b06a | 45 | out.h = ( in.g - in.b ) / delta; // between yellow & magenta |
dimavb | 2:ed1f45f9b06a | 46 | else |
dimavb | 2:ed1f45f9b06a | 47 | if( in.g >= max ) |
dimavb | 2:ed1f45f9b06a | 48 | out.h = 2.0 + ( in.b - in.r ) / delta; // between cyan & yellow |
dimavb | 2:ed1f45f9b06a | 49 | else |
dimavb | 2:ed1f45f9b06a | 50 | out.h = 4.0 + ( in.r - in.g ) / delta; // between magenta & cyan |
dimavb | 2:ed1f45f9b06a | 51 | |
dimavb | 2:ed1f45f9b06a | 52 | out.h *= 60.0; // degrees |
dimavb | 2:ed1f45f9b06a | 53 | |
dimavb | 2:ed1f45f9b06a | 54 | if( out.h < 0.0 ) |
dimavb | 2:ed1f45f9b06a | 55 | out.h += 360.0; |
dimavb | 2:ed1f45f9b06a | 56 | |
dimavb | 2:ed1f45f9b06a | 57 | return out; |
dimavb | 2:ed1f45f9b06a | 58 | } |
dimavb | 2:ed1f45f9b06a | 59 | |
dimavb | 2:ed1f45f9b06a | 60 | |
dimavb | 2:ed1f45f9b06a | 61 | rgb hsv2rgb(hsv in) |
dimavb | 2:ed1f45f9b06a | 62 | { |
dimavb | 2:ed1f45f9b06a | 63 | double hh, p, q, t, ff; |
dimavb | 2:ed1f45f9b06a | 64 | long i; |
dimavb | 2:ed1f45f9b06a | 65 | rgb out; |
dimavb | 2:ed1f45f9b06a | 66 | |
dimavb | 2:ed1f45f9b06a | 67 | if(in.s <= 0.0) { // < is bogus, just shuts up warnings |
dimavb | 2:ed1f45f9b06a | 68 | out.r = in.v; |
dimavb | 2:ed1f45f9b06a | 69 | out.g = in.v; |
dimavb | 2:ed1f45f9b06a | 70 | out.b = in.v; |
dimavb | 2:ed1f45f9b06a | 71 | return out; |
dimavb | 2:ed1f45f9b06a | 72 | } |
dimavb | 2:ed1f45f9b06a | 73 | hh = in.h; |
dimavb | 2:ed1f45f9b06a | 74 | if(hh >= 360.0) hh = 0.0; |
dimavb | 2:ed1f45f9b06a | 75 | hh /= 60.0; |
dimavb | 2:ed1f45f9b06a | 76 | i = (long)hh; |
dimavb | 2:ed1f45f9b06a | 77 | ff = hh - i; |
dimavb | 2:ed1f45f9b06a | 78 | p = in.v * (1.0 - in.s); |
dimavb | 2:ed1f45f9b06a | 79 | q = in.v * (1.0 - (in.s * ff)); |
dimavb | 2:ed1f45f9b06a | 80 | t = in.v * (1.0 - (in.s * (1.0 - ff))); |
dimavb | 2:ed1f45f9b06a | 81 | |
dimavb | 2:ed1f45f9b06a | 82 | switch(i) { |
dimavb | 2:ed1f45f9b06a | 83 | case 0: |
dimavb | 2:ed1f45f9b06a | 84 | out.r = in.v; |
dimavb | 2:ed1f45f9b06a | 85 | out.g = t; |
dimavb | 2:ed1f45f9b06a | 86 | out.b = p; |
dimavb | 2:ed1f45f9b06a | 87 | break; |
dimavb | 2:ed1f45f9b06a | 88 | case 1: |
dimavb | 2:ed1f45f9b06a | 89 | out.r = q; |
dimavb | 2:ed1f45f9b06a | 90 | out.g = in.v; |
dimavb | 2:ed1f45f9b06a | 91 | out.b = p; |
dimavb | 2:ed1f45f9b06a | 92 | break; |
dimavb | 2:ed1f45f9b06a | 93 | case 2: |
dimavb | 2:ed1f45f9b06a | 94 | out.r = p; |
dimavb | 2:ed1f45f9b06a | 95 | out.g = in.v; |
dimavb | 2:ed1f45f9b06a | 96 | out.b = t; |
dimavb | 2:ed1f45f9b06a | 97 | break; |
dimavb | 2:ed1f45f9b06a | 98 | |
dimavb | 2:ed1f45f9b06a | 99 | case 3: |
dimavb | 2:ed1f45f9b06a | 100 | out.r = p; |
dimavb | 2:ed1f45f9b06a | 101 | out.g = q; |
dimavb | 2:ed1f45f9b06a | 102 | out.b = in.v; |
dimavb | 2:ed1f45f9b06a | 103 | break; |
dimavb | 2:ed1f45f9b06a | 104 | case 4: |
dimavb | 2:ed1f45f9b06a | 105 | out.r = t; |
dimavb | 2:ed1f45f9b06a | 106 | out.g = p; |
dimavb | 2:ed1f45f9b06a | 107 | out.b = in.v; |
dimavb | 2:ed1f45f9b06a | 108 | break; |
dimavb | 2:ed1f45f9b06a | 109 | case 5: |
dimavb | 2:ed1f45f9b06a | 110 | default: |
dimavb | 2:ed1f45f9b06a | 111 | out.r = in.v; |
dimavb | 2:ed1f45f9b06a | 112 | out.g = p; |
dimavb | 2:ed1f45f9b06a | 113 | out.b = q; |
dimavb | 2:ed1f45f9b06a | 114 | break; |
dimavb | 2:ed1f45f9b06a | 115 | } |
dimavb | 2:ed1f45f9b06a | 116 | return out; |
dimavb | 2:ed1f45f9b06a | 117 | } |