Sto provando a creare uno sfondo e sto utilizzando la conversione HSV nella classe "android.graphics.color". Sono rimasto molto sorpreso quando ho realizzato che la conversione di un colore HSV creato con una tonalità specificata (0..360) in un colore rgb (un intero) e una conversione posteriore in un colore HSV non produrrebbe la stessa tonalità. Questo è il mio codice:Conversione HSV imprecisa su Android
int c = Color.HSVToColor(new float[] { 100f, 1, 1 });
float[] f = new float[3];
Color.colorToHSV(c, f);
alert(f[0]);
Sto iniziando con una tonalità di 100 gradi e il risultato è 99.76471. Mi chiedo perché c'è (secondo me) inesattezza relativamente grande.
Ma un problema molto più grande è che quando si inserisce nuovamente questo valore nel codice, il nuovo risultato diminuisce di nuovo.
int c = Color.HSVToColor(new float[] { 99.76471f, 1, 1 });
float[] f = new float[3];
Color.colorToHSV(c, f);
alert(f[0]);
Se inizio con 99.76471, ottengo 99.52941. Questo è un po 'un problema per me. Ho fatto qualcosa di simile in java con la classe "java.awt.Color" in cui non avevo questi problemi. Sfortunatamente, non posso usare questa classe in Android.
I * credo * questo è un caso di conversione diversa utilizzata tra un numero intero a 16 e 32 bit, tuttavia questo potrebbe essere diverso. Ricordo alcuni anni fa che si è verificato un problema con i file audio e la conversione da un array di byte. Alla fine ho solo arrotondato la figura fino al più vicino int intero. – dave
Sostengo l'idea di dave. Una cosa che potrebbe essere utile è notare che la differenza tra il valore originale di 100 e il risultato arrotondato di 99.76471 è 60/255 e 255 = 2^8-1 (È abbastanza comune memorizzare valori rgb su 8 bit) . Lo stesso vale per 99.76471 e 99.52941. Non ho una teoria completa, ma sembra che l'aritmetica di base sia andata storta. – elias