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 |
29 | ProjLib_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 | } |