Browse Source

fmod is not mathematically valid. Replace it by a correct one.

Godzil 4 years ago
parent
commit
1b6c14691b

+ 5 - 0
source/include/math_helper.h

@@ -23,4 +23,9 @@ double max3(double a, double b, double c);
 
 double frand();
 
+static double modulo(double a, double b)
+{
+    return a - floor(a/b) * b;
+}
+
 #endif /* DORAYME_MATH_HELPER_H */

+ 1 - 1
source/pattern/checkerspattern.h

@@ -20,7 +20,7 @@ public:
     {
         double value = floor(point.x) + floor(point.y) + floor(point.z);
 
-        return (fmod(value, 2) == 0)?this->a:this->b;
+        return (modulo(value, 2) == 0)?this->a:this->b;
     }
 
     void dumpMe(FILE *fp) {

+ 1 - 1
source/pattern/ringpattern.h

@@ -22,7 +22,7 @@ public:
 
         double value = floor(sqrt(squared));
 
-        return (fmod(value, 2) == 0)?this->a:this->b;
+        return (modulo(value, 2) == 0)?this->a:this->b;
     }
 
     void dumpMe(FILE *fp) {

+ 1 - 1
source/pattern/strippattern.h

@@ -21,7 +21,7 @@ public:
 
     Colour patternAt(Tuple point)
     {
-        if (fmod(floor(point.x), 2) == 0)
+        if (modulo(floor(point.x), 2) == 0)
         {
             return this->a;
         }

+ 1 - 1
source/uvpattern/uv_checkers.h

@@ -21,7 +21,7 @@ public:
         double u2 = floor(u * this->width);
         double v2 = floor(v * this->height);
 
-        if (fmod((u2 + v2), 2) == 0)
+        if (modulo((u2 + v2), 2) == 0)
         {
             return this->a;
         }