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.java:
/**
Transformacja pomiedzy modelami HSV i RGB
www.algorytm.org
(c)2005 Tomasz Lubinski
*/
public class Hsv_rgb {
private static double[] hsv2rgb(double hue, double sat, double val) {
double red = 0, grn = 0, blu = 0;
double i, f, p, q, t;
double result[] = new double[3];
if(val==0) {
red = 0;
grn = 0;
blu = 0;
} else {
hue/=60;
i = Math.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;
}
private static double[] rgb2hsv(double red, double grn, double blu){
double hue, sat, val;
double x, f, i;
double result[] = new double[3];
x = Math.min(Math.min(red, grn), blu);
val = Math.max(Math.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 = ((i-f/(val-x))*60)%360;
sat = ((val-x)/val);
}
result[0] = hue;
result[1] = sat;
result[2] = val;
return result;
}
public static void main(String[] args) {
int x;
double h,s,v;
double r,g,b;
double result[];
System.out.println("1. Dla transformacji HSV -> RGB");
System.out.println("2. Dla transformacji RGB -> HSV");
x = Console.readInt("?");
if (x == 1){
h = Console.readDouble("H=");
s = Console.readDouble("S=");
v = Console.readDouble("V=");
result = hsv2rgb(h,s,v);
System.out.println("R="+result[0]+", G="+result[1]+", B="+ result[2]);
}
else {
r = Console.readDouble("R=");
g = Console.readDouble("G=");
b = Console.readDouble("B=");
result = rgb2hsv(r,g,b);
System.out.println("H="+result[0]+", S="+result[1]+", V="+ result[2]);
}
}
}

