Forked
Fork of Multi_WS2811 by
Embed:
(wiki syntax)
Show/hide line numbers
Colors.cpp
00001 #include <math.h> 00002 #include <mbed.h> 00003 #include "Colors.h" 00004 00005 void HSBtoRGB(float hue, float saturation, float brightness, uint8_t *pr, uint8_t *pg, uint8_t *pb) 00006 { 00007 uint8_t r = 0, g = 0, b = 0; 00008 if (saturation == 0) { 00009 r = g = b = (uint8_t) (brightness * 255.0f + 0.5f); 00010 } else { 00011 float h = (hue - (float)floor(hue)) * 6.0f; 00012 float f = h - (float)floor(h); 00013 float p = brightness * (1.0f - saturation); 00014 float q = brightness * (1.0f - saturation * f); 00015 float t = brightness * (1.0f - (saturation * (1.0f - f))); 00016 switch ((int) h) { 00017 case 0: 00018 r = (int) (brightness * 255.0f + 0.5f); 00019 g = (int) (t * 255.0f + 0.5f); 00020 b = (int) (p * 255.0f + 0.5f); 00021 break; 00022 case 1: 00023 r = (int) (q * 255.0f + 0.5f); 00024 g = (int) (brightness * 255.0f + 0.5f); 00025 b = (int) (p * 255.0f + 0.5f); 00026 break; 00027 case 2: 00028 r = (int) (p * 255.0f + 0.5f); 00029 g = (int) (brightness * 255.0f + 0.5f); 00030 b = (int) (t * 255.0f + 0.5f); 00031 break; 00032 case 3: 00033 r = (int) (p * 255.0f + 0.5f); 00034 g = (int) (q * 255.0f + 0.5f); 00035 b = (int) (brightness * 255.0f + 0.5f); 00036 break; 00037 case 4: 00038 r = (int) (t * 255.0f + 0.5f); 00039 g = (int) (p * 255.0f + 0.5f); 00040 b = (int) (brightness * 255.0f + 0.5f); 00041 break; 00042 case 5: 00043 r = (int) (brightness * 255.0f + 0.5f); 00044 g = (int) (p * 255.0f + 0.5f); 00045 b = (int) (q * 255.0f + 0.5f); 00046 break; 00047 } 00048 } 00049 *pr = r; 00050 *pg = g; 00051 *pb = b; 00052 } 00053 00054 float* RGBtoHSB(uint8_t r, uint8_t g, uint8_t b, float* hsbvals) 00055 { 00056 float hue, saturation, brightness; 00057 if (!hsbvals) { 00058 hsbvals = new float[3]; 00059 } 00060 uint8_t cmax = (r > g) ? r : g; 00061 if (b > cmax) cmax = b; 00062 uint8_t cmin = (r < g) ? r : g; 00063 if (b < cmin) cmin = b; 00064 00065 brightness = ((float) cmax) / 255.0f; 00066 if (cmax != 0) 00067 saturation = ((float) (cmax - cmin)) / ((float) cmax); 00068 else 00069 saturation = 0; 00070 if (saturation == 0) 00071 hue = 0; 00072 else { 00073 float redc = ((float) (cmax - r)) / ((float) (cmax - cmin)); 00074 float greenc = ((float) (cmax - g)) / ((float) (cmax - cmin)); 00075 float bluec = ((float) (cmax - b)) / ((float) (cmax - cmin)); 00076 if (r == cmax) 00077 hue = bluec - greenc; 00078 else if (g == cmax) 00079 hue = 2.0f + redc - bluec; 00080 else 00081 hue = 4.0f + greenc - redc; 00082 hue = hue / 6.0f; 00083 if (hue < 0) 00084 hue = hue + 1.0f; 00085 } 00086 hsbvals[0] = hue; 00087 hsbvals[1] = saturation; 00088 hsbvals[2] = brightness; 00089 return hsbvals; 00090 }
Generated on Sun Jul 17 2022 01:46:11 by 1.7.2