0026937: Eliminate NO_CXX_EXCEPTION macro support
[occt.git] / src / ProjLib / ProjLib_PrjResolve.cxx
CommitLineData
b311480e 1// Created on: 1997-11-06
2// Created by: Roman BORISOV
3// Copyright (c) 1997-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 8// This library is free software; you can redistribute it and/or modify it under
9// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 10// by the Free Software Foundation, with special exception defined in the file
11// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12// distribution for complete text of the license and disclaimer of any warranty.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
42cf5bc1 17
18#include <Adaptor3d_Curve.hxx>
19#include <Adaptor3d_Surface.hxx>
20#include <gp_Pnt2d.hxx>
7fd59977 21#include <math_FunctionSetRoot.hxx>
22#include <math_NewtonFunctionSetRoot.hxx>
42cf5bc1 23#include <ProjLib_PrjFunc.hxx>
24#include <ProjLib_PrjResolve.hxx>
25#include <Standard_ConstructionError.hxx>
26#include <Standard_DomainError.hxx>
27#include <StdFail_NotDone.hxx>
7fd59977 28
b311480e 29ProjLib_PrjResolve::ProjLib_PrjResolve(const Adaptor3d_Curve& C,const Adaptor3d_Surface& S,const Standard_Integer Fix) : myFix(Fix)
7fd59977 30{
9775fa61 31 if (myFix > 3 || myFix < 1) throw Standard_ConstructionError();
7fd59977 32 mySolution = gp_Pnt2d(0.,0.);
33 myCurve = (Adaptor3d_CurvePtr)&C;
34 mySurface = (Adaptor3d_SurfacePtr)&S;
35}
36
37// void ProjLib_PrjResolve::Perform(const Standard_Real t, const Standard_Real U, const Standard_Real V, const gp_Pnt2d& Tol2d, const gp_Pnt2d& Inf, const gp_Pnt2d& Sup, const Standard_Real FuncTol, const Standard_Boolean StrictInside)
38 void ProjLib_PrjResolve::Perform(const Standard_Real t, const Standard_Real U, const Standard_Real V, const gp_Pnt2d& Tol2d, const gp_Pnt2d& Inf, const gp_Pnt2d& Sup, const Standard_Real FuncTol, const Standard_Boolean )
39{
40
41 myDone = Standard_False;
42 Standard_Real FixVal = 0.;
43 gp_Pnt2d ExtInf(0.,0.), ExtSup(0.,0.);
44 Standard_Real ExtU = 10*Tol2d.X(), ExtV = 10*Tol2d.Y();
45 math_Vector Tol(1, 2), Start(1, 2), BInf(1, 2), BSup(1, 2);
46
47 ExtInf.SetCoord(Inf.X() - ExtU, Inf.Y() - ExtV);
48 ExtSup.SetCoord(Sup.X() + ExtU, Sup.Y() + ExtV);
49 BInf(1) = ExtInf.X();
50 BInf(2) = ExtInf.Y();
51 BSup(1) = ExtSup.X();
52 BSup(2) = ExtSup.Y();
53 Tol(1) = Tol2d.X();
54 Tol(2) = Tol2d.Y();
55
56 switch(myFix) {
57 case 1:
58 Start(1) = U;
59 Start(2) = V;
60 FixVal = t;
61 break;
62 case 2:
63 Start(1) = t;
64 Start(2) = V;
65 FixVal = U;
66 break;
67 case 3:
68 Start(1) = t;
69 Start(2) = U;
70 FixVal = V;
71 }
72
73 ProjLib_PrjFunc F(myCurve, FixVal, mySurface, myFix);
74
75
76// Standard_Integer option = 1;//2;
77// if (option == 1) {
78// math_FunctionSetRoot S1 (F, Start,Tol, BInf, BSup);
79// if (!S1.IsDone()) { return; }
80// }
81// else {
859a47c3 82 math_NewtonFunctionSetRoot SR (F, Tol, 1.e-10);
83 SR.Perform(F, Start, BInf, BSup);
7fd59977 84// if (!SR.IsDone()) { return; }
859a47c3 85 if (!SR.IsDone())
86 {
87 math_FunctionSetRoot S1 (F, Tol);
88 S1.Perform(F, Start, BInf, BSup);
7fd59977 89
859a47c3 90 if (!S1.IsDone())
91 return;
92 }
7fd59977 93
94 mySolution.SetXY(F.Solution().XY());
95
96// computation of myDone
97 myDone = Standard_True;
98
99 Standard_Real ExtraU , ExtraV;
100// if(!StrictInside) {
101 ExtraU = Tol2d.X();
102 ExtraV = Tol2d.Y();
103// }
c84d6e55 104 if (mySolution.X() > Inf.X() - Tol2d.X() && mySolution.X() < Inf.X()) mySolution.SetX(Inf.X());
105 if (mySolution.X() > Sup.X() && mySolution.X() < Sup.X() + Tol2d.X()) mySolution.SetX(Sup.X());
106 if (mySolution.Y() > Inf.Y() - Tol2d.Y() && mySolution.Y() < Inf.Y()) mySolution.SetY(Inf.Y());
107 if (mySolution.Y() > Sup.Y() && mySolution.Y() < Sup.Y() + Tol2d.Y()) mySolution.SetY(Sup.Y());
108 if (mySolution.X() < Inf.X() - ExtraU ||
7fd59977 109 mySolution.X() > Sup.X() + ExtraU ||
c84d6e55 110 mySolution.Y() < Inf.Y() - ExtraV ||
7fd59977 111 mySolution.Y() > Sup.Y() + ExtraV) myDone = Standard_False;
112 else if (FuncTol > 0) {
113 math_Vector X(1,2,0.), FVal(1,2,0.);
114 X(1) = mySolution.X();
115 X(2) = mySolution.Y();
116
117
118 F.Value(X, FVal);
7fd59977 119
120 if ((FVal(1)*FVal(1) + FVal(2)*FVal(2)) > FuncTol) myDone = Standard_False;
121 }
122
123
124}
125
126 Standard_Boolean ProjLib_PrjResolve::IsDone() const
127{
128 return myDone;
129}
130
131 gp_Pnt2d ProjLib_PrjResolve::Solution() const
132{
9775fa61 133 if (!IsDone()) throw StdFail_NotDone();
7fd59977 134 return mySolution;
135}