1 // Created on: 1993-12-02
2 // Created by: Jacques GOUSSARD
3 // Copyright (c) 1993-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 under
9 // the terms of the GNU Lesser General Public License 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 // Modified 10/09/1996 PMN Ajout de (Nb)Intervalles, IsRationnal
18 // + Utilisation de GeomFill::GetCircle dans Section.
20 #include <Adaptor3d_Curve.hxx>
21 #include <Blend_Point.hxx>
22 #include <BlendFunc.hxx>
23 #include <BlendFunc_CSConstRad.hxx>
25 #include <GeomFill.hxx>
26 #include <gp_Circ.hxx>
28 #include <gp_Pnt2d.hxx>
30 #include <gp_Vec2d.hxx>
31 #include <math_Gauss.hxx>
32 #include <math_Matrix.hxx>
33 #include <Precision.hxx>
34 #include <Standard_DomainError.hxx>
35 #include <Standard_NotImplemented.hxx>
37 //=======================================================================
38 //function : BlendFunc_CSConstRad
40 //=======================================================================
41 BlendFunc_CSConstRad::BlendFunc_CSConstRad(const Handle(Adaptor3d_Surface)& S,
42 const Handle(Adaptor3d_Curve)& C,
43 const Handle(Adaptor3d_Curve)& CG) :
45 surf(S),curv(C),guide(CG), prmc(0.0),
46 istangent(Standard_True), ray(0.0),
47 choix(0), normtg(0.0), theD(0.0),
48 maxang(RealFirst()), minang(RealLast()),
49 mySShape(BlendFunc_Rational)
51 myTConv = Convert_TgtThetaOver2;
55 //=======================================================================
56 //function : NbEquations
58 //=======================================================================
60 Standard_Integer BlendFunc_CSConstRad::NbEquations () const
66 //=======================================================================
69 //=======================================================================
71 void BlendFunc_CSConstRad::Set(const Standard_Real Radius, const Standard_Integer Choix)
78 //=======================================================================
81 //=======================================================================
83 void BlendFunc_CSConstRad::Set(const BlendFunc_SectionShape TypeSection)
85 mySShape = TypeSection;
89 //=======================================================================
92 //=======================================================================
94 void BlendFunc_CSConstRad::Set(const Standard_Real Param)
96 guide->D2(Param,ptgui,d1gui,d2gui);
97 normtg = d1gui.Magnitude();
98 nplan = d1gui.Normalized();
99 theD = - (nplan.XYZ().Dot(ptgui.XYZ()));
103 //=======================================================================
106 //=======================================================================
108 void BlendFunc_CSConstRad::Set(const Standard_Real, const Standard_Real)
110 throw Standard_NotImplemented("BlendFunc_CSConstRad::Set");
114 //=======================================================================
115 //function : GetTolerance
117 //=======================================================================
119 void BlendFunc_CSConstRad::GetTolerance(math_Vector& Tolerance, const Standard_Real Tol) const
121 Tolerance(1) = surf->UResolution(Tol);
122 Tolerance(2) = surf->VResolution(Tol);
123 Tolerance(3) = curv->Resolution(Tol);
127 //=======================================================================
128 //function : GetBounds
130 //=======================================================================
132 void BlendFunc_CSConstRad::GetBounds(math_Vector& InfBound, math_Vector& SupBound) const
134 InfBound(1) = surf->FirstUParameter();
135 InfBound(2) = surf->FirstVParameter();
136 InfBound(3) = curv->FirstParameter();
137 SupBound(1) = surf->LastUParameter();
138 SupBound(2) = surf->LastVParameter();
139 SupBound(3) = curv->LastParameter();
141 if(!Precision::IsInfinite(InfBound(1)) &&
142 !Precision::IsInfinite(SupBound(1))) {
143 const Standard_Real range = (SupBound(1) - InfBound(1));
144 InfBound(1) -= range;
145 SupBound(1) += range;
147 if(!Precision::IsInfinite(InfBound(2)) &&
148 !Precision::IsInfinite(SupBound(2))) {
149 const Standard_Real range = (SupBound(2) - InfBound(2));
150 InfBound(2) -= range;
151 SupBound(2) += range;
156 //=======================================================================
157 //function : IsSolution
159 //=======================================================================
161 Standard_Boolean BlendFunc_CSConstRad::IsSolution(const math_Vector& Sol, const Standard_Real Tol)
163 math_Vector valsol(1,3),secmember(1,3);
164 math_Matrix gradsol(1,3,1,3);
166 gp_Vec dnplan,d1u1,d1v1,d1,temp,ns,ns2,ncrossns,resul;
167 Standard_Real norm,ndotns,grosterme;
168 Standard_Real Cosa,Sina,Angle;
170 Values(Sol,valsol,gradsol);
171 if (Abs(valsol(1)) <= Tol &&
172 Abs(valsol(2)) <= Tol &&
173 Abs(valsol(3)) <= Tol*Tol) {
175 // Calcul des tangentes
177 pt2d = gp_Pnt2d(Sol(1),Sol(2));
179 surf->D1(Sol(1),Sol(2),pts,d1u1,d1v1);
180 curv->D1(Sol(3),ptc,d1);
181 dnplan.SetLinearForm(1./normtg,d2gui,
182 -1./normtg*(nplan.Dot(d2gui)),nplan);
184 temp.SetXYZ(pts.XYZ() - ptgui.XYZ());
185 secmember(1) = normtg - dnplan.Dot(temp);
187 temp.SetXYZ(ptc.XYZ() - ptgui.XYZ());
188 secmember(2) = normtg - dnplan.Dot(temp);
190 ns = d1u1.Crossed(d1v1);
191 ncrossns = nplan.Crossed(ns);
192 ndotns = nplan.Dot(ns);
193 norm = ncrossns.Magnitude();
195 grosterme = ncrossns.Dot(dnplan.Crossed(ns))/norm/norm;
196 temp.SetLinearForm(ray/norm*(dnplan.Dot(ns)-grosterme*ndotns),nplan,
197 ray*ndotns/norm,dnplan,
198 ray*grosterme/norm,ns);
200 ns.SetLinearForm(ndotns/norm,nplan, -1./norm,ns);
201 resul.SetLinearForm(ray,ns,gp_Vec(ptc,pts));
202 secmember(3) = -2.*(temp.Dot(resul));
204 math_Gauss Resol(gradsol);
205 if (Resol.IsDone()) {
207 Resol.Solve(secmember);
209 tgs.SetLinearForm(secmember(1),d1u1,secmember(2),d1v1);
210 tgc = secmember(3)*d1;
211 tg2d.SetCoord(secmember(1),secmember(2));
212 istangent = Standard_False;
215 istangent = Standard_True;
217 // mise a jour de maxang
219 ns2 = -resul.Normalized();
222 Sina = nplan.Dot(ns.Crossed(ns2));
224 Sina = -Sina; //nplan est change en -nplan
229 Angle = 2.*M_PI - Angle;
232 if (Angle>maxang) {maxang = Angle;}
233 if (Angle<minang) {minang = Angle;}
235 return Standard_True;
237 istangent = Standard_True;
238 return Standard_False;
242 //=======================================================================
245 //=======================================================================
247 Standard_Boolean BlendFunc_CSConstRad::Value(const math_Vector& X, math_Vector& F)
250 surf->D1(X(1),X(2),pts,d1u1,d1v1);
251 ptc = curv->Value(X(3));
253 F(1) = nplan.XYZ().Dot(pts.XYZ()) + theD;
254 F(2) = nplan.XYZ().Dot(ptc.XYZ()) + theD;
256 gp_Vec vref, ns = d1u1.Crossed(d1v1);
257 const Standard_Real norm = nplan.Crossed(ns).Magnitude();
258 ns.SetLinearForm(nplan.Dot(ns)/norm,nplan, -1./norm,ns);
259 vref.SetLinearForm(ray,ns,gp_Vec(ptc,pts));
261 F(3) = vref.SquareMagnitude() - ray*ray;
263 pt2d = gp_Pnt2d(X(1),X(2));
264 return Standard_True;
268 //=======================================================================
269 //function : Derivatives
271 //=======================================================================
273 Standard_Boolean BlendFunc_CSConstRad::Derivatives(const math_Vector& X, math_Matrix& D)
275 gp_Vec d1u1,d1v1,d2u1,d2v1,d2uv1,d1;
276 gp_Vec ns,ncrossns,resul,temp, vref;
278 Standard_Real norm,ndotns,grosterme;
280 surf->D2(X(1),X(2),pts,d1u1,d1v1,d2u1,d2v1,d2uv1);
281 curv->D1(X(3),ptc,d1);
283 D(1,1) = nplan.Dot(d1u1);
284 D(1,2) = nplan.Dot(d1v1);
289 D(2,3) = nplan.Dot(d1);
292 ns = d1u1.Crossed(d1v1);
293 ncrossns = nplan.Crossed(ns);
294 norm = ncrossns.Magnitude();
295 ndotns = nplan.Dot(ns);
297 vref.SetLinearForm(ndotns,nplan,-1.,ns);
299 vref.SetLinearForm(ray,vref,gp_Vec(ptc,pts));
301 // Derivee par rapport a u1
302 temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
303 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
304 resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
305 ray*grosterme/norm,ns,
309 D(3,1) = 2.*(resul.Dot(vref));
312 // Derivee par rapport a v1
313 temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
314 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
315 resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
316 ray*grosterme/norm,ns,
320 D(3,2) = 2.*(resul.Dot(vref));
322 D(3,3) = -2.*(d1.Dot(vref));
324 pt2d = gp_Pnt2d(X(1),X(2));
325 return Standard_True;
329 //=======================================================================
332 //=======================================================================
334 Standard_Boolean BlendFunc_CSConstRad::Values(const math_Vector& X, math_Vector& F, math_Matrix& D)
337 gp_Vec d2u1,d2v1,d2uv1;
338 gp_Vec ns,ncrossns,resul,temp,vref;
340 Standard_Real norm,ndotns,grosterme;
342 surf->D2(X(1),X(2),pts,d1u1,d1v1,d2u1,d2v1,d2uv1);
343 curv->D1(X(3),ptc,d1);
345 F(1) = nplan.XYZ().Dot(pts.XYZ()) + theD;
346 F(2) = nplan.XYZ().Dot(ptc.XYZ()) + theD;
348 D(1,1) = nplan.Dot(d1u1);
349 D(1,2) = nplan.Dot(d1v1);
354 D(2,3) = nplan.Dot(d1);
357 ns = d1u1.Crossed(d1v1);
358 ncrossns = nplan.Crossed(ns);
359 norm = ncrossns.Magnitude();
360 ndotns = nplan.Dot(ns);
362 vref.SetLinearForm(ndotns,nplan,-1.,ns);
364 vref.SetLinearForm(ray,vref,gp_Vec(ptc,pts));
366 F(3) = vref.SquareMagnitude() - ray*ray;
369 // Derivee par rapport a u1
370 temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
371 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
372 resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
373 ray*grosterme/norm,ns,
377 D(3,1) = 2.*(resul.Dot(vref));
380 // Derivee par rapport a v1
381 temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
382 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
383 resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
384 ray*grosterme/norm,ns,
388 D(3,2) = 2.*(resul.Dot(vref));
390 D(3,3) = -2.*(d1.Dot(vref));
392 pt2d = gp_Pnt2d(X(1),X(2));
393 return Standard_True;
398 //=======================================================================
399 //function : PointOnS
401 //=======================================================================
403 const gp_Pnt& BlendFunc_CSConstRad::PointOnS () const
408 //=======================================================================
409 //function : PointOnC
411 //=======================================================================
413 const gp_Pnt& BlendFunc_CSConstRad::PointOnC () const
418 //=======================================================================
421 //=======================================================================
423 const gp_Pnt2d& BlendFunc_CSConstRad::Pnt2d () const
428 //=======================================================================
429 //function : ParameterOnC
431 //=======================================================================
433 Standard_Real BlendFunc_CSConstRad::ParameterOnC () const
439 //=======================================================================
440 //function : IsTangencyPoint
442 //=======================================================================
444 Standard_Boolean BlendFunc_CSConstRad::IsTangencyPoint () const
449 //=======================================================================
450 //function : TangentOnS
452 //=======================================================================
454 const gp_Vec& BlendFunc_CSConstRad::TangentOnS () const
457 throw Standard_DomainError("BlendFunc_CSConstRad::TangentOnS");
461 //=======================================================================
462 //function : TangentOnC
464 //=======================================================================
466 const gp_Vec& BlendFunc_CSConstRad::TangentOnC () const
469 throw Standard_DomainError("BlendFunc_CSConstRad::TangentOnC");
473 //=======================================================================
474 //function : Tangent2d
476 //=======================================================================
478 const gp_Vec2d& BlendFunc_CSConstRad::Tangent2d () const
481 throw Standard_DomainError("BlendFunc_CSConstRad::Tangent2d");
486 //=======================================================================
489 //=======================================================================
491 void BlendFunc_CSConstRad::Tangent(const Standard_Real U, const Standard_Real V,
492 gp_Vec& TgS, gp_Vec& NmS) const
496 surf->D1(U,V,bid,d1u,d1v);
499 NmS = ns = d1u.Crossed(d1v);
501 const Standard_Real norm = nplan.Crossed(ns).Magnitude();
502 ns.SetLinearForm(nplan.Dot(ns)/norm,nplan, -1./norm,ns);
504 gp_Pnt Center(bid.XYZ()+ray*ns.XYZ());
505 TgS = nplan.Crossed(gp_Vec(Center,bid));
511 //=======================================================================
514 //=======================================================================
516 void BlendFunc_CSConstRad::Section(const Standard_Real Param,
517 const Standard_Real U,
518 const Standard_Real V,
519 const Standard_Real W,
529 guide->D1(Param,ptgui,d1gui);
530 nplan = d1gui.Normalized();
532 surf->D1(U,V,pts,d1u1,d1v1);
533 ptc = curv->Value(W);
535 ns = d1u1.Crossed(d1v1);
537 norm = nplan.Crossed(ns).Magnitude();
538 ns.SetLinearForm(nplan.Dot(ns)/norm,nplan, -1./norm,ns);
539 Center.SetXYZ(pts.XYZ()+ray*ns.XYZ());
540 C.SetRadius(Abs(ray));
543 C.SetPosition(gp_Ax2(Center,nplan,ns));
546 C.SetPosition(gp_Ax2(Center,nplan.Reversed(),ns));
549 Pfin = ElCLib::Parameter(C,ptc);
552 Standard_Boolean BlendFunc_CSConstRad::Section(const Blend_Point&, TColgp_Array1OfPnt&, TColgp_Array1OfVec&, TColgp_Array1OfVec&, TColgp_Array1OfPnt2d&, TColgp_Array1OfVec2d&, TColgp_Array1OfVec2d&, TColStd_Array1OfReal&, TColStd_Array1OfReal&, TColStd_Array1OfReal&)
554 throw Standard_DomainError("BlendFunc_CSConstRad::Section : Not implemented");
557 //=======================================================================
558 //function : GetSection
560 //=======================================================================
562 Standard_Boolean BlendFunc_CSConstRad::GetSection(const Standard_Real Param,
563 const Standard_Real U,
564 const Standard_Real V,
565 const Standard_Real W,
566 TColgp_Array1OfPnt& tabP,
567 TColgp_Array1OfVec& tabV)
569 Standard_Integer NbPoint=tabP.Length();
570 if (NbPoint != tabV.Length() || NbPoint < 2) {throw Standard_RangeError();}
572 Standard_Integer i, lowp = tabP.Lower(), lowv = tabV.Lower();
574 gp_Vec d1u1,d1v1,d2u1,d2v1,d2uv1,d1; //,d1u2,d1v2;
575 gp_Vec ns,dnplan,dnw,dn2w,ncrn,dncrn,ns2;
576 gp_Vec ncrossns,resul;
577 gp_Vec resulu,resulv,temp;
579 Standard_Real norm,ndotns,grosterme;
580 Standard_Real lambda,Cosa,Sina;
581 Standard_Real Angle = 0.,Dangle = 0.;
582 math_Vector sol(1,3),valsol(1,3),secmember(1,3);
583 math_Matrix gradsol(1,3,1,3);
585 guide->D2(Param,ptgui,d1gui,d2gui);
586 normtg = d1gui.Magnitude();
587 nplan = d1gui.Normalized();
588 dnplan.SetLinearForm(1./normtg,d2gui,
589 -1./normtg*(nplan.Dot(d2gui)),nplan);
591 sol(1) = U; sol(2) = V; sol(3) = W;
593 Values(sol,valsol,gradsol);
595 surf->D2(U,V,pts,d1u1,d1v1,d2u1,d2v1,d2uv1);
598 temp.SetXYZ(pts.XYZ()- ptgui.XYZ());
599 secmember(1) = normtg - dnplan.Dot(temp);
601 temp.SetXYZ(ptc.XYZ()- ptgui.XYZ());
602 secmember(2) = normtg - dnplan.Dot(temp);
604 ns = d1u1.Crossed(d1v1);
605 ncrossns = nplan.Crossed(ns);
606 ndotns = nplan.Dot(ns);
607 norm = ncrossns.Magnitude();
609 // Derivee de n1 par rapport a w
611 grosterme = ncrossns.Dot(dnplan.Crossed(ns))/norm/norm;
612 dnw.SetLinearForm((dnplan.Dot(ns)-grosterme*ndotns)/norm,nplan,
616 temp.SetLinearForm(ndotns/norm,nplan, -1./norm,ns);
617 resul.SetLinearForm(ray,temp,gp_Vec(ptc,pts));
618 secmember(3) = -2.*ray*(dnw.Dot(resul)); // jag 950105 il manquait ray
620 math_Gauss Resol(gradsol);
621 if (Resol.IsDone()) {
623 Resol.Solve(secmember);
625 tgs.SetLinearForm(secmember(1),d1u1,secmember(2),d1v1);
626 tgc = secmember(3)*d1;
628 // Derivee de n1 par rapport a u1
629 temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
630 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
631 resulu.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
635 // Derivee de n1 par rapport a v1
636 temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
637 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
638 resulv.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
643 dnw.SetLinearForm(secmember(1),resulu,secmember(2),resulv,dnw);
644 ns.SetLinearForm(ndotns/norm,nplan, -1./norm,ns);
646 dn2w.SetLinearForm(ray, dnw, -1., tgc, tgs);
647 norm = resul.Magnitude();
649 ns2 = -resul.Normalized();
650 dn2w.SetLinearForm(ns2.Dot(dn2w),ns2,-1.,dn2w);
659 tabP(lowp+NbPoint-1) = ptc;
662 tabV(lowv+NbPoint-1) = tgc;
667 Sina = nplan.Dot(ns.Crossed(ns2));
670 Angle = 2.*M_PI - Angle;
672 Dangle = -(dnw.Dot(ns2) + ns.Dot(dn2w))/Sina;
673 ncrn = nplan.Crossed(ns);
674 dncrn = dnplan.Crossed(ns).Added(nplan.Crossed(dnw));
677 for (i=2; i <= NbPoint-1; i++) {
678 lambda = (Standard_Real)(i-1)/(Standard_Real)(NbPoint-1);
679 Cosa = Cos(lambda*Angle);
680 Sina = Sin(lambda*Angle);
681 tabP(lowp+i-1).SetXYZ(pts.XYZ() +
682 Abs(ray)*((Cosa-1)*ns.XYZ() + Sina*ncrn.XYZ()));
684 temp.SetLinearForm(-Sina,ns,Cosa,ncrn);
685 temp.Multiply(lambda*Dangle);
686 temp.Add(((Cosa-1)*dnw).Added(Sina*dncrn));
687 temp.Multiply(Abs(ray));
689 tabV(lowv+i-1)= temp;
691 return Standard_True;
693 return Standard_False;
697 //=======================================================================
698 //function : IsRational
700 //=======================================================================
702 Standard_Boolean BlendFunc_CSConstRad::IsRational () const
704 return (mySShape==BlendFunc_Rational || mySShape==BlendFunc_QuasiAngular);
707 //=======================================================================
708 //function : GetSectionSize
710 //=======================================================================
711 Standard_Real BlendFunc_CSConstRad::GetSectionSize() const
713 return maxang*Abs(ray);
716 //=======================================================================
717 //function : GetMinimalWeight
719 //=======================================================================
720 void BlendFunc_CSConstRad::GetMinimalWeight(TColStd_Array1OfReal& Weights) const
722 BlendFunc::GetMinimalWeights(mySShape, myTConv, minang, maxang, Weights );
723 // On suppose que cela ne depend pas du Rayon!
726 //=======================================================================
727 //function : NbIntervals
729 //=======================================================================
731 Standard_Integer BlendFunc_CSConstRad::NbIntervals (const GeomAbs_Shape S) const
733 return curv->NbIntervals(BlendFunc::NextShape(S));
737 //=======================================================================
738 //function : Intervals
740 //=======================================================================
742 void BlendFunc_CSConstRad::Intervals (TColStd_Array1OfReal& T,
743 const GeomAbs_Shape S) const
745 curv->Intervals(T, BlendFunc::NextShape(S));
748 //=======================================================================
749 //function : GetShape
751 //=======================================================================
753 void BlendFunc_CSConstRad::GetShape (Standard_Integer& NbPoles,
754 Standard_Integer& NbKnots,
755 Standard_Integer& Degree,
756 Standard_Integer& NbPoles2d)
759 BlendFunc::GetShape(mySShape,maxang,NbPoles,NbKnots,Degree,myTConv);
762 //=======================================================================
763 //function : GetTolerance
764 //purpose : Determine les Tolerance a utiliser dans les approximations.
765 //=======================================================================
766 void BlendFunc_CSConstRad::GetTolerance(const Standard_Real BoundTol,
767 const Standard_Real SurfTol,
768 const Standard_Real AngleTol,
770 math_Vector& Tol1d) const
772 const Standard_Integer low = Tol3d.Lower();
773 const Standard_Integer up = Tol3d.Upper();
774 const Standard_Real Tol = GeomFill::GetTolerance(myTConv, minang, Abs(ray), AngleTol, SurfTol);
777 Tol3d(low+1) = Tol3d(up-1) = Min( Tol, SurfTol);
778 Tol3d(low) = Tol3d(up) = Min( Tol, BoundTol);
781 //=======================================================================
784 //=======================================================================
786 void BlendFunc_CSConstRad::Knots(TColStd_Array1OfReal& TKnots)
788 GeomFill::Knots(myTConv,TKnots);
792 //=======================================================================
795 //=======================================================================
797 void BlendFunc_CSConstRad::Mults(TColStd_Array1OfInteger& TMults)
799 GeomFill::Mults(myTConv,TMults);
803 //=======================================================================
806 //=======================================================================
808 void BlendFunc_CSConstRad::Section(const Blend_Point& P,
809 TColgp_Array1OfPnt& Poles,
810 TColgp_Array1OfPnt2d& Poles2d,
811 TColStd_Array1OfReal& Weights)
813 gp_Vec d1u1,d1v1;//,d1;
814 gp_Vec ns,ns2;//,temp,np2;
817 Standard_Real norm,u1,v1,w;
819 Standard_Real prm = P.Parameter();
820 Standard_Integer low = Poles.Lower();
821 Standard_Integer upp = Poles.Upper();
823 guide->D1(prm,ptgui,d1gui);
824 nplan = d1gui.Normalized();
826 P.ParametersOnS(u1,v1);
827 w = P.ParameterOnC();
829 surf->D1(u1,v1,pts,d1u1,d1v1);
830 ptc = curv->Value(w);
832 Poles2d(Poles2d.Lower()).SetCoord(u1,v1);
835 if (mySShape == BlendFunc_Linear) {
843 ns = d1u1.Crossed(d1v1);
844 norm = nplan.Crossed(ns).Magnitude();
846 ns.SetLinearForm(nplan.Dot(ns)/norm,nplan, -1./norm,ns);
848 Center.SetXYZ(pts.XYZ()+ray*ns.XYZ());
850 ns2 = gp_Vec(Center,ptc).Normalized();
856 GeomFill::GetCircle(myTConv,
864 //=======================================================================
867 //=======================================================================
869 Standard_Boolean BlendFunc_CSConstRad::Section
870 (const Blend_Point& P,
871 TColgp_Array1OfPnt& Poles,
872 TColgp_Array1OfVec& DPoles,
873 TColgp_Array1OfPnt2d& Poles2d,
874 TColgp_Array1OfVec2d& DPoles2d,
875 TColStd_Array1OfReal& Weights,
876 TColStd_Array1OfReal& DWeights)
879 gp_Vec d1u1,d1v1,d2u1,d2v1,d2uv1,d1;
880 gp_Vec ns,ns2,dnplan,dnw,dn2w; //,np2,dnp2;
882 gp_Vec resulu,resulv,temp,tgct,resul;
886 Standard_Real norm,ndotns,grosterme;
888 math_Vector sol(1,3),valsol(1,3),secmember(1,3);
889 math_Matrix gradsol(1,3,1,3);
891 Standard_Real prm = P.Parameter();
892 Standard_Integer low = Poles.Lower();
893 Standard_Integer upp = Poles.Upper();
894 Standard_Boolean istgt;
896 guide->D2(prm,ptgui,d1gui,d2gui);
897 normtg = d1gui.Magnitude();
898 nplan = d1gui.Normalized();
899 dnplan.SetLinearForm(1./normtg,d2gui,
900 -1./normtg*(nplan.Dot(d2gui)),nplan);
902 P.ParametersOnS(sol(1),sol(2));
903 sol(3) = P.ParameterOnC();
905 Values(sol,valsol,gradsol);
907 surf->D2(sol(1),sol(2),pts,d1u1,d1v1,d2u1,d2v1,d2uv1);
908 curv->D1(sol(3),ptc,d1);
910 temp.SetXYZ(pts.XYZ()- ptgui.XYZ());
911 secmember(1) = normtg - dnplan.Dot(temp);
913 temp.SetXYZ(ptc.XYZ()- ptgui.XYZ());
914 secmember(2) = normtg - dnplan.Dot(temp);
916 ns = d1u1.Crossed(d1v1);
917 ncrossns = nplan.Crossed(ns);
918 ndotns = nplan.Dot(ns);
919 norm = ncrossns.Magnitude();
921 // Derivee de n1 par rapport a w
923 grosterme = ncrossns.Dot(dnplan.Crossed(ns))/norm/norm;
924 dnw.SetLinearForm((dnplan.Dot(ns)-grosterme*ndotns)/norm,nplan,
928 temp.SetLinearForm(ndotns/norm,nplan, -1./norm,ns);
929 resul.SetLinearForm(ray,temp,gp_Vec(ptc,pts));
930 secmember(3) = -2.*ray*(dnw.Dot(resul)); // jag 950105 il manquait ray
932 math_Gauss Resol(gradsol);
934 if (Resol.IsDone()) {
936 Resol.Solve(secmember);
938 tgs.SetLinearForm(secmember(1),d1u1,secmember(2),d1v1);
939 tgc = secmember(3)*d1;
941 // Derivee de n1 par rapport a u1
942 temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
943 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
944 resulu.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
948 // Derivee de n1 par rapport a v1
949 temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
950 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
951 resulv.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
956 dnw.SetLinearForm(secmember(1),resulu,secmember(2),resulv,dnw);
957 ns.SetLinearForm(ndotns/norm,nplan, -1./norm,ns);
959 dn2w.SetLinearForm(ray, dnw, -1., tgc, tgs);
960 norm = resul.Magnitude();
962 ns2 = -resul.Normalized();
963 dn2w.SetLinearForm(ns2.Dot(dn2w),ns2,-1.,dn2w);
965 istgt = Standard_False;
968 ns.SetLinearForm(ndotns/norm,nplan, -1./norm,ns);
969 ns2 = -resul.Normalized();
970 istgt = Standard_True;
975 Poles2d(Poles2d.Lower()).SetCoord(sol(1),sol(2));
977 DPoles2d(Poles2d.Lower()).SetCoord(secmember(1),secmember(2));
981 if (mySShape == BlendFunc_Linear) {
996 Center.SetXYZ(pts.XYZ()+ray*ns.XYZ());
998 tgct = tgs.Added(ray*dnw);
1006 return GeomFill::GetCircle(myTConv,
1020 GeomFill::GetCircle(myTConv,
1025 return Standard_False;
1031 void BlendFunc_CSConstRad::Resolution(const Standard_Integer , const Standard_Real Tol,
1032 Standard_Real& TolU, Standard_Real& TolV) const
1034 TolU = surf->UResolution(Tol);
1035 TolV = surf->VResolution(Tol);