0024484: sprops gives incorrect matrix of inertia and moments
authorskv <skv@opencascade.com>
Thu, 26 Dec 2013 11:29:45 +0000 (15:29 +0400)
committerbugmaster <bugmaster@opencascade.com>
Thu, 26 Dec 2013 11:31:24 +0000 (15:31 +0400)
Added test case bugs/modalg_5/bug24484

src/GProp/GProp_SGProps.gxx
tests/bugs/modalg_5/bug24484 [new file with mode: 0644]

index 2a3c40b..f0d812e 100644 (file)
@@ -518,12 +518,14 @@ static Standard_Real CCompute(Face&                  S,
                           LocIxy = FuncAdd(LocIxy, FuncMul(x, YdS));
                           LocIyz = FuncAdd(LocIyz, FuncMul(y, ZdS));
                           LocIxz = FuncAdd(LocIxz, FuncMul(x, ZdS));
                           LocIxy = FuncAdd(LocIxy, FuncMul(x, YdS));
                           LocIyz = FuncAdd(LocIyz, FuncMul(y, ZdS));
                           LocIxz = FuncAdd(LocIxz, FuncMul(x, ZdS));
-                          x = Precision::IsInfinite(x) ? Precision::Infinite() : x*x;
-                          y = Precision::IsInfinite(y) ? Precision::Infinite() : y*y;
-                          z = Precision::IsInfinite(z) ? Precision::Infinite() : z*z;
-                          LocIxx = FuncAdd(LocIxx, FuncAdd(YdS, ZdS));
-                          LocIyy = FuncAdd(LocIyy, FuncAdd(XdS, ZdS));
-                          LocIzz = FuncAdd(LocIzz, FuncAdd(XdS, YdS));
+
+                          const Standard_Real XXdS = FuncMul(x, XdS);
+                          const Standard_Real YYdS = FuncMul(y, YdS);
+                          const Standard_Real ZZdS = FuncMul(z, ZdS);
+
+                          LocIxx = FuncAdd(LocIxx, FuncAdd(YYdS, ZZdS));
+                          LocIyy = FuncAdd(LocIyy, FuncAdd(XXdS, ZZdS));
+                          LocIzz = FuncAdd(LocIzz, FuncAdd(XXdS, YYdS));
                         }//for: iU
                       }//for: iGU
 
                         }//for: iU
                       }//for: iGU
 
@@ -788,12 +790,14 @@ static void Compute(Face& S, Domain& D, const gp_Pnt& loc, Standard_Real& dim, g
         LocIxy = FuncAdd(LocIxy, FuncMul(x, YdS));
         LocIyz = FuncAdd(LocIyz, FuncMul(y, ZdS));
         LocIxz = FuncAdd(LocIxz, FuncMul(x, ZdS));
         LocIxy = FuncAdd(LocIxy, FuncMul(x, YdS));
         LocIyz = FuncAdd(LocIyz, FuncMul(y, ZdS));
         LocIxz = FuncAdd(LocIxz, FuncMul(x, ZdS));
-        x = Precision::IsInfinite(x) ? Precision::Infinite() : x*x;
-        y = Precision::IsInfinite(y) ? Precision::Infinite() : y*y;
-        z = Precision::IsInfinite(z) ? Precision::Infinite() : z*z;
-        LocIxx = FuncAdd(LocIxx, FuncAdd(YdS, ZdS));
-        LocIyy = FuncAdd(LocIyy, FuncAdd(XdS, ZdS));
-        LocIzz = FuncAdd(LocIzz, FuncAdd(XdS, YdS));
+
+        const Standard_Real XXdS = FuncMul(x, XdS);
+        const Standard_Real YYdS = FuncMul(y, YdS);
+        const Standard_Real ZZdS = FuncMul(z, ZdS);
+        
+        LocIxx = FuncAdd(LocIxx, FuncAdd(YYdS, ZZdS));
+        LocIyy = FuncAdd(LocIyy, FuncAdd(XXdS, ZZdS));
+        LocIzz = FuncAdd(LocIzz, FuncAdd(XXdS, YYdS));
       }
 
       CArea = FuncAdd(CArea, FuncMul(LocArea, ur));
       }
 
       CArea = FuncAdd(CArea, FuncMul(LocArea, ur));
