//purpose :
//=======================================================================
Extrema_ExtCC::Extrema_ExtCC (const Standard_Real TolC1,
- const Standard_Real TolC2) :
- myDone (Standard_False)
+ const Standard_Real TolC2)
+: myIsFindSingleSolution(Standard_False),
+ myDone (Standard_False)
{
myC[0] = 0; myC[1] = 0;
myTol[0] = TolC1; myTol[1] = TolC2;
//purpose :
//=======================================================================
-Extrema_ExtCC::Extrema_ExtCC(const Adaptor3d_Curve& C1,
- const Adaptor3d_Curve& C2,
- const Standard_Real U1,
- const Standard_Real U2,
- const Standard_Real V1,
- const Standard_Real V2,
- const Standard_Real TolC1,
- const Standard_Real TolC2)
-: myECC(C1, C2, U1, U2, V1, V2),
+Extrema_ExtCC::Extrema_ExtCC(const Adaptor3d_Curve& C1,
+ const Adaptor3d_Curve& C2,
+ const Standard_Real U1,
+ const Standard_Real U2,
+ const Standard_Real V1,
+ const Standard_Real V2,
+ const Standard_Real TolC1,
+ const Standard_Real TolC2)
+: myIsFindSingleSolution(Standard_False),
+ myECC(C1, C2, U1, U2, V1, V2),
myDone (Standard_False)
{
SetCurve (1, C1, U1, U2);
//=======================================================================
Extrema_ExtCC::Extrema_ExtCC(const Adaptor3d_Curve& C1,
- const Adaptor3d_Curve& C2,
- const Standard_Real TolC1,
- const Standard_Real TolC2)
-: myECC(C1, C2),
+ const Adaptor3d_Curve& C2,
+ const Standard_Real TolC1,
+ const Standard_Real TolC2)
+: myIsFindSingleSolution(Standard_False),
+ myECC(C1, C2),
myDone (Standard_False)
{
SetCurve (1, C1, C1.FirstParameter(), C1.LastParameter());
myECC.SetParams(*((Adaptor3d_Curve*)myC[0]),
*((Adaptor3d_Curve*)myC[1]), myInf[0], mySup[0], myInf[1], mySup[1]);
myECC.SetTolerance(Min(myTol[0], myTol[1]));
+ myECC.SetSingleSolutionFlag(GetSingleSolutionFlag());
myDone = Standard_False;
mypoints.Clear();
mySqDist.Clear();
}
}
}
+
+//=======================================================================
+//function : SetSingleSolutionFlag
+//purpose :
+//=======================================================================
+void Extrema_ExtCC::SetSingleSolutionFlag(const Standard_Boolean theFlag)
+{
+ myIsFindSingleSolution = theFlag;
+}
+
+//=======================================================================
+//function : GetSingleSolutionFlag
+//purpose :
+//=======================================================================
+Standard_Boolean Extrema_ExtCC::GetSingleSolutionFlag() const
+{
+ return myIsFindSingleSolution;
+}
#include <StdFail_NotDone.hxx>
Extrema_ExtCC2d::Extrema_ExtCC2d()
+: myIsFindSingleSolution(Standard_False)
{
}
-Extrema_ExtCC2d::Extrema_ExtCC2d(const Adaptor2d_Curve2d& C1,
- const Adaptor2d_Curve2d& C2,
- const Standard_Real TolC1,
- const Standard_Real TolC2)
+Extrema_ExtCC2d::Extrema_ExtCC2d(const Adaptor2d_Curve2d& C1,
+ const Adaptor2d_Curve2d& C2,
+ const Standard_Real TolC1,
+ const Standard_Real TolC2)
+: myIsFindSingleSolution(Standard_False)
{
Initialize(C2, Extrema_Curve2dTool::FirstParameter(C2), Extrema_Curve2dTool::LastParameter(C2), TolC1, TolC2);
Perform(C1, Extrema_Curve2dTool::FirstParameter(C1), Extrema_Curve2dTool::LastParameter(C1));
}
Extrema_ExtCC2d::Extrema_ExtCC2d(const Adaptor2d_Curve2d& C1,
- const Adaptor2d_Curve2d& C2,
- const Standard_Real U1,
- const Standard_Real U2,
- const Standard_Real V1,
- const Standard_Real V2,
- const Standard_Real TolC1,
- const Standard_Real TolC2)
+ const Adaptor2d_Curve2d& C2,
+ const Standard_Real U1,
+ const Standard_Real U2,
+ const Standard_Real V1,
+ const Standard_Real V2,
+ const Standard_Real TolC1,
+ const Standard_Real TolC2)
+: myIsFindSingleSolution(Standard_False)
{
Initialize(C2, V1, V2, TolC1, TolC2);
Perform(C1, U1, U2);
case GeomAbs_BezierCurve:
case GeomAbs_OtherCurve:
case GeomAbs_BSplineCurve: {
- Extrema_ECC2d Xtrem(C1, *((Adaptor2d_Curve2d*)myC));
- Xtrem.Perform();
- Standard_Real Period2 = 0.;
- if (Extrema_Curve2dTool::IsPeriodic(*((Adaptor2d_Curve2d*)myC))) Period2 = Extrema_Curve2dTool::Period(*((Adaptor2d_Curve2d*)myC));
- Results(Xtrem, U11, U12, U21, U22, 2*M_PI,Period2);
+ Extrema_ECC2d aParamSolver(C1, *((Adaptor2d_Curve2d*)myC));
+ aParamSolver.SetSingleSolutionFlag(GetSingleSolutionFlag());
+ aParamSolver.Perform();
+ Standard_Real Period2 = 0.;
+ if (Extrema_Curve2dTool::IsPeriodic(*((Adaptor2d_Curve2d*)myC))) Period2 = Extrema_Curve2dTool::Period(*((Adaptor2d_Curve2d*)myC));
+ Results(aParamSolver, U11, U12, U21, U22, 2*M_PI,Period2);
}
break;
case GeomAbs_Line: {
Results(Xtrem, U11, U12, U21, U22, 2*M_PI, 2*M_PI);
}
break;
- case GeomAbs_Ellipse: {
- //Extrema_ExtElC2d Xtrem(Extrema_Curve2dTool::Ellipse(C1), Extrema_Curve2dTool::Ellipse(*((Adaptor2d_Curve2d*)myC)));
- Extrema_ECC2d Xtrem(C1, *((Adaptor2d_Curve2d*)myC));
- Xtrem.Perform();
- Results(Xtrem, U11, U12, U21, U22,2*M_PI, 2*M_PI);
+ case GeomAbs_Ellipse:
+ {
+ Extrema_ECC2d aParamSolver(C1, *((Adaptor2d_Curve2d*)myC));
+ aParamSolver.SetSingleSolutionFlag(GetSingleSolutionFlag());
+ aParamSolver.Perform();
+ Results(aParamSolver, U11, U12, U21, U22,2*M_PI, 2*M_PI);
}
break;
case GeomAbs_Parabola: {
//Extrema_ExtElC2d Xtrem(Extrema_Curve2dTool::Ellipse(C1), Extrema_Curve2dTool::Parabola(*((Adaptor2d_Curve2d*)myC)));
- Extrema_ECC2d Xtrem(C1, *((Adaptor2d_Curve2d*)myC));
- Xtrem.Perform();
- Results(Xtrem, U11, U12, U21, U22, 2*M_PI, 0.);
+ Extrema_ECC2d aParamSolver(C1, *((Adaptor2d_Curve2d*)myC));
+ aParamSolver.SetSingleSolutionFlag(GetSingleSolutionFlag());
+ aParamSolver.Perform();
+ Results(aParamSolver, U11, U12, U21, U22, 2*M_PI, 0.);
}
break;
case GeomAbs_Hyperbola: {
//Extrema_ExtElC2d Xtrem(Extrema_Curve2dTool::Ellipse(C1), Extrema_Curve2dTool::Hyperbola(*((Adaptor2d_Curve2d*)myC)));
- Extrema_ECC2d Xtrem(C1, *((Adaptor2d_Curve2d*)myC));
- Xtrem.Perform();
- Results(Xtrem, U11, U12, U21, U22, 2*M_PI, 0.);
+ Extrema_ECC2d aParamSolver(C1, *((Adaptor2d_Curve2d*)myC));
+ aParamSolver.SetSingleSolutionFlag(GetSingleSolutionFlag());
+ aParamSolver.Perform();
+ Results(aParamSolver, U11, U12, U21, U22, 2*M_PI, 0.);
}
break;
case GeomAbs_BezierCurve:
case GeomAbs_OtherCurve:
case GeomAbs_BSplineCurve: {
- Extrema_ECC2d Xtrem(C1, *((Adaptor2d_Curve2d*)myC));
- Xtrem.Perform();
+ Extrema_ECC2d aParamSolver(C1, *((Adaptor2d_Curve2d*)myC));
+ aParamSolver.SetSingleSolutionFlag(GetSingleSolutionFlag());
+ aParamSolver.Perform();
Standard_Real Period2 = 0.;
if (Extrema_Curve2dTool::IsPeriodic(*((Adaptor2d_Curve2d*)myC))) Period2 = Extrema_Curve2dTool::Period(*((Adaptor2d_Curve2d*)myC));
- Results(Xtrem, U11, U12, U21, U22, 2*M_PI,Period2);
+ Results(aParamSolver, U11, U12, U21, U22, 2*M_PI,Period2);
}
break;
case GeomAbs_Line: {
case GeomAbs_Ellipse: {
//inverse = Standard_True;
//Extrema_ExtElC2d Xtrem(Extrema_Curve2dTool::Ellipse(*((Adaptor2d_Curve2d*)myC)), Extrema_Curve2dTool::Parabola(C1));
- Extrema_ECC2d Xtrem(C1, *((Adaptor2d_Curve2d*)myC));
- Xtrem.Perform();
- Results(Xtrem, U11, U12, U21, U22, 0., 2*M_PI);
+ Extrema_ECC2d aParamSolver(C1, *((Adaptor2d_Curve2d*)myC));
+ aParamSolver.SetSingleSolutionFlag(GetSingleSolutionFlag());
+ aParamSolver.Perform();
+ Results(aParamSolver, U11, U12, U21, U22, 0., 2*M_PI);
}
break;
case GeomAbs_Parabola: {
//Extrema_ExtElC2d Xtrem(Extrema_Curve2dTool::Parabola(C1), Extrema_Curve2dTool::Parabola(*((Adaptor2d_Curve2d*)myC)));
- Extrema_ECC2d Xtrem(C1, *((Adaptor2d_Curve2d*)myC));
- Xtrem.Perform();
- Results(Xtrem, U11, U12, U21, U22, 0., 0.);
+ Extrema_ECC2d aParamSolver(C1, *((Adaptor2d_Curve2d*)myC));
+ aParamSolver.SetSingleSolutionFlag(GetSingleSolutionFlag());
+ aParamSolver.Perform();
+ Results(aParamSolver, U11, U12, U21, U22, 0., 0.);
}
break;
case GeomAbs_Hyperbola: {
//inverse = Standard_True;
//Extrema_ExtElC2d Xtrem(Extrema_Curve2dTool::Hyperbola(*((Adaptor2d_Curve2d*)myC)), Extrema_Curve2dTool::Parabola(C1));
- Extrema_ECC2d Xtrem(C1, *((Adaptor2d_Curve2d*)myC));
- Xtrem.Perform();
- Results(Xtrem, U11, U12, U21, U22, 0., 0.);
+ Extrema_ECC2d aParamSolver(C1, *((Adaptor2d_Curve2d*)myC));
+ aParamSolver.SetSingleSolutionFlag(GetSingleSolutionFlag());
+ aParamSolver.Perform();
+ Results(aParamSolver, U11, U12, U21, U22, 0., 0.);
}
break;
case GeomAbs_BezierCurve:
case GeomAbs_OtherCurve:
case GeomAbs_BSplineCurve: {
- Extrema_ECC2d Xtrem(C1, *((Adaptor2d_Curve2d*)myC));
- Xtrem.Perform();
+ Extrema_ECC2d aParamSolver(C1, *((Adaptor2d_Curve2d*)myC));
+ aParamSolver.SetSingleSolutionFlag(GetSingleSolutionFlag());
+ aParamSolver.Perform();
Standard_Real Period2 = 0.;
if (Extrema_Curve2dTool::IsPeriodic(*((Adaptor2d_Curve2d*)myC))) Period2 = Extrema_Curve2dTool::Period(*((Adaptor2d_Curve2d*)myC));
- Results(Xtrem, U11, U12, U21, U22, 0., Period2);
+ Results(aParamSolver, U11, U12, U21, U22, 0., Period2);
}
break;
case GeomAbs_Line: {
case GeomAbs_Ellipse: {
//inverse = Standard_True;
//Extrema_ExtElC2d Xtrem(Extrema_Curve2dTool::Ellipse(*((Adaptor2d_Curve2d*)myC)), Extrema_Curve2dTool::Hyperbola(C1));
- Extrema_ECC2d Xtrem(C1, *((Adaptor2d_Curve2d*)myC));
- Xtrem.Perform();
- Results(Xtrem, U11, U12, U21, U22, 0., 2*M_PI );
+ Extrema_ECC2d aParamSolver(C1, *((Adaptor2d_Curve2d*)myC));
+ aParamSolver.SetSingleSolutionFlag(GetSingleSolutionFlag());
+ aParamSolver.Perform();
+ Results(aParamSolver, U11, U12, U21, U22, 0., 2*M_PI );
}
break;
case GeomAbs_Parabola: {
//Extrema_ExtElC2d Xtrem(Extrema_Curve2dTool::Hyperbola(C1), Extrema_Curve2dTool::Parabola(*((Adaptor2d_Curve2d*)myC)));
- Extrema_ECC2d Xtrem(C1, *((Adaptor2d_Curve2d*)myC));
- Xtrem.Perform();
- Results(Xtrem, U11, U12, U21, U22, 0., 0.);
+ Extrema_ECC2d aParamSolver(C1, *((Adaptor2d_Curve2d*)myC));
+ aParamSolver.SetSingleSolutionFlag(GetSingleSolutionFlag());
+ aParamSolver.Perform();
+ Results(aParamSolver, U11, U12, U21, U22, 0., 0.);
}
break;
case GeomAbs_Hyperbola: {
//Extrema_ExtElC2d Xtrem(Extrema_Curve2dTool::Hyperbola(C1), Extrema_Curve2dTool::Hyperbola(*((Adaptor2d_Curve2d*)myC)));
- Extrema_ECC2d Xtrem(C1, *((Adaptor2d_Curve2d*)myC));
- Xtrem.Perform();
- Results(Xtrem, U11, U12, U21, U22, 0., 0.);
+ Extrema_ECC2d aParamSolver(C1, *((Adaptor2d_Curve2d*)myC));
+ aParamSolver.SetSingleSolutionFlag(GetSingleSolutionFlag());
+ aParamSolver.Perform();
+ Results(aParamSolver, U11, U12, U21, U22, 0., 0.);
}
break;
case GeomAbs_OtherCurve:
case GeomAbs_BezierCurve:
case GeomAbs_BSplineCurve: {
- Extrema_ECC2d Xtrem(C1, *((Adaptor2d_Curve2d*)myC));
- Xtrem.Perform();
+ Extrema_ECC2d aParamSolver(C1, *((Adaptor2d_Curve2d*)myC));
+ aParamSolver.SetSingleSolutionFlag(GetSingleSolutionFlag());
+ aParamSolver.Perform();
Standard_Real Period2 = 0.;
if (Extrema_Curve2dTool::IsPeriodic(*((Adaptor2d_Curve2d*)myC))) Period2 = Extrema_Curve2dTool::Period(*((Adaptor2d_Curve2d*)myC));
- Results(Xtrem, U11, U12, U21, U22, 0., Period2);
+ Results(aParamSolver, U11, U12, U21, U22, 0., Period2);
}
break;
case GeomAbs_Line: {
case GeomAbs_BezierCurve:
case GeomAbs_OtherCurve:
case GeomAbs_BSplineCurve: {
- Extrema_ECC2d Xtrem(C1, *((Adaptor2d_Curve2d*)myC));
- Xtrem.Perform();
+ Extrema_ECC2d aParamSolver(C1, *((Adaptor2d_Curve2d*)myC));
+ aParamSolver.SetSingleSolutionFlag(GetSingleSolutionFlag());
+ aParamSolver.Perform();
Standard_Real Period1 = 0.;
if (Extrema_Curve2dTool::IsPeriodic(C1)) Period1 = Extrema_Curve2dTool::Period(C1);
Standard_Real Period2 = 0.;
if (Extrema_Curve2dTool::IsPeriodic(*((Adaptor2d_Curve2d*)myC))) Period2 = Extrema_Curve2dTool::Period(*((Adaptor2d_Curve2d*)myC));
- Results(Xtrem, U11, U12, U21, U22, Period1, Period2);
+ Results(aParamSolver, U11, U12, U21, U22, Period1, Period2);
}
break;
case GeomAbs_BezierCurve:
case GeomAbs_OtherCurve:
case GeomAbs_BSplineCurve: {
- Extrema_ECC2d Xtrem(C1, *((Adaptor2d_Curve2d*)myC));
- Xtrem.Perform();
+ Extrema_ECC2d aParamSolver(C1, *((Adaptor2d_Curve2d*)myC));
+ aParamSolver.SetSingleSolutionFlag(GetSingleSolutionFlag());
+ aParamSolver.Perform();
Standard_Real Period2 = 0.;
if (Extrema_Curve2dTool::IsPeriodic(*((Adaptor2d_Curve2d*)myC))) Period2 = Extrema_Curve2dTool::Period(*((Adaptor2d_Curve2d*)myC));
- Results(Xtrem, U11, U12, U21, U22, 0., Period2);
+ Results(aParamSolver, U11, U12, U21, U22, 0., Period2);
}
break;
case GeomAbs_Line: {
if (!myDone) StdFail_NotDone::Raise();
return myIsPar;
}
+
+//=======================================================================
+//function : SetSingleSolutionFlag
+//purpose :
+//=======================================================================
+void Extrema_ExtCC2d::SetSingleSolutionFlag(const Standard_Boolean theFlag)
+{
+ myIsFindSingleSolution = theFlag;
+}
+
+//=======================================================================
+//function : GetSingleSolutionFlag
+//purpose :
+//=======================================================================
+Standard_Boolean Extrema_ExtCC2d::GetSingleSolutionFlag() const
+{
+ return myIsFindSingleSolution;
+}