22/03/15 20:55
Roby94
Buonasera, sto apportando alcune migliorie ad un sistema di gestione illuminazioni, si tratta solo di migliorare le modalità già disponibili.
Una delle modalità è un gradiente di colori che si puo vedere come il precorrimento della circonferenza dell'HSV con S=V=1 quindi con H variabile.
Per far ciò ho questa funzione
e fino qui nessun problema.
Il codice visto in precedenza impone che i valori di partenza siano GREEN=BLUE=0 e RED=255, vorrei eliminare questa limitazione, potendo far partire il gradiente da un colore qualsiasi. Ho iniziato modificando cosi.
Con la parte di codice aggiunta identifico quale tra le tre componenti sia la minore e la porto lentamente a 0 riportandomi sulla circonferenza facendo il minor tragitto possibile, ora però non mi viene in mente come continuare l'algoritmo per poter riprendere a percorrere la circonferenza dal nuovo colore trovato, vi viene in mente un modo? Mi aiutereste molto, io continuo a pensarci in tanto.
Grazie
PS Il topic l'avrei volentieri messo nella sezione algoritmi ma trattandosi di un algoritmo da modellarsi su un linguaggio specifico, ho pensato fosse meglio la sezione di C.
Una delle modalità è un gradiente di colori che si puo vedere come il precorrimento della circonferenza dell'HSV con S=V=1 quindi con H variabile.
Per far ciò ho questa funzione
void RGBScaleMode()//Gradiente RGB { uint8_t delay = EEPROMRead(EEPROM_SCALERGB_DELAY);//Recupero il valore di delay while(1) { for(; GREEN != 255; GREEN++) _delay_ms(delay);//Porto il verde al massimo for(; RED != 0; RED--) _delay_ms(delay);//Porto il rosso al minimo for(; BLUE != 255; BLUE++) _delay_ms(delay);//Porto il blu al massimo for(; GREEN != 0; GREEN--) _delay_ms(delay);//Porto il verde al minimo for(; RED != 255; RED++) _delay_ms(delay);//Porto il rosso al massimo for(; BLUE != 0; BLUE--) _delay_ms(delay);//Porto il blu al minimo } }
e fino qui nessun problema.
Il codice visto in precedenza impone che i valori di partenza siano GREEN=BLUE=0 e RED=255, vorrei eliminare questa limitazione, potendo far partire il gradiente da un colore qualsiasi. Ho iniziato modificando cosi.
void RGBScaleMode()//Gradiente RGB { uint8_t delay = EEPROMRead(EEPROM_SCALERGB_DELAY);//Recupero il valore di delay uint8_t *min; if(RED < GREEN && RED < BLUE) min = &RED;//Identifico quale sia la componente minore tra le 3 else if(GREEN < RED && GREEN < BLUE) min = &GREEN; else min = &BLUE; for(; *min != 0; *min--) _delay_ms(delay);//Lo riduco a 0 graduatamente /****/ }
Con la parte di codice aggiunta identifico quale tra le tre componenti sia la minore e la porto lentamente a 0 riportandomi sulla circonferenza facendo il minor tragitto possibile, ora però non mi viene in mente come continuare l'algoritmo per poter riprendere a percorrere la circonferenza dal nuovo colore trovato, vi viene in mente un modo? Mi aiutereste molto, io continuo a pensarci in tanto.
Grazie
PS Il topic l'avrei volentieri messo nella sezione algoritmi ma trattandosi di un algoritmo da modellarsi su un linguaggio specifico, ho pensato fosse meglio la sezione di C.
Ultima modifica effettuata da Roby94 22/03/15 20:57
aaa