0023024: Update headers of OCCT files
[occt.git] / src / BRepBlend / BRepBlend_SurfPointEvolRadInv.cxx
1 // Created on: 1997-07-29
2 // Created by: Jerome LEMONIER
3 // Copyright (c) 1997-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
5 //
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
10 //
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 //
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
20
21
22
23 #include <BRepBlend_SurfPointEvolRadInv.ixx>
24
25
26 //=======================================================================
27 //function : 
28 //purpose  : 
29 //=======================================================================
30 BRepBlend_SurfPointEvolRadInv::BRepBlend_SurfPointEvolRadInv
31 (const Handle(Adaptor3d_HSurface)& S,
32 const Handle(Adaptor3d_HCurve)& C,
33  const Handle(Law_Function)& Evol
34 ) : surf(S), curv(C)
35 { tevol=Evol;
36 }
37
38 //=======================================================================
39 //function : 
40 //purpose  : 
41 //=======================================================================
42  void BRepBlend_SurfPointEvolRadInv::Set(const Standard_Integer Choix) 
43 {  choix = Choix;
44   switch (choix) {
45   case 1 :
46   case 2 :
47     sg1 = -1;
48     break;
49   case 3 :
50   case 4 :
51     sg1 = 1;
52     break;
53   default :
54     sg1 = -1;
55     break;
56   }
57 }
58
59 //=======================================================================
60 //function : 
61 //purpose  : 
62 //=======================================================================
63  Standard_Integer BRepBlend_SurfPointEvolRadInv::NbEquations() const
64 {
65   return 3;
66 }
67
68 //=======================================================================
69 //function : 
70 //purpose  : 
71 //=======================================================================
72  Standard_Boolean BRepBlend_SurfPointEvolRadInv::Value(const math_Vector& X,math_Vector& F) 
73 {
74   Standard_Real theD,norm,unsurnorm;
75   gp_Pnt ptcur,pts;
76   gp_Vec d1cur,d1u,d1v;
77   gp_XYZ nplan(0.,0.,0.),ns(0.,0.,0.),ref(0.,0.,0.);
78   curv->D1(X(1),ptcur,d1cur);
79   ray = sg1*tevol->Value(X(1));
80   nplan = d1cur.Normalized().XYZ();
81   theD = -(nplan.Dot(ptcur.XYZ()));
82   surf->D1(X(2),X(3),pts,d1u,d1v);
83   F(1) = nplan.Dot(point.XYZ()) + theD;
84   F(2) = nplan.Dot(pts.XYZ()) + theD;
85   ns = d1u.Crossed(d1v).XYZ();
86   norm = nplan.Crossed(ns).Modulus();
87   unsurnorm = 1./norm;
88   ns.SetLinearForm(nplan.Dot(ns),nplan, -1.,ns);
89   ns.Multiply(unsurnorm);
90   ref = pts.XYZ() - point.XYZ();
91   ref.SetLinearForm(ray,ns,ref);
92   F(3) = ref.SquareModulus() - ray*ray;
93   return Standard_True;
94 }
95
96 //=======================================================================
97 //function : 
98 //purpose  : 
99 //=======================================================================
100  Standard_Boolean BRepBlend_SurfPointEvolRadInv::Derivatives(const math_Vector& X,math_Matrix& D) 
101 {
102   gp_Pnt ptcur,pts;
103   gp_Vec d1cur,d2cur,nplan,dnplan,d1u,d1v,d2u,d2v,duv;
104   Standard_Real theD, dtheD, normd1cur, unsurnormd1cur,dray;
105
106   curv->D2(X(1),ptcur,d1cur,d2cur);
107   tevol->D1(X(1),ray,dray);
108   ray=sg1*ray;
109   dray=sg1*dray;
110   normd1cur = d1cur.Magnitude();
111   unsurnormd1cur = 1./normd1cur;
112   nplan = unsurnormd1cur * d1cur;
113   theD = -(nplan.XYZ().Dot(ptcur.XYZ()));
114   dnplan.SetLinearForm(-nplan.Dot(d2cur),nplan,d2cur);
115   dnplan.Multiply(unsurnormd1cur);
116   dtheD = - nplan.XYZ().Dot(d1cur.XYZ()) - dnplan.XYZ().Dot(ptcur.XYZ());
117   D(1,1) = dnplan.XYZ().Dot(point.XYZ()) + dtheD;
118   D(1,2) = D(1,3) = 0.;
119   surf->D2(X(2),X(3),pts,d1u,d1v,d2u,d2v,duv);
120   D(2,1) = dnplan.XYZ().Dot(pts.XYZ()) + dtheD;
121   D(2,2) = nplan.Dot(d1u);
122   D(2,3) = nplan.Dot(d1v);
123   
124   gp_Vec nsurf = d1u.Crossed(d1v);
125   gp_Vec dunsurf = d2u.Crossed(d1v).Added(d1u.Crossed(duv));
126   gp_Vec dvnsurf = d1u.Crossed(d2v).Added(duv.Crossed(d1v));
127
128   gp_Vec nplancrosnsurf = nplan.Crossed(nsurf);
129   gp_Vec dwnplancrosnsurf = dnplan.Crossed(nsurf);
130   gp_Vec dunplancrosnsurf = nplan.Crossed(dunsurf);
131   gp_Vec dvnplancrosnsurf = nplan.Crossed(dvnsurf);
132
133   Standard_Real norm2      = nplancrosnsurf.SquareMagnitude();
134   Standard_Real norm       = sqrt(norm2);
135   Standard_Real unsurnorm  = 1./norm;
136   Standard_Real raysurnorm = ray*unsurnorm;
137   Standard_Real unsurnorm2 = unsurnorm * unsurnorm;
138   Standard_Real raysurnorm2 = ray*unsurnorm2;
139   Standard_Real dwnorm = unsurnorm*nplancrosnsurf.Dot(dwnplancrosnsurf);
140   Standard_Real dunorm = unsurnorm*nplancrosnsurf.Dot(dunplancrosnsurf);
141   Standard_Real dvnorm = unsurnorm*nplancrosnsurf.Dot(dvnplancrosnsurf);
142
143   Standard_Real nplandotnsurf   = nplan.Dot(nsurf);
144   Standard_Real dwnplandotnsurf = dnplan.Dot(nsurf);
145   Standard_Real dunplandotnsurf = nplan.Dot(dunsurf);
146   Standard_Real dvnplandotnsurf = nplan.Dot(dvnsurf);
147   
148   gp_Vec temp,dwtemp,dutemp,dvtemp;
149   temp.SetLinearForm(nplandotnsurf,nplan,-1.,nsurf);
150   dwtemp.SetLinearForm(nplandotnsurf,dnplan,dwnplandotnsurf,nplan);
151   dutemp.SetLinearForm(dunplandotnsurf,nplan,-1.,dunsurf);
152   dvtemp.SetLinearForm(dvnplandotnsurf,nplan,-1.,dvnsurf);
153
154   gp_Vec ref,dwref,duref,dvref,corde(point,pts);
155   ref.SetLinearForm(raysurnorm,temp,corde);
156   dwref.SetLinearForm(raysurnorm,dwtemp,-raysurnorm2*dwnorm,temp);
157   dwref.SetLinearForm(1.,dwref,dray*unsurnorm,temp);
158   duref.SetLinearForm(raysurnorm,dutemp,-raysurnorm2*dunorm,temp,d1u);
159   dvref.SetLinearForm(raysurnorm,dvtemp,-raysurnorm2*dvnorm,temp,d1v);
160   
161   ref.Add(ref);
162   D(3,1) = ref.Dot(dwref) - 2.*dray*ray;
163   D(3,2) = ref.Dot(duref);
164   D(3,3) = ref.Dot(dvref);
165
166   return Standard_True;
167 }
168
169 //=======================================================================
170 //function : 
171 //purpose  : 
172 //=======================================================================
173  Standard_Boolean BRepBlend_SurfPointEvolRadInv::Values(const math_Vector& X,math_Vector& F,math_Matrix& D) 
174 {
175   gp_Pnt ptcur,pts;
176   gp_Vec d1cur,d2cur,nplan,dnplan,d1u,d1v,d2u,d2v,duv;
177   Standard_Real theD, dtheD, normd1cur, unsurnormd1cur,dray;
178
179   curv->D2(X(1),ptcur,d1cur,d2cur);
180   tevol->D1(X(1),ray,dray);
181   ray=sg1*ray;
182   dray=sg1*dray;
183   surf->D2(X(2),X(3),pts,d1u,d1v,d2u,d2v,duv);
184   normd1cur = d1cur.Magnitude();
185   unsurnormd1cur = 1./normd1cur;
186   nplan = unsurnormd1cur * d1cur;
187   theD = -(nplan.XYZ().Dot(ptcur.XYZ()));
188   F(1) = nplan.XYZ().Dot(point.XYZ()) + theD;
189   F(2) = nplan.XYZ().Dot(pts.XYZ()) + theD;
190
191   dnplan.SetLinearForm(-nplan.Dot(d2cur),nplan,d2cur);
192   dnplan.Multiply(unsurnormd1cur);
193   dtheD = - nplan.XYZ().Dot(d1cur.XYZ()) - dnplan.XYZ().Dot(ptcur.XYZ());
194   D(1,1) = dnplan.XYZ().Dot(point.XYZ()) + dtheD;
195   D(1,2) = D(1,3) = 0.;
196   D(2,1) = dnplan.XYZ().Dot(pts.XYZ()) + dtheD;
197   D(2,2) = nplan.Dot(d1u);
198   D(2,3) = nplan.Dot(d1v);
199   
200   gp_Vec nsurf = d1u.Crossed(d1v);
201   gp_Vec dunsurf = d2u.Crossed(d1v).Added(d1u.Crossed(duv));
202   gp_Vec dvnsurf = d1u.Crossed(d2v).Added(duv.Crossed(d1v));
203
204   gp_Vec nplancrosnsurf = nplan.Crossed(nsurf);
205   gp_Vec dwnplancrosnsurf = dnplan.Crossed(nsurf);
206   gp_Vec dunplancrosnsurf = nplan.Crossed(dunsurf);
207   gp_Vec dvnplancrosnsurf = nplan.Crossed(dvnsurf);
208
209   Standard_Real norm2      = nplancrosnsurf.SquareMagnitude();
210   Standard_Real norm       = sqrt(norm2);
211   Standard_Real unsurnorm  = 1./norm;
212   Standard_Real raysurnorm = ray*unsurnorm;
213   Standard_Real unsurnorm2 = unsurnorm * unsurnorm;
214   Standard_Real raysurnorm2 = ray*unsurnorm2;
215   Standard_Real dwnorm = unsurnorm*nplancrosnsurf.Dot(dwnplancrosnsurf);
216   Standard_Real dunorm = unsurnorm*nplancrosnsurf.Dot(dunplancrosnsurf);
217   Standard_Real dvnorm = unsurnorm*nplancrosnsurf.Dot(dvnplancrosnsurf);
218
219   Standard_Real nplandotnsurf   = nplan.Dot(nsurf);
220   Standard_Real dwnplandotnsurf = dnplan.Dot(nsurf);
221   Standard_Real dunplandotnsurf = nplan.Dot(dunsurf);
222   Standard_Real dvnplandotnsurf = nplan.Dot(dvnsurf);
223   
224   gp_Vec temp,dwtemp,dutemp,dvtemp;
225   temp.SetLinearForm(nplandotnsurf,nplan,-1.,nsurf);
226   dwtemp.SetLinearForm(nplandotnsurf,dnplan,dwnplandotnsurf,nplan);
227   dutemp.SetLinearForm(dunplandotnsurf,nplan,-1.,dunsurf);
228   dvtemp.SetLinearForm(dvnplandotnsurf,nplan,-1.,dvnsurf);
229
230   gp_Vec ref,dwref,duref,dvref,corde(point,pts);
231   ref.SetLinearForm(raysurnorm,temp,corde);
232   F(3) = ref.SquareMagnitude() - ray*ray;
233   dwref.SetLinearForm(raysurnorm,dwtemp,-raysurnorm2*dwnorm,temp);
234   dwref.SetLinearForm(1.,dwref,dray*unsurnorm,temp);
235   duref.SetLinearForm(raysurnorm,dutemp,-raysurnorm2*dunorm,temp,d1u);
236   dvref.SetLinearForm(raysurnorm,dvtemp,-raysurnorm2*dvnorm,temp,d1v);
237   
238   ref.Add(ref);
239   D(3,1) = ref.Dot(dwref) - 2.*dray*ray;
240   D(3,2) = ref.Dot(duref);
241   D(3,3) = ref.Dot(dvref);
242
243   return Standard_True;
244 }
245
246 //=======================================================================
247 //function : 
248 //purpose  : 
249 //=======================================================================
250  void BRepBlend_SurfPointEvolRadInv::Set(const gp_Pnt& P) 
251 {
252   point = P;
253 }
254
255 //=======================================================================
256 //function : 
257 //purpose  : 
258 //=======================================================================
259  void BRepBlend_SurfPointEvolRadInv::GetTolerance(math_Vector& Tolerance,const Standard_Real Tol) const
260 {
261   Tolerance(1) = curv->Resolution(Tol);
262   Tolerance(2) = surf->UResolution(Tol);
263   Tolerance(3) = surf->VResolution(Tol);
264 }
265
266 //=======================================================================
267 //function : 
268 //purpose  : 
269 //=======================================================================
270  void BRepBlend_SurfPointEvolRadInv::GetBounds(math_Vector& InfBound,math_Vector& SupBound) const
271 {
272   InfBound(1) = curv->FirstParameter();
273   SupBound(1) = curv->LastParameter();
274   InfBound(2) = surf->FirstUParameter();
275   SupBound(2) = surf->LastUParameter();
276   InfBound(3) = surf->FirstVParameter();
277   SupBound(3) = surf->LastVParameter();
278 }
279
280 //=======================================================================
281 //function : 
282 //purpose  : 
283 //=======================================================================
284  Standard_Boolean BRepBlend_SurfPointEvolRadInv::IsSolution(const math_Vector& Sol,const Standard_Real Tol) 
285 {
286   math_Vector valsol(1,3);
287   Value(Sol,valsol);
288   if (Abs(valsol(1)) <= Tol && 
289       Abs(valsol(2)) <= Tol &&
290       Abs(valsol(3)) <= 2*Tol*Abs(ray) ) {
291     return Standard_True;
292   }
293   return Standard_False;
294 }
295