* Bug #8310 - Wrong triangulation of non-convex polygons 93/17993/6
Caio SOUZA [Sun, 27 Mar 2016 18:18:07 +0000 (15:18 -0300)]
Now works for planar polygons with Z coordinates constant, for non-planar polygons a new triangulator is needed.

Change-Id: I055f0f58dd46354be7d1af2d4036712d98148b8c

scilab/CHANGES
scilab/modules/graphic_objects/src/cpp/Fac3DDecomposer.cpp
scilab/modules/graphic_objects/tests/nonreg_tests/bug_8310.tst [new file with mode: 0644]

index 1394d7c..30c01fd 100644 (file)
@@ -328,6 +328,8 @@ In 6.0.0:
 
 * Bug #8210 fixed  - Added UMFPACK examples to the Demo gui
 
+* Bug #8310        - Wrong triangulation of non-convex polygons, now it is working for planar polygons with Z coordinates constant, for non-planar polygons a new triangulator is needed.
+
 * Bug #9456 fixed  - bench_run did not work on a path or in a toolbox
 
 * Bug #11625 fixed - uicontrol table would not update object strings when edited interactively in the plot window
index 985b56f..3497428 100644 (file)
@@ -17,6 +17,7 @@
 #include "ColorComputer.hxx"
 #include "Fac3DColorComputer.hxx"
 #include "Fac3DDecomposer.hxx"
+#include "Triangulator.hxx"
 
 extern "C"
 {
@@ -483,6 +484,9 @@ int Fac3DDecomposer::fillIndices(int id, int* buffer, int bufferLength, int logM
     for (int i = 0; i < numGons; i++)
     {
         int isValid = 1;
+        double lz = z[vertexOffset];
+        bool isZconst = true;
+        Triangulator triangulator;
 
         for (int j = 0; j < numVerticesPerGon; j++)
         {
@@ -490,11 +494,14 @@ int Fac3DDecomposer::fillIndices(int id, int* buffer, int bufferLength, int logM
             yc = y[vertexOffset + j];
             zc = z[vertexOffset + j];
 
+            isZconst = isZconst && (lz == zc);
+
             if (!DecompositionUtils::isValid(xc, yc, zc) || !DecompositionUtils::isLogValid(xc, yc, zc, logMask))
             {
                 isValid = 0;
                 break;
             }
+            triangulator.addPoint(xc, yc, zc);
         }
 
         if (isValid == 0 || colorComputer.isFacetColorValid(i) == 0)
@@ -503,16 +510,46 @@ int Fac3DDecomposer::fillIndices(int id, int* buffer, int bufferLength, int logM
             continue;
         }
 
-        /* Performs a fan decomposition, vertices are ordered counter-clockwise. */
-        for (int j = 0; j < numVerticesPerGon - 2; j++)
+        if (isZconst)
+        {
+            triangulator.initialize();
+            triangulator.triangulate();
+            int numTriangles = triangulator.getNumberTriangles();
+
+            //Failed to triangulate
+            if (numTriangles < 1)
+            {
+                vertexOffset += numVerticesPerGon;
+                continue;
+            }
+
+            int * indices = triangulator.getIndices();
+
+
+            for (int j = 0; j < numTriangles; j++)
+            {
+                buffer[bufferOffset] = indices[3 * j];
+                buffer[bufferOffset + 1] = indices[3 * j + 1];
+                buffer[bufferOffset + 2] = indices[3 * j + 2];
+
+                bufferOffset += 3;
+            }
+        }
+        else
         {
-            buffer[bufferOffset] = vertexOffset;
-            buffer[bufferOffset + 1] = vertexOffset + j + 2;
-            buffer[bufferOffset + 2] = vertexOffset + j + 1;
+            /* Performs a fan decomposition, vertices are ordered counter-clockwise. */
+            for (int j = 0; j < numVerticesPerGon - 2; j++)
+            {
+                buffer[bufferOffset] = vertexOffset;
+                buffer[bufferOffset + 1] = vertexOffset + j + 2;
+                buffer[bufferOffset + 2] = vertexOffset + j + 1;
 
-            bufferOffset += 3;
+                bufferOffset += 3;
+            }
         }
 
+        triangulator.clear();
+
         vertexOffset += numVerticesPerGon;
     }
 
diff --git a/scilab/modules/graphic_objects/tests/nonreg_tests/bug_8310.tst b/scilab/modules/graphic_objects/tests/nonreg_tests/bug_8310.tst
new file mode 100644 (file)
index 0000000..6430c10
--- /dev/null
@@ -0,0 +1,39 @@
+// =============================================================================\r
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
+// Copyright (C) 2016 - Scilab Enterprises - Caio SOUZA\r
+//\r
+//  This file is distributed under the same license as the Scilab package.\r
+// =============================================================================\r
+\r
+// <-- INTERACTIVE TEST -->\r
+// <-- TEST WITH GRAPHIC -->\r
+\r
+// <-- Non-regression test for bug 8310 -->\r
+//\r
+// <-- Bugzilla URL -->\r
+// http://bugzilla.scilab.org/8310\r
+//\r
+// <-- Short Description -->\r
+// plot3d was drawing weird triangles when ploting non-convex polygons\r
+\r
+X = [0 10 10 7  6.5 3.5  3 0 0]';\r
+Y = [0 0 10 10  2 2  10 10 0]';\r
+clf, plot3d(X($:-1:1),Y($:-1:1),zeros(X));\r
+\r
+//the first plot should look like:\r
+// --------------------\r
+// |                  |\r
+// |                  |\r
+// |     --------     |\r
+// |     |      |     |\r
+// |     |      |     |\r
+// |     |      |     |\r
+// -------      -------\r
+\r
+\r
+x = [0; 5; 10; 5; 0]\r
+y = [0; 10; 0; 5; 0];\r
+scf()\r
+plot3d(x,y,zeros(x));\r
+\r
+//The second plot shoul look line an arrow head, not a triangle.\r