1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-14 13:30:48 +03:00

0023906: Performance of the projection algorithm in some cases became lower after integration of the fix for the bug 0022610.

New search algorithm Extrema_ExtAlgo_Tree used in projection algorithm in Boolean Operations.
Extrema is set to search only min distance.
Add test case for this fix
Draw command projponf has been modified to provide possibility to change the default parameters of Extrema_ExtPS algorithm:
projponf f pnt [extrema flag: -min/-max/-minmax] [extrema algo: -g(grad)/-t(tree)]
-min - Extrema_ExtFlag_MIN;
-max - Extrema_ExtFlag_MAX;
-minmax - Extrema_ExtFlag_MINMAX (default);
-g - Extrema_ExtAlgo_Grad (default);
-t - Extrema_ExtAlgo_Tree;
Examples:
projponf f pnt -min  - the parameters are Extrema_ExtFlag_MIN and Extrema_ExtAlgo_Grad;
projponf f pnt -t  - the parameters are Extrema_ExtFlag_MINMAX and Extrema_ExtAlgo_Tree;
projponf f pnt -min -t  - the parameters are Extrema_ExtFlag_MIN and Extrema_ExtAlgo_Tree;
This commit is contained in:
emv
2013-05-16 17:55:09 +04:00
parent db56cc2d24
commit d633fd7069
5 changed files with 119 additions and 18 deletions

View File

@@ -201,10 +201,21 @@ Standard_EXPORT Standard_Boolean FUN_tool_projPonC2D(const gp_Pnt& P,
// ----------------------------------------------------------------------
Standard_EXPORT Standard_Boolean FUN_tool_projPonS(const gp_Pnt& P,
const Handle(Geom_Surface)& S,
gp_Pnt2d& UV,Standard_Real& dist)
{
GeomAPI_ProjectPointOnSurf PonS(P,S);
const Handle(Geom_Surface)& S,
gp_Pnt2d& UV,Standard_Real& dist,
const Extrema_ExtFlag aExtFlag,
const Extrema_ExtAlgo aExtAlgo)
{
Standard_Real UMin, UMax, VMin, VMax;
GeomAPI_ProjectPointOnSurf PonS;
//
S->Bounds(UMin, UMax, VMin, VMax);
PonS.Init(S, UMin, UMax, VMin, VMax, aExtAlgo);
Extrema_ExtPS& anExtAlgo = const_cast<Extrema_ExtPS&>(PonS.Extrema());
anExtAlgo.SetFlag(aExtFlag);
//
PonS.Perform(P);
//
if (!PonS.Extrema().IsDone()) return Standard_False;
if (PonS.NbPoints() == 0) return Standard_False;
dist = PonS.LowerDistance();
@@ -272,10 +283,12 @@ Standard_EXPORT Standard_Boolean FUN_tool_projPonboundedF(const gp_Pnt& P,const
// ----------------------------------------------------------------------
Standard_EXPORT Standard_Boolean FUN_tool_projPonF(const gp_Pnt& P,const TopoDS_Face& F,
gp_Pnt2d& UV,Standard_Real& dist)
gp_Pnt2d& UV,Standard_Real& dist,
const Extrema_ExtFlag aExtFlag,
const Extrema_ExtAlgo aExtAlgo)
{
dist = 1.;
Handle(Geom_Surface) S = BRep_Tool::Surface(F);
Standard_Boolean ok = FUN_tool_projPonS(P,S,UV,dist);
Standard_Boolean ok = FUN_tool_projPonS(P,S,UV,dist, aExtFlag, aExtAlgo);
return ok;
}

View File

@@ -31,6 +31,8 @@
#include <BRepAdaptor_Curve2d.hxx>
#include <Extrema_ExtPC.hxx>
#include <Extrema_ExtPC2d.hxx>
#include <Extrema_ExtFlag.hxx>
#include <Extrema_ExtAlgo.hxx>
// ----------------------------------------------------------------------
// project point <P> on geometries (curve <C>,surface <S>)
@@ -44,7 +46,9 @@ Standard_EXPORT Standard_Boolean FUN_tool_projPonC(const gp_Pnt& P,const BRepAda
Standard_EXPORT Standard_Boolean FUN_tool_projPonC2D(const gp_Pnt& P,const Standard_Real tole,const BRepAdaptor_Curve2d& BAC2D,const Standard_Real pmin,const Standard_Real pmax,Standard_Real& param,Standard_Real& dist);
Standard_EXPORT Standard_Boolean FUN_tool_projPonC2D(const gp_Pnt& P,const BRepAdaptor_Curve2d& BAC2D,const Standard_Real pmin,const Standard_Real pmax,Standard_Real& param,Standard_Real& dist);
Standard_EXPORT Standard_Boolean FUN_tool_projPonC2D(const gp_Pnt& P,const BRepAdaptor_Curve2d& BAC2D,Standard_Real& param,Standard_Real& dist);
Standard_EXPORT Standard_Boolean FUN_tool_projPonS(const gp_Pnt& P,const Handle(Geom_Surface)& S,gp_Pnt2d& UV,Standard_Real& dist);
Standard_EXPORT Standard_Boolean FUN_tool_projPonS(const gp_Pnt& P,const Handle(Geom_Surface)& S,gp_Pnt2d& UV,Standard_Real& dist,
const Extrema_ExtFlag aExtFlag=Extrema_ExtFlag_MINMAX,
const Extrema_ExtAlgo aExtAlgo=Extrema_ExtAlgo_Grad);
// ----------------------------------------------------------------------
// project point <P> on topologies (edge <E>,face <F>)
@@ -52,6 +56,8 @@ Standard_EXPORT Standard_Boolean FUN_tool_projPonS(const gp_Pnt& P,const Handle(
Standard_EXPORT Standard_Boolean FUN_tool_projPonE(const gp_Pnt& P,const Standard_Real tole,const TopoDS_Edge& E,Standard_Real& param,Standard_Real& dist);
Standard_EXPORT Standard_Boolean FUN_tool_projPonE(const gp_Pnt& P,const TopoDS_Edge& E,Standard_Real& param,Standard_Real& dist);
Standard_EXPORT Standard_Boolean FUN_tool_projPonboundedF(const gp_Pnt& P,const TopoDS_Face& F,gp_Pnt2d& UV,Standard_Real& dist);
Standard_EXPORT Standard_Boolean FUN_tool_projPonF(const gp_Pnt& P,const TopoDS_Face& F,gp_Pnt2d& UV,Standard_Real& dist);
Standard_EXPORT Standard_Boolean FUN_tool_projPonF(const gp_Pnt& P,const TopoDS_Face& F,gp_Pnt2d& UV,Standard_Real& dist,
const Extrema_ExtFlag aExtFlag=Extrema_ExtFlag_MINMAX,
const Extrema_ExtAlgo aExtAlgo=Extrema_ExtAlgo_Grad);
#endif