Nadesłany przez Tomasz Lubiński, 06 września 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
hsv_rgb.cpp:
/* Transformacja pomiedzy modelami HSV i RGB www.algorytm.org (c)2005 Tomasz Lubinski */ #include <stdio.h> #include <math.h> #define MIN(a,b) ((a)<(b)?(a):(b)) #define MAX(a,b) ((a)>(b)?(a):(b)) float* hsv2rgb(float hue, float sat, float val) { float red, grn, blu; float i, f, p, q, t; float *result = new float[3]; if(val==0) { red = 0; grn = 0; blu = 0; } else { hue/=60; i = floor(hue); f = hue-i; p = val*(1-sat); q = val*(1-(sat*f)); t = val*(1-(sat*(1-f))); if (i==0) {red=val; grn=t; blu=p;} else if (i==1) {red=q; grn=val; blu=p;} else if (i==2) {red=p; grn=val; blu=t;} else if (i==3) {red=p; grn=q; blu=val;} else if (i==4) {red=t; grn=p; blu=val;} else if (i==5) {red=val; grn=p; blu=q;} } result[0] = red; result[1] = grn; result[2] = blu; return result; } float *rgb2hsv(float red, float grn, float blu){ float hue, sat, val; float x, f, i; float *result = new float[3]; x = MIN(MIN(red, grn), blu); val = MAX(MAX(red, grn), blu); if (x == val){ hue = 0; sat = 0; } else { f = (red == x) ? grn-blu : ((grn == x) ? blu-red : red-grn); i = (red == x) ? 3 : ((grn == x) ? 5 : 1); hue = fmod((i-f/(val-x))*60, 360); sat = ((val-x)/val); } result[0] = hue; result[1] = sat; result[2] = val; return result; } void main(void) { int x; float h,s,v; float r,g,b; float *result; printf("1. Dla transformacji HSV -> RGB\n"); printf("2. Dla transformacji RGB -> HSV\n"); scanf("%d", &x); if (x == 1){ printf("H="); scanf("%f", &h); printf("S="); scanf("%f", &s); printf("V="); scanf("%f", &v); result = hsv2rgb(h,s,v); printf("R=%f, G=%f, B=%f", result[0], result[1], result[2]); } else { printf("R="); scanf("%f", &r); printf("G="); scanf("%f", &g); printf("B="); scanf("%f", &b); result = rgb2hsv(r,g,b); printf("H=%f, S=%f, V=%f", result[0], result[1], result[2]); } scanf("%d"); }
Jeśli to tylko kod przykładowy, który ma obrazować działanie algorytmu, to powinien być opatrzony wielkim czerwonym napisem: "Dzieci, nie róbcie tego w domu!". A i tak lepiej to wtedy opisać ładnym pseudokodem.