include/crbn/sampler/mapping.hpp

00001 
00002 #ifndef __mapping_hpp__
00003 #define __mapping_hpp__
00004 
00005 #include <math.h>
00006 
00007 //
00008 // A Low Distortion Map Between Disk and Square
00009 // Peter Shirley / Kenneth Chiu (1997)
00010 static
00011 void MapSquareToDisk(const float& su, const float& sv,
00012                            float& du,       float &dv) {
00013   float r, theta;
00014   
00015   if((su == 0.0f) && (sv == 0.0f)) {
00016     du = dv = 0.0;
00017     return;
00018   } 
00019 
00020   if(su >= -sv){
00021     if(su > sv) {
00022       // First region of the disk
00023       r = su;
00024       theta = (sv > 0.0)?(sv / r):(8.0 + (sv / r));
00025     }
00026     else {
00027       // Second region
00028       r = sv;
00029       theta = 2.0 - (su / r);
00030     }
00031   }
00032   else {
00033     if(su <= sv) {
00034       // Third region
00035       r = -su;
00036       theta = 4.0 - (sv / r);
00037     }
00038     else {
00039       // Fourth region
00040       r = -sv;
00041       theta = 6.0 + (su / r);
00042     }
00043   }
00044   theta *= M_PI / 4.0f;
00045 
00046   du = r * cos(theta);
00047   dv = r * sin(theta);
00048 }
00049 
00050 #endif

Generated on Tue Nov 14 15:40:08 2006 for libcrbn by  doxygen 1.5.0