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.