Bug 13725 fixed: Polyline was not correctly filled with big values 21/15921/3
Calixte DENIZET [Mon, 9 Feb 2015 12:37:48 +0000 (13:37 +0100)]
Change-Id: I36e283da88f23c911004a9393f5e36cc3438b1fa

scilab/CHANGES_5.5.X
scilab/modules/graphic_objects/includes/Triangulator.hxx
scilab/modules/graphic_objects/src/cpp/Triangulator.cpp
scilab/modules/graphic_objects/tests/nonreg_tests/bug_13725.tst [new file with mode: 0644]

index 6c0e3ef..f44a779 100644 (file)
@@ -45,6 +45,8 @@ Scilab Bug Fixes
 
 * Bug #13712 fixed - Details added in strcat help page for strcat(strings, "", "r") case.
 
+* Bug #13725 fixed - Polyline was not correctly filled with big values.
+
 
 
                      Changes between version 5.5.0 and 5.5.1
index cc7e8b6..bb59c8c 100644 (file)
 #define TRIANGULATOR_HXX
 
 #include <algorithm>
+#include <limits>
 #include <list>
 #include <vector>
 
+#include <iostream>
+
 /*
  * A structure representing a point.
  */
-typedef struct
+struct Vector3d
 {
     double x;
     double y;
     double z;
-} Vector3d;
+
+    Vector3d() { }
+    Vector3d(const double _x, const double _y, const double _z) : x(_x), y(_y), z(_z) { }
+};
 
 /**
  * Triangulator class
@@ -113,6 +119,8 @@ private:
     /** The number of colinear vertices. */
     int numColinearVertices;
 
+    double xmin, xmax, ymin, ymax, zmin, zmax;
+
 private:
     /**
      * Determines the polygon's smallest axis and its two largest axes.
index 8e5aa42..9c8bea8 100644 (file)
@@ -231,7 +231,7 @@ void Triangulator::removeDuplicateVertices(void)
 
     for (size_t i = 0; i < points.size(); i++)
     {
-        int ic = ((int)i+1) % (int)points.size();
+        int ic = ((int)i + 1) % (int)points.size();
         int icm1 = (int)i;
 
         Vector3d vi = points[icm1];
@@ -599,6 +599,9 @@ Triangulator::Triangulator(void)
     numEarTests = 0;
     numColinearVertices = 0;
 
+    xmin = ymin = zmin = std::numeric_limits<double>::max();
+    xmax = ymax = zmax = std::numeric_limits<double>::min();
+
     inputPoints.clear();
     points.clear();
     vertexIndices.clear();
@@ -612,6 +615,38 @@ Triangulator::Triangulator(void)
 
 void Triangulator::initialize(void)
 {
+    const double xscale = xmax - xmin;
+    const double yscale = ymax - ymin;
+    const double zscale = zmax - zmin;
+    // we scale-translate the point in the cube [0,1]^3 to avoid error with floating point operations
+    for (std::vector<Vector3d>::iterator i = inputPoints.begin(), e = inputPoints.end(); i != e; ++i)
+    {
+        if (xscale)
+        {
+            i->x = (i->x - xmin) / xscale;
+        }
+        else
+        {
+            i->x = 1;
+        }
+        if (yscale)
+        {
+            i->y = (i->y - ymin) / yscale;
+        }
+        else
+        {
+            i->y = 1;
+        }
+        if (zscale)
+        {
+            i->z = (i->z - zmin) / zscale;
+        }
+        else
+        {
+            i->z = 1;
+        }
+    }
+
     double area = 0.;
 
     numPoints = (int)inputPoints.size();
@@ -650,11 +685,38 @@ void Triangulator::initialize(void)
 
 void Triangulator::addPoint(double x, double y, double z)
 {
-    Vector3d point;
+    Vector3d point(x, y, z);
+
+    if (x < xmin)
+    {
+        xmin = x;
+    }
+    if (x > xmax)
+    {
+        xmax = x;
+    }
+
+    if (y < ymin)
+    {
+        ymin = y;
+    }
+    if (y > ymax)
+    {
+        ymax = y;
+    }
+
+    if (z < zmin)
+    {
+        zmin = z;
+    }
+    if (z > zmax)
+    {
+        zmax = z;
+    }
 
-    point.x = x;
+    /*point.x = x;
     point.y = y;
-    point.z = z;
+    point.z = z;*/
 
     inputPoints.push_back(point);
 }
diff --git a/scilab/modules/graphic_objects/tests/nonreg_tests/bug_13725.tst b/scilab/modules/graphic_objects/tests/nonreg_tests/bug_13725.tst
new file mode 100644 (file)
index 0000000..f1e64f0
--- /dev/null
@@ -0,0 +1,24 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- TEST WITH GRAPHIC -->
+//
+// // <-- INTERACTIVE TEST -->
+// <-- Non-regression test for bug 13725 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13725
+//
+// <-- Short Description -->
+// Polyline is not correctly filled with big values
+
+y = [0, -4, 2, -3, -1, -1, 7, 0]
+x = [0, 1, 3, 6, 16, 7, 3, 0]
+scf();
+xfpoly(x*1e18, y, 3)
+
+// check that the polyline is correctly filled