このようなものがありましたが、このスクリプトだと
#define _PI 96.0 #define _2PI 192.0 #defcfunc max int p1, int p2 if p1 < p2 : return p2 return p1 #defcfunc min int p1, int p2 if p1 < p2 : return p1 return p2 #deffunc toHSV var H, var S, var V, int R, int G, int B V = max(max(R, G), B) u = min(min(R, G), B) if V { S = 255.0 * (V - u) / V } else { S = 0.0 } if V == R { H = _PI / 3 * (G - B) / (V - u); _PI/3 = 32 } else : if V == G { H = _PI / 3 * (2.0 + double(B - R) / (V - u)) } else { H = _PI / 3 * (4.0 + double(R - G) / (V - u) ) } if H < 0.0 : H + _2PI return
無彩色(R,G,Bが同じ)だと、
(V - u)は0のため、0で除算したとエラーになってしまいます。
無彩色はV値だけで決まるらしいですが、
この所でVが0(つまり、R,G,Bが全て0)の処理をしているにもかかわらず、
if V { S = 255.0 * (V - u) / V } else { S = 0.0 }
Vが0の場合は
この部分でV == Rとなり、
if V == R { H = _PI / 3 * (G - B) / (V - u); _PI/3 = 32 }
(G - B) / (V - u)の部分で必ずエラーになります。
これを無彩色でも使えるようにしたいのですが、どうすればいいでしょうか。
僕の頭では、いろいろ考えても分かりませんでした。