25326

Dependencies:   QEI WS2812 PixelArray DFPlayerMini MODSERIAL PCA9685_ pca9685

Committer:
turumputum
Date:
Fri Aug 23 16:58:47 2019 +0000
Revision:
9:4bc77e4c090e
Parent:
2:ed1f45f9b06a
123

Who changed what in which revision?

UserRevisionLine numberNew 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 }