diff --git a/src/ElSLib/ElSLib.cxx b/src/ElSLib/ElSLib.cxx index 3b61b31408..f13c9243f6 100644 --- a/src/ElSLib/ElSLib.cxx +++ b/src/ElSLib/ElSLib.cxx @@ -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); diff --git a/src/GeomliteTest/GeomliteTest_SurfaceCommands.cxx b/src/GeomliteTest/GeomliteTest_SurfaceCommands.cxx index 62caa72ca2..340554b77e 100644 --- a/src/GeomliteTest/GeomliteTest_SurfaceCommands.cxx +++ b/src/GeomliteTest/GeomliteTest_SurfaceCommands.cxx @@ -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 index 0000000000..3094c941c0 --- /dev/null +++ b/tests/bugs/modalg_7/bug32863 @@ -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 "=======================================" + } +}