00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 inline
00024 sheep::Point2 UniformDiskSampling(sheep::Real xi1, sheep::Real xi2) {
00025 assert(xi1 >= 0.0 && xi1 <= 1.0);
00026 assert(xi2 >= 0.0 && xi2 <= 1.0);
00027
00028
00029
00030
00031
00032 const sheep::Real a = xi1 + xi1 - 1.0;
00033 const sheep::Real b = xi2 + xi2 - 1.0;
00034
00035 sheep::Real phi, r;
00036
00037 if(a > -b) {
00038 if(a > b) {
00039 r = a;
00040 phi = (sheep::PI / 4.0) * (b / a);
00041 } else {
00042 r = b;
00043 phi = (sheep::PI / 4.0) * (2.0 - (a / b));
00044 }
00045 } else {
00046 if(a < b) {
00047 r = -a;
00048 phi = (sheep::PI / 4.0) * (4.0 + (b / a));
00049 } else {
00050 r = -b;
00051 if (b != 0.0)
00052 phi = (sheep::PI / 4.0) * (6.0 - (a / b));
00053 else
00054 phi = 0.0;
00055 }
00056 }
00057
00058 return sheep::Point2(r * cos(phi), r * sin(phi));
00059 }
00060
00061 inline
00062 sheep::Point3 UniformSphereSampling(sheep::Real xi1, sheep::Real xi2) {
00063 assert(xi1 >= 0.0 && xi1 <= 1.0);
00064 assert(xi2 >= 0.0 && xi2 <= 1.0);
00065
00066 const sheep::Real r = 2.0 * sqrt(xi1 * (1.0 - xi1));
00067 const sheep::Real phi = 2.0 * sheep::PI * xi2;
00068
00069 return sheep::Point3(r * cos(phi), 1.0 - 2.0 * xi1, r * sin(phi));
00070 }
00071
00072 inline
00073 sheep::Point3 UniformHemisphereSampling(sheep::Real xi1, sheep::Real xi2) {
00074 assert(xi1 >= 0.0 && xi1 <= 1.0);
00075 assert(xi2 >= 0.0 && xi2 <= 1.0);
00076
00077 const sheep::Real r = sqrt(1.0 - xi1 * xi1);
00078 const sheep::Real phi = 2.0 * sheep::PI * xi2;
00079
00080 return sheep::Point3(r * cos(phi), xi1, r * sin(phi));
00081 }
00082
00083 inline
00084 sheep::Point3 CosineHemisphereSampling(sheep::Real xi1, sheep::Real xi2) {
00085 assert(xi1 >= 0.0 && xi1 <= 1.0);
00086 assert(xi2 >= 0.0 && xi2 <= 1.0);
00087
00088 const sheep::Real r = sqrt(1.0 - xi1);
00089 const sheep::Real phi = 2.0 * sheep::PI * xi2;
00090
00091 return sheep::Point3(r * cos(phi), sqrt(xi1), r * sin(phi));
00092 }