при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Так онлайн-конвертеры говорят и ваша программа.ARV писал(а):С чего вы взяли, что последние должны быть чисто красные?
Код: Выделить всё
mData mHSVfast(uint8_t h, uint8_t s, uint8_t v) {
// быстрый HSV
uint8_t r, g, b;
uint8_t value = ((24 * h / 17) / 60) % 6;
uint8_t vmin = (long)v - v * s / 255;
uint8_t a = (long)v * s / 255 * (h * 24 / 17 % 60) / 60;
uint8_t vinc = vmin + a;
uint8_t vdec = v - a;
switch (value) {
case 0: r = v; g = vinc; b = vmin; break;
case 1: r = vdec; g = v; b = vmin; break;
case 2: r = vmin; g = v; b = vinc; break;
case 3: r = vmin; g = vdec; b = v; break;
case 4: r = vinc; g = vmin; b = v; break;
case 5: r = v; g = vmin; b = vdec; break;
}
rgb_temp2.R = r;
rgb_temp2.G = g;
rgb_temp2.B = b;
return 0;
}
Код: Выделить всё
mData mHSV(uint8_t h, uint8_t s, uint8_t v) {
// обычный HSV
float r, g, b;
float H = h / 255.0;
float S = s / 255.0;
float V = v / 255.0;
int16_t i = (int16_t)(H * 6);
float f = H * 6 - i;
float p = V * (1 - S);
float q = V * (1 - f * S);
float t = V * (1 - (1 - f) * S);
switch (i % 6) {
case 0: r = V, g = t, b = p; break;
case 1: r = q, g = V, b = p; break;
case 2: r = p, g = V, b = t; break;
case 3: r = p, g = q, b = V; break;
case 4: r = t, g = p, b = V; break;
case 5: r = V, g = p, b = q; break;
}
r *= 255.0;
g *= 255.0;
b *= 255.0;
rgb_temp2.R = (uint8_t)r;
rgb_temp2.G = (uint8_t)g;
rgb_temp2.B = (uint8_t)b;
return 0;
}
Код: Выделить всё
void hsv_to_rgb(uint8_t h, uint8_t s, uint8_t v){
unsigned char region, remainder, p, q, t;
if (s == 0){
rgb_temp2.R = v;
rgb_temp2.G = v;
rgb_temp2.B = v;
return;
}
region = h / 43;
remainder = (h - (region * 43)) * 6;
p = (v * (256 - s)) >> 8;
q = (v * (256 - ((s * remainder) >> 8))) >> 8;
t = (v * (256 - ((s * (256L - remainder)) >> 8))) >> 8;
switch (region){
case 0:
rgb_temp2.R = v; rgb_temp2.G = t; rgb_temp2.B = p;
break;
case 1:
rgb_temp2.R = q; rgb_temp2.G = v; rgb_temp2.B = p;
break;
case 2:
rgb_temp2.R = p; rgb_temp2.G = v; rgb_temp2.B = t;
break;
case 3:
rgb_temp2.R = p; rgb_temp2.G = q; rgb_temp2.B = v;
break;
case 4:
rgb_temp2.R = t; rgb_temp2.G = p; rgb_temp2.B = v;
break;
default:
rgb_temp2.R = v; rgb_temp2.G = p; rgb_temp2.B = q;
break;
}
}
Точно, 255 это примерно 358 градусов.ARV писал(а):сравните в своей таблице последнюю строку с первой
Код: Выделить всё
// быстрый HSV
uint8_t r, g, b;
uint8_t value = ((24 * h / 17) / 60) % 6;Код: Выделить всё
h = h * uint32_t(65536 * (360.0f / 256) + 0.5f) >> 16;Даже на МК не аппаратно поддерживающих float?Reflector писал(а):Будет быстрее
Код: Выделить всё
; h = h * (uint32_t) (65536 * (360.0f / 256) + 0.5f) >> 16;
20000314 ldr r3, [r7, #4]
20000316 mov.w r2, #92160 ; 0x16800
2000031A mul.w r3, r2, r3
2000031E lsrs r3, r3, #16
20000320 str r3, [r7, #4]Код: Выделить всё
h = uint32_t(h * Fixed<16>(360.0f / 256));
// str r3, [sp, #0]
// movs r3, #180
// lsls r3, r3, #9
// muls r3, r7
// asrs r3, r3, #16
// str r3, [sp, #12]
Код: Выделить всё
h = h*92160 >> 16; Код: Выделить всё
h = (uint32_t)h*360 >> 8; Код: Выделить всё
h = (uint32_t)h*360 >> 8; Код: Выделить всё
h = (uint32_t)h*360/256;
MOV R0,#+360
LDRB R2,[R1, #+2]
SMULBB R2,R0,R2
LSRS R2,R2,#+8
STRB R2,[R1, #+2]Код: Выделить всё
h = (uint32_t)h*360/256;
LDRB R1,[R0, #+2]
MOVS R2,#+180
LSLS R2,R2,#+1
MULS R1,R2,R1
LSRS R1,R1,#+8
STRB R1,[R0, #+2]Код: Выделить всё
Fixed<12> k(0.028261f);
rtt.printf<"{}, {}, {}\n">(k.rawValue(), (k*10).toStr(), (float)k); // 29634, 0.2826, 2.82611847e-2