Refactor a section of icvRotatingCalipers to work around a GCC bug
authorRoman Donchenko <roman.donchenko@itseez.com>
Tue, 14 Jul 2015 10:23:37 +0000 (13:23 +0300)
committerRoman Donchenko <roman.donchenko@itseez.com>
Tue, 14 Jul 2015 10:26:47 +0000 (13:26 +0300)
https://bugs.launchpad.net/ubuntu/+source/gcc-4.9/+bug/1474304

modules/imgproc/src/rotcalipers.cpp

index 3795f7a..9bda8f5 100644 (file)
@@ -186,24 +186,28 @@ icvRotatingCalipers( CvPoint2D32f* points, int n, int mode, float* out )
 
         /* compute cosine of angle between calipers side and polygon edge */
         /* dp - dot product */
-        float dp0 = base_a * vect[seq[0]].x + base_b * vect[seq[0]].y;
-        float dp1 = -base_b * vect[seq[1]].x + base_a * vect[seq[1]].y;
-        float dp2 = -base_a * vect[seq[2]].x - base_b * vect[seq[2]].y;
-        float dp3 = base_b * vect[seq[3]].x - base_a * vect[seq[3]].y;
+        float dp[4] = {
+            +base_a * vect[seq[0]].x + base_b * vect[seq[0]].y,
+            -base_b * vect[seq[1]].x + base_a * vect[seq[1]].y,
+            -base_a * vect[seq[2]].x - base_b * vect[seq[2]].y,
+            +base_b * vect[seq[3]].x - base_a * vect[seq[3]].y,
+        };
 
-        float cosalpha = dp0 * inv_vect_length[seq[0]];
-        float maxcos = cosalpha;
+        float maxcos = dp[0] * inv_vect_length[seq[0]];
 
         /* number of calipers edges, that has minimal angle with edge */
         int main_element = 0;
 
         /* choose minimal angle */
-        cosalpha = dp1 * inv_vect_length[seq[1]];
-        maxcos = (cosalpha > maxcos) ? (main_element = 1, cosalpha) : maxcos;
-        cosalpha = dp2 * inv_vect_length[seq[2]];
-        maxcos = (cosalpha > maxcos) ? (main_element = 2, cosalpha) : maxcos;
-        cosalpha = dp3 * inv_vect_length[seq[3]];
-        maxcos = (cosalpha > maxcos) ? (main_element = 3, cosalpha) : maxcos;
+        for ( i = 1; i < 4; ++i )
+        {
+            float cosalpha = dp[i] * inv_vect_length[seq[i]];
+            if (cosalpha > maxcos)
+            {
+                main_element = i;
+                maxcos = cosalpha;
+            }
+        }
 
         /*rotate calipers*/
         {