1 // Created on: 1997-02-12
2 // Created by: Laurent BOURESCHE
3 // Copyright (c) 1997-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and / or modify it
9 // under the terms of the GNU Lesser General Public version 2.1 as published
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <BRepBlend_SurfPointConstRadInv.ixx>
19 //=======================================================================
20 //function : BRepBlend_SurfPointConstRadInv
22 //=======================================================================
24 BRepBlend_SurfPointConstRadInv::BRepBlend_SurfPointConstRadInv
25 (const Handle(Adaptor3d_HSurface)& S,
26 const Handle(Adaptor3d_HCurve)& C) : surf(S), curv(C)
30 //=======================================================================
33 //=======================================================================
35 void BRepBlend_SurfPointConstRadInv::Set(const Standard_Real R,
36 const Standard_Integer Choix)
59 //=======================================================================
60 //function : NbEquations
62 //=======================================================================
64 Standard_Integer BRepBlend_SurfPointConstRadInv::NbEquations() const
69 //=======================================================================
72 //=======================================================================
74 Standard_Boolean BRepBlend_SurfPointConstRadInv::Value(const math_Vector& X,
77 Standard_Real theD,norm,unsurnorm;
79 gp_Vec d1cur(0.,0.,0.),d1u(0.,0.,0.),d1v(0.,0.,0.);
80 gp_XYZ nplan(0.,0.,0.),ns(0.,0.,0.),ref(0.,0.,0.);
81 curv->D1(X(1),ptcur,d1cur);
82 nplan = d1cur.Normalized().XYZ();
83 // theD = -(nplan.Dot(ptcur.XYZ()));
84 gp_XYZ ptcurXYZ(ptcur.XYZ());
85 theD = nplan.Dot(ptcurXYZ) ;
88 surf->D1(X(2),X(3),pts,d1u,d1v);
89 F(1) = nplan.Dot(point.XYZ()) + theD;
90 F(2) = nplan.Dot(pts.XYZ()) + theD;
91 ns = d1u.Crossed(d1v).XYZ();
92 norm = nplan.Crossed(ns).Modulus();
94 ns.SetLinearForm(nplan.Dot(ns),nplan, -1.,ns);
95 ns.Multiply(unsurnorm);
96 ref = pts.XYZ() - point.XYZ();
97 ref.SetLinearForm(ray,ns,ref);
98 F(3) = ref.SquareModulus() - ray*ray;
102 //=======================================================================
103 //function : Derivatives
105 //=======================================================================
107 Standard_Boolean BRepBlend_SurfPointConstRadInv::Derivatives(const math_Vector& X,
111 gp_Vec d1cur,d2cur,nplan,dnplan,d1u,d1v,d2u,d2v,duv;
112 Standard_Real theD, dtheD, normd1cur, unsurnormd1cur;
114 curv->D2(X(1),ptcur,d1cur,d2cur);
115 normd1cur = d1cur.Magnitude();
116 unsurnormd1cur = 1./normd1cur;
117 nplan = unsurnormd1cur * d1cur;
118 // theD = -(nplan.XYZ().Dot(ptcur.XYZ()));
119 gp_XYZ nplanXYZ(nplan.XYZ());
120 gp_XYZ ptcurXYZ(ptcur.XYZ());
121 theD = nplanXYZ.Dot(ptcurXYZ) ;
122 theD = theD * (-1.) ;
124 dnplan.SetLinearForm(-nplan.Dot(d2cur),nplan,d2cur);
125 dnplan.Multiply(unsurnormd1cur);
126 dtheD = - nplan.XYZ().Dot(d1cur.XYZ()) - dnplan.XYZ().Dot(ptcur.XYZ());
127 D(1,1) = dnplan.XYZ().Dot(point.XYZ()) + dtheD;
128 D(1,2) = D(1,3) = 0.;
129 surf->D2(X(2),X(3),pts,d1u,d1v,d2u,d2v,duv);
130 D(2,1) = dnplan.XYZ().Dot(pts.XYZ()) + dtheD;
131 D(2,2) = nplan.Dot(d1u);
132 D(2,3) = nplan.Dot(d1v);
134 gp_Vec nsurf = d1u.Crossed(d1v);
135 gp_Vec dunsurf = d2u.Crossed(d1v).Added(d1u.Crossed(duv));
136 gp_Vec dvnsurf = d1u.Crossed(d2v).Added(duv.Crossed(d1v));
138 gp_Vec nplancrosnsurf = nplan.Crossed(nsurf);
139 gp_Vec dwnplancrosnsurf = dnplan.Crossed(nsurf);
140 gp_Vec dunplancrosnsurf = nplan.Crossed(dunsurf);
141 gp_Vec dvnplancrosnsurf = nplan.Crossed(dvnsurf);
143 Standard_Real norm2 = nplancrosnsurf.SquareMagnitude();
144 Standard_Real norm = sqrt(norm2);
145 Standard_Real unsurnorm = 1./norm;
146 Standard_Real raysurnorm = ray*unsurnorm;
147 Standard_Real unsurnorm2 = unsurnorm * unsurnorm;
148 Standard_Real raysurnorm2 = ray*unsurnorm2;
149 Standard_Real dwnorm = unsurnorm*nplancrosnsurf.Dot(dwnplancrosnsurf);
150 Standard_Real dunorm = unsurnorm*nplancrosnsurf.Dot(dunplancrosnsurf);
151 Standard_Real dvnorm = unsurnorm*nplancrosnsurf.Dot(dvnplancrosnsurf);
153 Standard_Real nplandotnsurf = nplan.Dot(nsurf);
154 Standard_Real dwnplandotnsurf = dnplan.Dot(nsurf);
155 Standard_Real dunplandotnsurf = nplan.Dot(dunsurf);
156 Standard_Real dvnplandotnsurf = nplan.Dot(dvnsurf);
158 gp_Vec temp,dwtemp,dutemp,dvtemp;
159 temp.SetLinearForm(nplandotnsurf,nplan,-1.,nsurf);
160 dwtemp.SetLinearForm(nplandotnsurf,dnplan,dwnplandotnsurf,nplan);
161 dutemp.SetLinearForm(dunplandotnsurf,nplan,-1.,dunsurf);
162 dvtemp.SetLinearForm(dvnplandotnsurf,nplan,-1.,dvnsurf);
164 gp_Vec ref,dwref,duref,dvref,corde(point,pts);
165 ref.SetLinearForm(raysurnorm,temp,corde);
166 dwref.SetLinearForm(raysurnorm,dwtemp,-raysurnorm2*dwnorm,temp);
167 duref.SetLinearForm(raysurnorm,dutemp,-raysurnorm2*dunorm,temp,d1u);
168 dvref.SetLinearForm(raysurnorm,dvtemp,-raysurnorm2*dvnorm,temp,d1v);
171 D(3,1) = ref.Dot(dwref);
172 D(3,2) = ref.Dot(duref);
173 D(3,3) = ref.Dot(dvref);
175 return Standard_True;
178 //=======================================================================
181 //=======================================================================
183 Standard_Boolean BRepBlend_SurfPointConstRadInv::Values(const math_Vector& X,
188 gp_Vec d1cur,d2cur,nplan,dnplan,d1u,d1v,d2u,d2v,duv;
189 Standard_Real theD, dtheD, normd1cur, unsurnormd1cur;
191 curv->D2(X(1),ptcur,d1cur,d2cur);
192 surf->D2(X(2),X(3),pts,d1u,d1v,d2u,d2v,duv);
193 normd1cur = d1cur.Magnitude();
194 unsurnormd1cur = 1./normd1cur;
195 nplan = unsurnormd1cur * d1cur;
196 // theD = -(nplan.XYZ().Dot(ptcur.XYZ()));
197 gp_XYZ nplanXYZ(nplan.XYZ());
198 gp_XYZ ptcurXYZ(ptcur.XYZ());
199 theD = nplanXYZ.Dot(ptcurXYZ) ;
200 theD = theD * (-1.) ;
202 F(1) = nplan.XYZ().Dot(point.XYZ()) + theD;
203 F(2) = nplan.XYZ().Dot(pts.XYZ()) + theD;
205 dnplan.SetLinearForm(-nplan.Dot(d2cur),nplan,d2cur);
206 dnplan.Multiply(unsurnormd1cur);
207 dtheD = - nplan.XYZ().Dot(d1cur.XYZ()) - dnplan.XYZ().Dot(ptcur.XYZ());
208 D(1,1) = dnplan.XYZ().Dot(point.XYZ()) + dtheD;
209 D(1,2) = D(1,3) = 0.;
210 D(2,1) = dnplan.XYZ().Dot(pts.XYZ()) + dtheD;
211 D(2,2) = nplan.Dot(d1u);
212 D(2,3) = nplan.Dot(d1v);
214 gp_Vec nsurf = d1u.Crossed(d1v);
215 gp_Vec dunsurf = d2u.Crossed(d1v).Added(d1u.Crossed(duv));
216 gp_Vec dvnsurf = d1u.Crossed(d2v).Added(duv.Crossed(d1v));
218 gp_Vec nplancrosnsurf = nplan.Crossed(nsurf);
219 gp_Vec dwnplancrosnsurf = dnplan.Crossed(nsurf);
220 gp_Vec dunplancrosnsurf = nplan.Crossed(dunsurf);
221 gp_Vec dvnplancrosnsurf = nplan.Crossed(dvnsurf);
223 Standard_Real norm2 = nplancrosnsurf.SquareMagnitude();
224 Standard_Real norm = sqrt(norm2);
225 Standard_Real unsurnorm = 1./norm;
226 Standard_Real raysurnorm = ray*unsurnorm;
227 Standard_Real unsurnorm2 = unsurnorm * unsurnorm;
228 Standard_Real raysurnorm2 = ray*unsurnorm2;
229 Standard_Real dwnorm = unsurnorm*nplancrosnsurf.Dot(dwnplancrosnsurf);
230 Standard_Real dunorm = unsurnorm*nplancrosnsurf.Dot(dunplancrosnsurf);
231 Standard_Real dvnorm = unsurnorm*nplancrosnsurf.Dot(dvnplancrosnsurf);
233 Standard_Real nplandotnsurf = nplan.Dot(nsurf);
234 Standard_Real dwnplandotnsurf = dnplan.Dot(nsurf);
235 Standard_Real dunplandotnsurf = nplan.Dot(dunsurf);
236 Standard_Real dvnplandotnsurf = nplan.Dot(dvnsurf);
238 gp_Vec temp,dwtemp,dutemp,dvtemp;
239 temp.SetLinearForm(nplandotnsurf,nplan,-1.,nsurf);
240 dwtemp.SetLinearForm(nplandotnsurf,dnplan,dwnplandotnsurf,nplan);
241 dutemp.SetLinearForm(dunplandotnsurf,nplan,-1.,dunsurf);
242 dvtemp.SetLinearForm(dvnplandotnsurf,nplan,-1.,dvnsurf);
244 gp_Vec ref,dwref,duref,dvref,corde(point,pts);
245 ref.SetLinearForm(raysurnorm,temp,corde);
246 F(3) = ref.SquareMagnitude() - ray*ray;
247 dwref.SetLinearForm(raysurnorm,dwtemp,-raysurnorm2*dwnorm,temp);
248 duref.SetLinearForm(raysurnorm,dutemp,-raysurnorm2*dunorm,temp,d1u);
249 dvref.SetLinearForm(raysurnorm,dvtemp,-raysurnorm2*dvnorm,temp,d1v);
252 D(3,1) = ref.Dot(dwref);
253 D(3,2) = ref.Dot(duref);
254 D(3,3) = ref.Dot(dvref);
256 return Standard_True;
259 //=======================================================================
262 //=======================================================================
264 void BRepBlend_SurfPointConstRadInv::Set(const gp_Pnt& P)
269 //=======================================================================
270 //function : GetTolerance
272 //=======================================================================
274 void BRepBlend_SurfPointConstRadInv::GetTolerance(math_Vector& Tolerance,
275 const Standard_Real Tol) const
277 Tolerance(1) = curv->Resolution(Tol);
278 Tolerance(2) = surf->UResolution(Tol);
279 Tolerance(3) = surf->VResolution(Tol);
282 //=======================================================================
283 //function : GetBounds
285 //=======================================================================
287 void BRepBlend_SurfPointConstRadInv::GetBounds(math_Vector& InfBound,
288 math_Vector& SupBound) const
290 InfBound(1) = curv->FirstParameter();
291 SupBound(1) = curv->LastParameter();
292 InfBound(2) = surf->FirstUParameter();
293 SupBound(2) = surf->LastUParameter();
294 InfBound(3) = surf->FirstVParameter();
295 SupBound(3) = surf->LastVParameter();
298 //=======================================================================
299 //function : IsSolution
301 //=======================================================================
303 Standard_Boolean BRepBlend_SurfPointConstRadInv::IsSolution(const math_Vector& Sol,
304 const Standard_Real Tol)
306 math_Vector valsol(1,3);
308 if (Abs(valsol(1)) <= Tol &&
309 Abs(valsol(2)) <= Tol &&
310 Abs(valsol(3)) <= 2*Tol*Abs(ray) ) {
311 return Standard_True;
313 return Standard_False;