|
904 | 904 | } |
905 | 905 |
|
906 | 906 | int main() { |
907 | | - int N = 10000; |
| 907 | + unsigned int N = 10000; |
908 | 908 | double sum = 0.0; |
909 | 909 |
|
910 | 910 | // iterate through all of our samples |
911 | 911 | std::vector<sample> samples; |
912 | | - for (int i = 0; i < N; i++) { |
| 912 | + for (unsigned int i = 0; i < N; i++) { |
913 | 913 | // Get the area under the curve |
914 | 914 | auto x = random_double(0, 2*pi); |
915 | 915 | auto sin_x = sin(x); |
|
927 | 927 | double half_sum = sum / 2.0; |
928 | 928 | double halfway_point = 0.0; |
929 | 929 | double accum = 0.0; |
930 | | - for (int i = 0; i < N; i++){ |
| 930 | + for (unsigned int i = 0; i < N; i++){ |
931 | 931 | accum += samples[i].p_x; |
932 | | - if (accum >= half_sum){ |
| 932 | + if (accum >= half_sum) { |
933 | 933 | halfway_point = samples[i].x; |
934 | 934 | break; |
935 | 935 | } |
|
1991 | 1991 | #include <iomanip> |
1992 | 1992 | #include <math.h> |
1993 | 1993 |
|
1994 | | - double f(double r1, double r2) { |
| 1994 | + double f(double r2) { |
1995 | 1995 | // auto x = cos(2*pi*r1)*2*sqrt(r2*(1-r2)); |
1996 | 1996 | // auto y = sin(2*pi*r1)*2*sqrt(r2*(1-r2)); |
1997 | 1997 | auto z = 1 - r2; |
1998 | 1998 | double cos_theta = z; |
1999 | 1999 | return cos_theta*cos_theta*cos_theta; |
2000 | 2000 | } |
2001 | 2001 |
|
2002 | | - double pdf(double r1, double r2) { |
| 2002 | + double pdf() { |
2003 | 2003 | return 1.0 / (2.0*pi); |
2004 | 2004 | } |
2005 | 2005 |
|
|
2008 | 2008 |
|
2009 | 2009 | auto sum = 0.0; |
2010 | 2010 | for (int i = 0; i < N; i++) { |
2011 | | - auto r1 = random_double(); |
2012 | 2011 | auto r2 = random_double(); |
2013 | | - sum += f(r1, r2) / pdf(r1, r2); |
| 2012 | + sum += f(r2) / pdf(); |
2014 | 2013 | } |
2015 | 2014 |
|
2016 | 2015 | std::cout << std::fixed << std::setprecision(12); |
|
2706 | 2705 |
|
2707 | 2706 |
|
2708 | 2707 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight |
2709 | | - virtual double pdf_value(const point3& o, const vec3& v) const { |
| 2708 | + virtual double pdf_value(const point3& origin, const vec3& direction) const { |
2710 | 2709 | return 0.0; |
2711 | 2710 | } |
2712 | 2711 |
|
|
2743 | 2742 |
|
2744 | 2743 |
|
2745 | 2744 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight |
2746 | | - double pdf_value(const point3& origin, const vec3& v) const override { |
| 2745 | + double pdf_value(const point3& origin, const vec3& direction) const override { |
2747 | 2746 | hit_record rec; |
2748 | | - if (!this->hit(ray(origin, v), interval(0.001, infinity), rec)) |
| 2747 | + if (!this->hit(ray(origin, direction), interval(0.001, infinity), rec)) |
2749 | 2748 | return 0; |
2750 | 2749 |
|
2751 | | - auto distance_squared = rec.t * rec.t * v.length_squared(); |
2752 | | - auto cosine = fabs(dot(v, rec.normal) / v.length()); |
| 2750 | + auto distance_squared = rec.t * rec.t * direction.length_squared(); |
| 2751 | + auto cosine = fabs(dot(direction, rec.normal) / direction.length()); |
2753 | 2752 |
|
2754 | 2753 | return distance_squared / (cosine * area); |
2755 | 2754 | } |
|
2763 | 2762 | private: |
2764 | 2763 | point3 Q; |
2765 | 2764 | vec3 u, v; |
| 2765 | + vec3 w; |
2766 | 2766 | shared_ptr<material> mat; |
2767 | 2767 | aabb bbox; |
2768 | 2768 | vec3 normal; |
2769 | 2769 | double D; |
2770 | | - vec3 w; |
2771 | 2770 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight |
2772 | 2771 | double area; |
2773 | 2772 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ |
|
3484 | 3483 |
|
3485 | 3484 |
|
3486 | 3485 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight |
3487 | | - double pdf_value(const point3& o, const vec3& v) const override { |
| 3486 | + double pdf_value(const point3& origin, const vec3& direction) const override { |
3488 | 3487 | // This method only works for stationary spheres. |
3489 | 3488 |
|
3490 | 3489 | hit_record rec; |
3491 | | - if (!this->hit(ray(o, v), interval(0.001, infinity), rec)) |
| 3490 | + if (!this->hit(ray(origin, direction), interval(0.001, infinity), rec)) |
3492 | 3491 | return 0; |
3493 | 3492 |
|
3494 | | - auto cos_theta_max = sqrt(1 - radius*radius/(center1 - o).length_squared()); |
| 3493 | + auto cos_theta_max = sqrt(1 - radius*radius/(center1 - origin).length_squared()); |
3495 | 3494 | auto solid_angle = 2*pi*(1-cos_theta_max); |
3496 | 3495 |
|
3497 | 3496 | return 1 / solid_angle; |
|
3586 | 3585 |
|
3587 | 3586 |
|
3588 | 3587 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight |
3589 | | - double pdf_value(const point3& o, const vec3& v) const override { |
3590 | | - auto weight = 1.0/objects.size(); |
| 3588 | + double pdf_value(const point3& origin, const vec3& direction) const override { |
| 3589 | + auto weight = 1.0 / objects.size(); |
3591 | 3590 | auto sum = 0.0; |
3592 | 3591 |
|
3593 | 3592 | for (const auto& object : objects) |
3594 | | - sum += weight * object->pdf_value(o, v); |
| 3593 | + sum += weight * object->pdf_value(origin, direction); |
3595 | 3594 |
|
3596 | 3595 | return sum; |
3597 | 3596 | } |
|
0 commit comments