]> OCCT Git - occt.git/commitdiff
0032863: Cone surface returns wrong v derivative IR-2022-03-25
authorazv <azv@opencascade.com>
Thu, 24 Mar 2022 19:21:06 +0000 (22:21 +0300)
committersmoskvin <smoskvin@opencascade.com>
Fri, 25 Mar 2022 17:13:38 +0000 (20:13 +0300)
* Fix error on computing V first derivative on a cone (take into account the slope of the conical generatrix).
* Add DRAW command 'sderivative' to compute certain derivative on a surface.

src/ElSLib/ElSLib.cxx
src/GeomliteTest/GeomliteTest_SurfaceCommands.cxx
tests/bugs/modalg_7/bug32863 [new file with mode: 0644]

index 3b61b314085925b27d147d354d9c9113709f5d32..f13c9243f6f6c60dd54a8ed8114364a7602fa2c3 100644 (file)
@@ -176,6 +176,8 @@ gp_Vec ElSLib::ConeDN (const Standard_Real    U,
    }
    else if(Nv == 1) { 
      Xdir.Multiply(sin(SAngle));
+     if (Nu == 0)
+       Xdir.Add(Pos.Direction().XYZ() * cos(SAngle));
      return gp_Vec(Xdir);     
    }
    return gp_Vec(0.0,0.0,0.0);
index 62caa72ca2de47b1ea7fb35459a098e3b13f6f58..340554b77eb6732afe26f471298f742c5bcf35cf 100644 (file)
@@ -941,6 +941,36 @@ static Standard_Integer value (Draw_Interpretor& ,
   return 0;
 }
 
+//=======================================================================
+//function : derivative
+//purpose  : 
+//=======================================================================
+
+static Standard_Integer derivative(Draw_Interpretor&,
+                                   Standard_Integer theArgc,
+                                   const char** theArgv)
+{
+  if (theArgc != 9)
+    return 1;
+
+  Handle(Geom_Surface) aSurf = DrawTrSurf::GetSurface(theArgv[1]);
+  if (aSurf.IsNull())
+    return 1;
+
+  Standard_Real aU = Draw::Atof(theArgv[2]);
+  Standard_Real aV = Draw::Atof(theArgv[3]);
+  Standard_Integer aNu = Draw::Atoi(theArgv[4]);
+  Standard_Integer aNv = Draw::Atoi(theArgv[5]);
+
+  gp_Vec aDeriv = aSurf->DN(aU, aV, aNu, aNv);
+
+  Draw::Set(theArgv[6], aDeriv.X());
+  Draw::Set(theArgv[7], aDeriv.Y());
+  Draw::Set(theArgv[8], aDeriv.Z());
+
+  return 0;
+}
+
 //=======================================================================
 //function : movepole
 //purpose  : 
@@ -1851,6 +1881,15 @@ void  GeomliteTest::SurfaceCommands(Draw_Interpretor& theCommands)
                  __FILE__,
                  value,g);
 
+  theCommands.Add("sderivative",
+    "sderivative surfname U V NU NV X Y Z\n"
+    "    surfname : name of surface\n"
+    "    U V      : coordinates on probe point on surface\n"
+    "    NU NV    : order of derivative along U and V\n"
+    "    X Y Z    : output coordinates of the derivative",
+    __FILE__,
+    derivative, g);
+
   theCommands.Add("parameters",
                  "parameters surf/curve X Y [Z] Tol U [V] : {X Y Z} point, {U V} output parameter(s)",
                  __FILE__,
diff --git a/tests/bugs/modalg_7/bug32863 b/tests/bugs/modalg_7/bug32863
new file mode 100644 (file)
index 0000000..3094c94
--- /dev/null
@@ -0,0 +1,43 @@
+puts "================================================="
+puts "0032863: Cone surface returns wrong v derivative "
+puts "================================================="
+puts ""
+
+cone c 0.2 2.0
+
+set u 5.23290599890759
+set v 5.06498283391571
+
+# reference data
+svalue c  $u $v  x y z  dux duy duz  dvx dvy dvz  d2ux d2uy d2uz  d2vx d2vy d2vz  d2uvx d2uvy d2uvz
+set dxRef [list [dval x] [dval dux] [dval dvx] [dval d2ux] [dval d2uvx] [dval d2vx]]
+set dyRef [list [dval y] [dval duy] [dval dvy] [dval d2uy] [dval d2uvy] [dval d2vy]]
+set dzRef [list [dval z] [dval duz] [dval dvz] [dval d2uz] [dval d2uvz] [dval d2vz]]
+
+# compute derivatives till the second order
+puts "======================================="
+set tolerance 1.e-7
+for {set order 1} {$order <= 2} {incr order} {
+  for {set nv 0} {$nv <= $order} {incr nv} {
+    set nu [expr $order - $nv]
+    
+    set offset [expr $order * ($order + 1) / 2 + $nv]
+    set ref_dx [lindex $dxRef $offset]
+    set ref_dy [lindex $dyRef $offset]
+    set ref_dz [lindex $dzRef $offset]
+
+    sderivative c  $u $v  $nu $nv  dx dy dz
+    set dx [dval dx]
+    set dy [dval dy]
+    set dz [dval dz]
+
+    puts ""
+    puts "Order of derivative: Nu = $nu, Nv = $nv"
+    puts "Expected ($ref_dx, $ref_dy, $ref_dz)"
+    puts "Actual   ($dx, $dy, $dz)"
+    checkreal "dX " $dx $ref_dx $tolerance $tolerance
+    checkreal "dY " $dy $ref_dy $tolerance $tolerance
+    checkreal "dZ " $dz $ref_dz $tolerance $tolerance
+    puts "======================================="
+  }
+}