@@ -919,12 +923,14 @@ static void Compute(const Face& S,
       Ixyi = FuncAdd(Ixyi, FuncMul(x, YdS));
       Iyzi = FuncAdd(Iyzi, FuncMul(y, ZdS));
       Ixzi = FuncAdd(Ixzi, FuncMul(x, ZdS));
       Ixyi = FuncAdd(Ixyi, FuncMul(x, YdS));
       Iyzi = FuncAdd(Iyzi, FuncMul(y, ZdS));
       Ixzi = FuncAdd(Ixzi, FuncMul(x, ZdS));
-      x = Precision::IsInfinite(x) ? Precision::Infinite() : x*x;
-      y = Precision::IsInfinite(y) ? Precision::Infinite() : y*y;
-      z = Precision::IsInfinite(z) ? Precision::Infinite() : z*z;
-      Ixxi = FuncAdd(Ixxi, FuncAdd(YdS, ZdS));
-      Iyyi = FuncAdd(Iyyi, FuncAdd(XdS, ZdS));
-      Izzi = FuncAdd(Izzi, FuncAdd(XdS, YdS));
+
+      const Standard_Real XXdS = FuncMul(x, XdS);
+      const Standard_Real YYdS = FuncMul(y, YdS);
+      const Standard_Real ZZdS = FuncMul(z, ZdS);
+
+      Ixxi = FuncAdd(Ixxi, FuncAdd(YYdS, ZZdS));
+      Iyyi = FuncAdd(Iyyi, FuncAdd(XXdS, ZZdS));
+      Izzi = FuncAdd(Izzi, FuncAdd(XXdS, YYdS));
     }
 
     dim   = FuncAdd(dim, FuncMul(dsi, GaussWV (j)));
     }
 
     dim   = FuncAdd(dim, FuncMul(dsi, GaussWV (j)));
diff --git a/tests/bugs/modalg_5/bug24484 b/tests/bugs/modalg_5/bug24484
new file mode 100644 (file)
index 0000000..fa06e7b
--- /dev/null
@@ -0,0 +1,35 @@
+puts "==========="
+puts "OCC24484"
+puts "==========="
+puts ""
+#########################################################
+# sprops gives incorrect matrix of inertia and moments
+#########################################################
+
+set IX_ch 2.66667e+08
+set IY_ch 1.33333e+08
+set IZ_ch 1.33333e+08
+set iner_ch1 1.33333e+08
+set iner_ch2 2.66667e+08
+set iner_ch3 1.33333e+08
+restore [locate_data_file bug24484_Face_2.brep] result
+set info [sprops result]
+
+regexp {IX += +([-0-9.+eE]+)} $info full IX
+regexp {IY += +([-0-9.+eE]+)} $info full IY
+regexp {IZ += +([-0-9.+eE]+)} $info full IZ
+regexp -all {Matrix of Inertia :[\t\n]*[\s\t]*([-0-9.+eE]+)[\s\t]*[-0-9.+eE]+[\s\t]*[-0-9.+eE]+[\t\n]*[\s\t]*[-0-9.+eE]+[\s\t]*([-0-9.+eE]+)[\s\t]*[-0-9.+eE]+[\t\n]*[\s\t]*[-0-9.+eE]+[\s\t]*[-0-9.+eE]+[\s\t]*([-0-9.+eE]+)} $info full iner1 iner2 iner3
+
+if { $IX != $IX_ch || $IY != $IY_ch || $IZ != $IZ_ch } {
+    puts "Error : Moments are incorrect"
+} else {
+    puts "OK : Moments are correct"
+}
+
+if { $iner1 != $iner_ch1 || $iner2 != $iner_ch2 || $iner3 != $iner_ch3 } {
+    puts "Error : Matrix of Inertia is incorrect"
+} else {
+    puts "OK : Matrix of Inertia is correct"
+}
+
+set 2dviewer 1