DosAmp
Anderes Zeigegerät
Beiträge: 12.217
Registriert seit: Jul 2008
|
RE: Des Doktors Bastelstube
Ich wollte ein Regenbogen-Programm schreiben, welches "richtig" durch verschiedene Farben iteriert, aber ich glaube die Stacktiefe von 8 Werten reicht dafür nicht aus, um allein die Funktion, die einen Farbwert im Bereich [0…1) bzw. [0…360°) bzw. [0…255] nach RGB umrechnet, mit 8-Bit-Integer- statt Fließkomma-Arithmetrik zu schreiben. Notfalls kann man auch sicher eine Lookup-Tabelle mit 256 Einträgen bauen.
Code:
/* konvertiert einen Farbwert im HSV-Farbraum bei maximaler Sättigkeit/Helligkeit
* in eine RGB8-Repräsentation (RRRGGGBB) von Stack8 */
unsigned char hue_to_rgb(unsigned char hue) {
double huef, fracang, a, a1;
int r, g, b;
int side;
/* auf Winkel 0° <= a < 360° skalieren */
huef = 360.0 / 256.0 * hue;
/* welche Seite des RGB-Würfels */
fracang = huef / 60.0;
side = (int) fracang;
/* Winkel innerhalb der Würfelseite */
a = fracang - side;
/* komplementärer Winkel */
a1 = 1.0 - a;
/* RGB als einzelne Komponenten berechnen */
switch (side) {
default:
case 0:
r = 7;
/* g <= 7 da kein exakter 60°-Winkel */
g = 8 * a;
b = 0;
break;
case 1:
/* r <= 7 da kein exakter 60°-Winkel */
r = 8 * a1;
g = 7;
b = 0;
break;
case 2:
r = 0;
g = 7;
/* b <= 3 da side == 3 für exakten 180°-Winkel */
b = 4 * a;
break;
case 3:
r = 0;
g = 8 * a1;
/* je nach Compiler ist a1 == 1.0 für hue == 180 */
if (g >= 8) {
g = 7;
}
b = 3;
break;
case 4:
/* r <= 7 da kein exakter 300°-Winkel */
r = 8 * a;
g = 0;
b = 3;
break;
case 5:
r = 7;
g = 0;
/* b <= 3 da kein exakter 300°-Winkel */
b = 4 * a1;
break;
}
return (r << 5) + (g << 2) + b;
}
unsigned char extract_red(unsigned char rgb) {
return rgb & 0xe0;
}
unsigned char extract_green(unsigned char rgb) {
return (rgb & 0x1c) << 3;
}
unsigned char extract_blue(unsigned char rgb) {
return (rgb & 0x03) << 6;
}
Dabei skaliert immer nur ein Farbkanal innerhalb einer 60°-Drehung (bzw. einem Wertebereich von 42,666…) von Maximum zu 0 bzw. umgekehrt.
Dann könnte man so ein Programm schreiben:
So sähe im Übrigen die Lookup-Tabelle mit allen 256 Werten aus:
Code:
db 224,224
db 224,224
db 224,224
db 228,228
db 228,228
db 228,232
db 232,232
db 232,232
db 236,236
db 236,236
db 236,236
db 240,240
db 240,240
db 240,244
db 244,244
db 244,244
db 248,248
db 248,248
db 248,248
db 252,252
db 252,252
db 252,252
db 252,252
db 252,252
db 252,220
db 220,220
db 220,220
db 188,188
db 188,188
db 188,156
db 156,156
db 156,156
db 156,124
db 124,124
db 124,124
db 92,92
db 92,92
db 92,60
db 60,60
db 60,60
db 60,28
db 28,28
db 28,28
db 28,28
db 28,28
db 28,28
db 28,28
db 28,28
db 29,29
db 29,29
db 29,29
db 29,29
db 29,29
db 29,30
db 30,30
db 30,30
db 30,30
db 30,30
db 30,30
db 31,31
db 31,31
db 31,31
db 31,31
db 31,31
db 31,31
db 31,31
db 31,31
db 27,27
db 27,27
db 27,23
db 23,23
db 23,23
db 23,19
db 19,19
db 19,19
db 15,15
db 15,15
db 15,11
db 11,11
db 11,11
db 11,7
db 7,7
db 7,7
db 3,3
db 3,3
db 3,3
db 3,3
db 3,3
db 35,35
db 35,35
db 35,35
db 67,67
db 67,67
db 67,99
db 99,99
db 99,99
db 131,131
db 131,131
db 131,131
db 163,163
db 163,163
db 163,195
db 195,195
db 195,195
db 227,227
db 227,227
db 227,227
db 227,227
db 227,227
db 227,227
db 227,227
db 227,227
db 227,226
db 226,226
db 226,226
db 226,226
db 226,226
db 226,225
db 225,225
db 225,225
db 225,225
db 225,225
db 225,225
db 224,224
db 224,224
db 224,224
db 224,224
db 224,224
Erinnerst du dich an #whfclassics? Es ist zurück! In Pog-Form.
|
|