color colormap(cplx z) { double n(std::norm(z)); if (n < 1) n = pow(n, pow(2.0, this->n-1-m)); //if (n < 1) n = HUGE_VAL; n = std::sqrt(n); //n = std::log(n); n = (n-1)/(n+1); double d(std::acos(2*sqrt(abs(n)) - 1)/M_PI); //double d(std::acos(n)/M_PI); if (std::norm(z) < 1) d = 1 - d; return HSLcolor(std::arg(z), 1.0, d); }
//conversion http://www.easyrgb.com/index.php?X=MATH&H=18#text18 HSLcolor convertRGBtoHSL( const RGBcolor &col) { float tempR = col.red / 255.0; float tempG = col.green / 255.0; float tempB = col.blue / 255.0; float Lvalue = 0; float Hvalue = 0; float Svalue = 0; float maxValue = std::max(std::max(tempR, tempG), tempB); float minValue = std::min(std::min(tempR, tempG), tempB); float diff = maxValue - minValue; Lvalue = (maxValue + minValue) / 2.0; Svalue = diff; if(Svalue > 0) { if(Lvalue < 0.5) Svalue /= (maxValue + minValue); else Svalue /= (2 - maxValue - minValue); } float someRed = (maxValue - tempR) / diff; float someGreen = (maxValue - tempG) / diff; float someBlue = (maxValue - tempB) / diff; if(tempR == maxValue) { if(tempG == minValue) Hvalue = 5 + someBlue; else Hvalue = 1 - someGreen; } else if(tempG == maxValue) { if(tempB == minValue) Hvalue = 1 + someRed; else Hvalue = 3 - someBlue; } else { if(tempR == minValue) Hvalue = 3 + someGreen; else Hvalue = 5 - someRed; } Hvalue /= 6.0; return HSLcolor(Hvalue*360, Svalue*100, Lvalue*100); }