imgproc: fix Subdiv2D::getTriangleList()
authorAlexander Alekhin <alexander.alekhin@intel.com>
Wed, 5 Sep 2018 13:16:53 +0000 (16:16 +0300)
committerAlexander Alekhin <alexander.alekhin@intel.com>
Wed, 5 Sep 2018 13:24:27 +0000 (16:24 +0300)
modules/imgproc/src/subdivision2d.cpp

index 596806c..6014774 100644 (file)
@@ -758,24 +758,30 @@ void Subdiv2D::getTriangleList(std::vector<Vec6f>& triangleList) const
     triangleList.clear();
     int i, total = (int)(qedges.size()*4);
     std::vector<bool> edgemask(total, false);
-    Rect2f rect(topLeft.x, topLeft.y, bottomRight.x, bottomRight.y);
+    const bool filterPoints = true;
+    Rect2f rect(topLeft.x, topLeft.y, bottomRight.x - topLeft.x, bottomRight.y - topLeft.y);
 
     for( i = 4; i < total; i += 2 )
     {
         if( edgemask[i] )
             continue;
         Point2f a, b, c;
-        int edge = i;
-        edgeOrg(edge, &a);
-        edgemask[edge] = true;
-        edge = getEdge(edge, NEXT_AROUND_LEFT);
-        edgeOrg(edge, &b);
-        edgemask[edge] = true;
-        edge = getEdge(edge, NEXT_AROUND_LEFT);
-        edgeOrg(edge, &c);
-        edgemask[edge] = true;
-        if( rect.contains(a) && rect.contains(b) && rect.contains(c) )
-            triangleList.push_back(Vec6f(a.x, a.y, b.x, b.y, c.x, c.y));
+        int edge_a = i;
+        edgeOrg(edge_a, &a);
+        if (filterPoints && !rect.contains(a))
+            continue;
+        int edge_b = getEdge(edge_a, NEXT_AROUND_LEFT);
+        edgeOrg(edge_b, &b);
+        if (filterPoints && !rect.contains(b))
+            continue;
+        int edge_c = getEdge(edge_b, NEXT_AROUND_LEFT);
+        edgeOrg(edge_c, &c);
+        if (filterPoints && !rect.contains(c))
+            continue;
+        edgemask[edge_a] = true;
+        edgemask[edge_b] = true;
+        edgemask[edge_c] = true;
+        triangleList.push_back(Vec6f(a.x, a.y, b.x, b.y, c.x, c.y));
     }
 }