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
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.
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.
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.
23 #include <BRepBlend_SurfPointEvolRadInv.ixx>
26 //=======================================================================
29 //=======================================================================
30 BRepBlend_SurfPointEvolRadInv::BRepBlend_SurfPointEvolRadInv
31 (const Handle(Adaptor3d_HSurface)& S,
32 const Handle(Adaptor3d_HCurve)& C,
33 const Handle(Law_Function)& Evol
38 //=======================================================================
41 //=======================================================================
42 void BRepBlend_SurfPointEvolRadInv::Set(const Standard_Integer Choix)
59 //=======================================================================
62 //=======================================================================
63 Standard_Integer BRepBlend_SurfPointEvolRadInv::NbEquations() const
68 //=======================================================================
71 //=======================================================================
72 Standard_Boolean BRepBlend_SurfPointEvolRadInv::Value(const math_Vector& X,math_Vector& F)
74 Standard_Real theD,norm,unsurnorm;
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();
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;
96 //=======================================================================
99 //=======================================================================
100 Standard_Boolean BRepBlend_SurfPointEvolRadInv::Derivatives(const math_Vector& X,math_Matrix& D)
103 gp_Vec d1cur,d2cur,nplan,dnplan,d1u,d1v,d2u,d2v,duv;
104 Standard_Real theD, dtheD, normd1cur, unsurnormd1cur,dray;
106 curv->D2(X(1),ptcur,d1cur,d2cur);
107 tevol->D1(X(1),ray,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);
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));
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);
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);
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);
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);
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);
162 D(3,1) = ref.Dot(dwref) - 2.*dray*ray;
163 D(3,2) = ref.Dot(duref);
164 D(3,3) = ref.Dot(dvref);
166 return Standard_True;
169 //=======================================================================
172 //=======================================================================
173 Standard_Boolean BRepBlend_SurfPointEvolRadInv::Values(const math_Vector& X,math_Vector& F,math_Matrix& D)
176 gp_Vec d1cur,d2cur,nplan,dnplan,d1u,d1v,d2u,d2v,duv;
177 Standard_Real theD, dtheD, normd1cur, unsurnormd1cur,dray;
179 curv->D2(X(1),ptcur,d1cur,d2cur);
180 tevol->D1(X(1),ray,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;
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);
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));
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);
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);
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);
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);
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);
239 D(3,1) = ref.Dot(dwref) - 2.*dray*ray;
240 D(3,2) = ref.Dot(duref);
241 D(3,3) = ref.Dot(dvref);
243 return Standard_True;
246 //=======================================================================
249 //=======================================================================
250 void BRepBlend_SurfPointEvolRadInv::Set(const gp_Pnt& P)
255 //=======================================================================
258 //=======================================================================
259 void BRepBlend_SurfPointEvolRadInv::GetTolerance(math_Vector& Tolerance,const Standard_Real Tol) const
261 Tolerance(1) = curv->Resolution(Tol);
262 Tolerance(2) = surf->UResolution(Tol);
263 Tolerance(3) = surf->VResolution(Tol);
266 //=======================================================================
269 //=======================================================================
270 void BRepBlend_SurfPointEvolRadInv::GetBounds(math_Vector& InfBound,math_Vector& SupBound) const
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();
280 //=======================================================================
283 //=======================================================================
284 Standard_Boolean BRepBlend_SurfPointEvolRadInv::IsSolution(const math_Vector& Sol,const Standard_Real Tol)
286 math_Vector valsol(1,3);
288 if (Abs(valsol(1)) <= Tol &&
289 Abs(valsol(2)) <= Tol &&
290 Abs(valsol(3)) <= 2*Tol*Abs(ray) ) {
291 return Standard_True;
293 return Standard_False;