0031407: [Regression to 7.3.0] Extrema does not process parallel circles correctly IR-2020-03-06 WEEK-10
authorazv <azv@opencascade.com>
Thu, 5 Mar 2020 08:07:37 +0000 (11:07 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 6 Mar 2020 13:05:19 +0000 (16:05 +0300)
Use correct ranges of circles when processing the concentric case. Repeat the range comparison 3 times shifting each time for a half-period to process the extrema between boundary points of arcs.

src/Extrema/Extrema_ExtCC.cxx
tests/bugs/modalg_7/bug31407_1 [new file with mode: 0644]
tests/bugs/modalg_7/bug31407_2 [new file with mode: 0644]
tests/bugs/modalg_7/bug31407_3 [new file with mode: 0644]

index ed7dd90..7e23dab 100644 (file)
@@ -553,7 +553,7 @@ void Extrema_ExtCC::PrepareParallelResult(const Standard_Real theUt11,
       if ((aRange.Delta() > Precision::Angular()) &&
           ((aPar2 - aPar1) < Precision::Angular()))
       {
-        aPar1 -= aPeriod;
+        aPar2 += aPeriod;
       }
     }
 
@@ -562,11 +562,13 @@ void Extrema_ExtCC::PrepareParallelResult(const Standard_Real theUt11,
 
     Standard_Real aMinSquareDist = RealLast();
 
-    aProjRng1.Add(aPar1 - M_PI);
-    aProjRng1.Add(aPar2 - M_PI);
-    for (Standard_Integer i = 0; i < 2; i++)
+    aProjRng1.Add(aPar1 - aPeriod);
+    aProjRng1.Add(aPar2 - aPeriod);
+    for (Standard_Integer i = 0; i < 3; i++)
     {
-      // Repeat computation twice
+      // Repeat computation three times, shifting the range to PI on each step,
+      // to be able to find if the concentric arcs ranges are intersected in just one parameter
+      // (lower or upper boundary).
 
       Bnd_Range aRng = aProjRng1;
       aRng.Common(aRange);
diff --git a/tests/bugs/modalg_7/bug31407_1 b/tests/bugs/modalg_7/bug31407_1
new file mode 100644 (file)
index 0000000..a6a0164
--- /dev/null
@@ -0,0 +1,13 @@
+puts "========"
+puts "0031407: Extrema does not process parallel circles correctly"
+puts "========"
+puts ""
+
+circle c1  0 0 0  0 0 1  5
+circle c2  0 0 0  0 0 1  10
+
+if { [regexp "Infinite number of extremas" [extrema c1 c2]] == 1} {
+  puts "OK : Circles are treated as concentric"
+} else {
+  puts "Error : Extrema does not find the circles are parallel"
+}
diff --git a/tests/bugs/modalg_7/bug31407_2 b/tests/bugs/modalg_7/bug31407_2
new file mode 100644 (file)
index 0000000..4f569fb
--- /dev/null
@@ -0,0 +1,13 @@
+puts "========"
+puts "0031407: Extrema does not process parallel circles correctly"
+puts "========"
+puts ""
+
+circle c1  0 0 0  0 0 -1  5
+circle c2  0 0 0  0 0 1  10
+
+if { [regexp "Infinite number of extremas" [extrema c1 c2]] == 1} {
+  puts "OK : Circles are treated as concentric"
+} else {
+  puts "Error : Extrema does not find the circles are parallel"
+}
diff --git a/tests/bugs/modalg_7/bug31407_3 b/tests/bugs/modalg_7/bug31407_3
new file mode 100644 (file)
index 0000000..dbe0e19
--- /dev/null
@@ -0,0 +1,20 @@
+puts "========"
+puts "0031407: Extrema does not process parallel circles correctly"
+puts "========"
+puts ""
+
+circle c1  0 0 0  0 0 1  5
+circle c2  0 0 0  0 0 1  10
+
+trim cc1 c1 0 2
+trim cc2 c2 2 4
+
+set res_extrema [extrema cc1 cc2]
+
+if { [regexp "Infinite number of extremas" $res_extrema] == 0} {
+  if {[llength $res_extrema] != 1} {
+    puts "Error : expected 1 extrema, but found [llength $res_extrema]"
+  }
+} else {
+  puts "Error : Infinite number of extremas is found"
+}