namespace Fisheye { using namespace Vec23; //For given mag, the magnification range is [ 1 - mag/8, 1 + mag ] struct scalar_mag_r2 { float mag; float operator()(float r2) const { return 1 + mag / (1 + r2); } }; //For given mag, the magnification range is [ 1, 1 + mag ] struct scalar_mag_r2_shift { float mag; float operator()(float r2) const { float m = 1 + 0.5 * mag / (1 + r2); if (r2 > 0) { float r = sqrt(r2); m += 0.5 * r * atan(r) / r; } return m; } }; //For given z, the magnification range is [ 1, 1 + z ] struct scalar_mag_atan { scalar_mag_atan(float mag) : mag(mag) { } float mag; float operator()(float r2) const { if (r2 > 0) { float r = sqrt(r2); return 1 + mag * atan(r) / r; } return 1; } }; template struct vector_mag_isotropic { vector_mag_isotropic() { } vector_mag_isotropic(F &f) : f(f) { } F f; ZPt operator() (const ZPt &p) const { float r2 = p.x * p.x + p.y * p.y; float m = f(r2); return ZPt(m * p.x, m * p.y, p.z); } }; }