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_HCurve.hxx>
21 #include <Adaptor3d_HSurface.hxx>
22 #include <Blend_Point.hxx>
23 #include <BlendFunc.hxx>
24 #include <BlendFunc_CSConstRad.hxx>
26 #include <GeomFill.hxx>
28 #include <gp_Circ.hxx>
30 #include <gp_Pnt2d.hxx>
32 #include <gp_Vec2d.hxx>
33 #include <math_Gauss.hxx>
34 #include <math_Matrix.hxx>
35 #include <Precision.hxx>
36 #include <Standard_DomainError.hxx>
37 #include <Standard_NotImplemented.hxx>
39 //=======================================================================
40 //function : BlendFunc_CSConstRad
42 //=======================================================================
43 BlendFunc_CSConstRad::BlendFunc_CSConstRad(const Handle(Adaptor3d_HSurface)& S,
44 const Handle(Adaptor3d_HCurve)& C,
45 const Handle(Adaptor3d_HCurve)& CG) :
47 surf(S),curv(C),guide(CG),istangent(Standard_True),
48 maxang(RealFirst()), minang(RealLast()),mySShape(BlendFunc_Rational)
52 //=======================================================================
53 //function : NbEquations
55 //=======================================================================
57 Standard_Integer BlendFunc_CSConstRad::NbEquations () const
63 //=======================================================================
66 //=======================================================================
68 void BlendFunc_CSConstRad::Set(const Standard_Real Radius, const Standard_Integer Choix)
75 //=======================================================================
78 //=======================================================================
80 void BlendFunc_CSConstRad::Set(const BlendFunc_SectionShape TypeSection)
82 mySShape = TypeSection;
86 //=======================================================================
89 //=======================================================================
91 void BlendFunc_CSConstRad::Set(const Standard_Real Param)
93 guide->D2(Param,ptgui,d1gui,d2gui);
94 normtg = d1gui.Magnitude();
95 nplan = d1gui.Normalized();
96 theD = - (nplan.XYZ().Dot(ptgui.XYZ()));
100 //=======================================================================
103 //=======================================================================
105 void BlendFunc_CSConstRad::Set(const Standard_Real, const Standard_Real)
107 throw Standard_NotImplemented("BlendFunc_CSConstRad::Set");
111 //=======================================================================
112 //function : GetTolerance
114 //=======================================================================
116 void BlendFunc_CSConstRad::GetTolerance(math_Vector& Tolerance, const Standard_Real Tol) const
118 Tolerance(1) = surf->UResolution(Tol);
119 Tolerance(2) = surf->VResolution(Tol);
120 Tolerance(3) = curv->Resolution(Tol);
124 //=======================================================================
125 //function : GetBounds
127 //=======================================================================
129 void BlendFunc_CSConstRad::GetBounds(math_Vector& InfBound, math_Vector& SupBound) const
131 InfBound(1) = surf->FirstUParameter();
132 InfBound(2) = surf->FirstVParameter();
133 InfBound(3) = curv->FirstParameter();
134 SupBound(1) = surf->LastUParameter();
135 SupBound(2) = surf->LastVParameter();
136 SupBound(3) = curv->LastParameter();
138 if(!Precision::IsInfinite(InfBound(1)) &&
139 !Precision::IsInfinite(SupBound(1))) {
140 const Standard_Real range = (SupBound(1) - InfBound(1));
141 InfBound(1) -= range;
142 SupBound(1) += range;
144 if(!Precision::IsInfinite(InfBound(2)) &&
145 !Precision::IsInfinite(SupBound(2))) {
146 const Standard_Real range = (SupBound(2) - InfBound(2));
147 InfBound(2) -= range;
148 SupBound(2) += range;
153 //=======================================================================
154 //function : IsSolution
156 //=======================================================================
158 Standard_Boolean BlendFunc_CSConstRad::IsSolution(const math_Vector& Sol, const Standard_Real Tol)
160 math_Vector valsol(1,3),secmember(1,3);
161 math_Matrix gradsol(1,3,1,3);
163 gp_Vec dnplan,d1u1,d1v1,d1,temp,ns,ns2,ncrossns,resul;
164 Standard_Real norm,ndotns,grosterme;
165 Standard_Real Cosa,Sina,Angle;
167 Values(Sol,valsol,gradsol);
168 if (Abs(valsol(1)) <= Tol &&
169 Abs(valsol(2)) <= Tol &&
170 Abs(valsol(3)) <= Tol*Tol) {
172 // Calcul des tangentes
174 pt2d = gp_Pnt2d(Sol(1),Sol(2));
176 surf->D1(Sol(1),Sol(2),pts,d1u1,d1v1);
177 curv->D1(Sol(3),ptc,d1);
178 dnplan.SetLinearForm(1./normtg,d2gui,
179 -1./normtg*(nplan.Dot(d2gui)),nplan);
181 temp.SetXYZ(pts.XYZ() - ptgui.XYZ());
182 secmember(1) = normtg - dnplan.Dot(temp);
184 temp.SetXYZ(ptc.XYZ() - ptgui.XYZ());
185 secmember(2) = normtg - dnplan.Dot(temp);
187 ns = d1u1.Crossed(d1v1);
188 ncrossns = nplan.Crossed(ns);
189 ndotns = nplan.Dot(ns);
190 norm = ncrossns.Magnitude();
192 grosterme = ncrossns.Dot(dnplan.Crossed(ns))/norm/norm;
193 temp.SetLinearForm(ray/norm*(dnplan.Dot(ns)-grosterme*ndotns),nplan,
194 ray*ndotns/norm,dnplan,
195 ray*grosterme/norm,ns);
197 ns.SetLinearForm(ndotns/norm,nplan, -1./norm,ns);
198 resul.SetLinearForm(ray,ns,gp_Vec(ptc,pts));
199 secmember(3) = -2.*(temp.Dot(resul));
201 math_Gauss Resol(gradsol);
202 if (Resol.IsDone()) {
204 Resol.Solve(secmember);
206 tgs.SetLinearForm(secmember(1),d1u1,secmember(2),d1v1);
207 tgc = secmember(3)*d1;
208 tg2d.SetCoord(secmember(1),secmember(2));
209 istangent = Standard_False;
212 istangent = Standard_True;
214 // mise a jour de maxang
216 ns2 = -resul.Normalized();
219 Sina = nplan.Dot(ns.Crossed(ns2));
221 Sina = -Sina; //nplan est change en -nplan
226 Angle = 2.*M_PI - Angle;
229 if (Angle>maxang) {maxang = Angle;}
230 if (Angle<minang) {minang = Angle;}
232 return Standard_True;
234 istangent = Standard_True;
235 return Standard_False;
239 //=======================================================================
242 //=======================================================================
244 Standard_Boolean BlendFunc_CSConstRad::Value(const math_Vector& X, math_Vector& F)
247 surf->D1(X(1),X(2),pts,d1u1,d1v1);
248 ptc = curv->Value(X(3));
250 F(1) = nplan.XYZ().Dot(pts.XYZ()) + theD;
251 F(2) = nplan.XYZ().Dot(ptc.XYZ()) + theD;
253 gp_Vec vref, ns = d1u1.Crossed(d1v1);
254 const Standard_Real norm = nplan.Crossed(ns).Magnitude();
255 ns.SetLinearForm(nplan.Dot(ns)/norm,nplan, -1./norm,ns);
256 vref.SetLinearForm(ray,ns,gp_Vec(ptc,pts));
258 F(3) = vref.SquareMagnitude() - ray*ray;
260 pt2d = gp_Pnt2d(X(1),X(2));
261 return Standard_True;
265 //=======================================================================
266 //function : Derivatives
268 //=======================================================================
270 Standard_Boolean BlendFunc_CSConstRad::Derivatives(const math_Vector& X, math_Matrix& D)
272 gp_Vec d1u1,d1v1,d2u1,d2v1,d2uv1,d1;
273 gp_Vec ns,ncrossns,resul,temp, vref;
275 Standard_Real norm,ndotns,grosterme;
277 surf->D2(X(1),X(2),pts,d1u1,d1v1,d2u1,d2v1,d2uv1);
278 curv->D1(X(3),ptc,d1);
280 D(1,1) = nplan.Dot(d1u1);
281 D(1,2) = nplan.Dot(d1v1);
286 D(2,3) = nplan.Dot(d1);
289 ns = d1u1.Crossed(d1v1);
290 ncrossns = nplan.Crossed(ns);
291 norm = ncrossns.Magnitude();
292 ndotns = nplan.Dot(ns);
294 vref.SetLinearForm(ndotns,nplan,-1.,ns);
296 vref.SetLinearForm(ray,vref,gp_Vec(ptc,pts));
298 // Derivee par rapport a u1
299 temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
300 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
301 resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
302 ray*grosterme/norm,ns,
306 D(3,1) = 2.*(resul.Dot(vref));
309 // Derivee par rapport a v1
310 temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
311 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
312 resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
313 ray*grosterme/norm,ns,
317 D(3,2) = 2.*(resul.Dot(vref));
319 D(3,3) = -2.*(d1.Dot(vref));
321 pt2d = gp_Pnt2d(X(1),X(2));
322 return Standard_True;
326 //=======================================================================
329 //=======================================================================
331 Standard_Boolean BlendFunc_CSConstRad::Values(const math_Vector& X, math_Vector& F, math_Matrix& D)
334 gp_Vec d2u1,d2v1,d2uv1;
335 gp_Vec ns,ncrossns,resul,temp,vref;
337 Standard_Real norm,ndotns,grosterme;
339 surf->D2(X(1),X(2),pts,d1u1,d1v1,d2u1,d2v1,d2uv1);
340 curv->D1(X(3),ptc,d1);
342 F(1) = nplan.XYZ().Dot(pts.XYZ()) + theD;
343 F(2) = nplan.XYZ().Dot(ptc.XYZ()) + theD;
345 D(1,1) = nplan.Dot(d1u1);
346 D(1,2) = nplan.Dot(d1v1);
351 D(2,3) = nplan.Dot(d1);
354 ns = d1u1.Crossed(d1v1);
355 ncrossns = nplan.Crossed(ns);
356 norm = ncrossns.Magnitude();
357 ndotns = nplan.Dot(ns);
359 vref.SetLinearForm(ndotns,nplan,-1.,ns);
361 vref.SetLinearForm(ray,vref,gp_Vec(ptc,pts));
363 F(3) = vref.SquareMagnitude() - ray*ray;
366 // Derivee par rapport a u1
367 temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
368 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
369 resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
370 ray*grosterme/norm,ns,
374 D(3,1) = 2.*(resul.Dot(vref));
377 // Derivee par rapport a v1
378 temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
379 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
380 resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
381 ray*grosterme/norm,ns,
385 D(3,2) = 2.*(resul.Dot(vref));
387 D(3,3) = -2.*(d1.Dot(vref));
389 pt2d = gp_Pnt2d(X(1),X(2));
390 return Standard_True;
395 //=======================================================================
396 //function : PointOnS
398 //=======================================================================
400 const gp_Pnt& BlendFunc_CSConstRad::PointOnS () const
405 //=======================================================================
406 //function : PointOnC
408 //=======================================================================
410 const gp_Pnt& BlendFunc_CSConstRad::PointOnC () const
415 //=======================================================================
418 //=======================================================================
420 const gp_Pnt2d& BlendFunc_CSConstRad::Pnt2d () const
425 //=======================================================================
426 //function : ParameterOnC
428 //=======================================================================
430 Standard_Real BlendFunc_CSConstRad::ParameterOnC () const
436 //=======================================================================
437 //function : IsTangencyPoint
439 //=======================================================================
441 Standard_Boolean BlendFunc_CSConstRad::IsTangencyPoint () const
446 //=======================================================================
447 //function : TangentOnS
449 //=======================================================================
451 const gp_Vec& BlendFunc_CSConstRad::TangentOnS () const
454 throw Standard_DomainError("BlendFunc_CSConstRad::TangentOnS");
458 //=======================================================================
459 //function : TangentOnC
461 //=======================================================================
463 const gp_Vec& BlendFunc_CSConstRad::TangentOnC () const
466 throw Standard_DomainError("BlendFunc_CSConstRad::TangentOnC");
470 //=======================================================================
471 //function : Tangent2d
473 //=======================================================================
475 const gp_Vec2d& BlendFunc_CSConstRad::Tangent2d () const
478 throw Standard_DomainError("BlendFunc_CSConstRad::Tangent2d");
483 //=======================================================================
486 //=======================================================================
488 void BlendFunc_CSConstRad::Tangent(const Standard_Real U, const Standard_Real V,
489 gp_Vec& TgS, gp_Vec& NmS) const
493 surf->D1(U,V,bid,d1u,d1v);
496 NmS = ns = d1u.Crossed(d1v);
498 const Standard_Real norm = nplan.Crossed(ns).Magnitude();
499 ns.SetLinearForm(nplan.Dot(ns)/norm,nplan, -1./norm,ns);
501 gp_Pnt Center(bid.XYZ()+ray*ns.XYZ());
502 TgS = nplan.Crossed(gp_Vec(Center,bid));
508 //=======================================================================
511 //=======================================================================
513 void BlendFunc_CSConstRad::Section(const Standard_Real Param,
514 const Standard_Real U,
515 const Standard_Real V,
516 const Standard_Real W,
526 guide->D1(Param,ptgui,d1gui);
527 nplan = d1gui.Normalized();
529 surf->D1(U,V,pts,d1u1,d1v1);
530 ptc = curv->Value(W);
532 ns = d1u1.Crossed(d1v1);
534 norm = nplan.Crossed(ns).Magnitude();
535 ns.SetLinearForm(nplan.Dot(ns)/norm,nplan, -1./norm,ns);
536 Center.SetXYZ(pts.XYZ()+ray*ns.XYZ());
537 C.SetRadius(Abs(ray));
540 C.SetPosition(gp_Ax2(Center,nplan,ns));
543 C.SetPosition(gp_Ax2(Center,nplan.Reversed(),ns));
546 Pfin = ElCLib::Parameter(C,ptc);
549 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&)
551 throw Standard_DomainError("BlendFunc_CSConstRad::Section : Not implemented");
554 //=======================================================================
555 //function : GetSection
557 //=======================================================================
559 Standard_Boolean BlendFunc_CSConstRad::GetSection(const Standard_Real Param,
560 const Standard_Real U,
561 const Standard_Real V,
562 const Standard_Real W,
563 TColgp_Array1OfPnt& tabP,
564 TColgp_Array1OfVec& tabV)
566 Standard_Integer NbPoint=tabP.Length();
567 if (NbPoint != tabV.Length() || NbPoint < 2) {throw Standard_RangeError();}
569 Standard_Integer i, lowp = tabP.Lower(), lowv = tabV.Lower();
571 gp_Vec d1u1,d1v1,d2u1,d2v1,d2uv1,d1; //,d1u2,d1v2;
572 gp_Vec ns,dnplan,dnw,dn2w,ncrn,dncrn,ns2;
573 gp_Vec ncrossns,resul;
574 gp_Vec resulu,resulv,temp;
576 Standard_Real norm,ndotns,grosterme;
577 Standard_Real lambda,Cosa,Sina;
578 Standard_Real Angle = 0.,Dangle = 0.;
579 math_Vector sol(1,3),valsol(1,3),secmember(1,3);
580 math_Matrix gradsol(1,3,1,3);
582 guide->D2(Param,ptgui,d1gui,d2gui);
583 normtg = d1gui.Magnitude();
584 nplan = d1gui.Normalized();
585 dnplan.SetLinearForm(1./normtg,d2gui,
586 -1./normtg*(nplan.Dot(d2gui)),nplan);
588 sol(1) = U; sol(2) = V; sol(3) = W;
590 Values(sol,valsol,gradsol);
592 surf->D2(U,V,pts,d1u1,d1v1,d2u1,d2v1,d2uv1);
595 temp.SetXYZ(pts.XYZ()- ptgui.XYZ());
596 secmember(1) = normtg - dnplan.Dot(temp);
598 temp.SetXYZ(ptc.XYZ()- ptgui.XYZ());
599 secmember(2) = normtg - dnplan.Dot(temp);
601 ns = d1u1.Crossed(d1v1);
602 ncrossns = nplan.Crossed(ns);
603 ndotns = nplan.Dot(ns);
604 norm = ncrossns.Magnitude();
606 // Derivee de n1 par rapport a w
608 grosterme = ncrossns.Dot(dnplan.Crossed(ns))/norm/norm;
609 dnw.SetLinearForm((dnplan.Dot(ns)-grosterme*ndotns)/norm,nplan,
613 temp.SetLinearForm(ndotns/norm,nplan, -1./norm,ns);
614 resul.SetLinearForm(ray,temp,gp_Vec(ptc,pts));
615 secmember(3) = -2.*ray*(dnw.Dot(resul)); // jag 950105 il manquait ray
617 math_Gauss Resol(gradsol);
618 if (Resol.IsDone()) {
620 Resol.Solve(secmember);
622 tgs.SetLinearForm(secmember(1),d1u1,secmember(2),d1v1);
623 tgc = secmember(3)*d1;
625 // Derivee de n1 par rapport a u1
626 temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
627 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
628 resulu.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
632 // Derivee de n1 par rapport a v1
633 temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
634 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
635 resulv.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
640 dnw.SetLinearForm(secmember(1),resulu,secmember(2),resulv,dnw);
641 ns.SetLinearForm(ndotns/norm,nplan, -1./norm,ns);
643 dn2w.SetLinearForm(ray, dnw, -1., tgc, tgs);
644 norm = resul.Magnitude();
646 ns2 = -resul.Normalized();
647 dn2w.SetLinearForm(ns2.Dot(dn2w),ns2,-1.,dn2w);
656 tabP(lowp+NbPoint-1) = ptc;
659 tabV(lowv+NbPoint-1) = tgc;
664 Sina = nplan.Dot(ns.Crossed(ns2));
667 Angle = 2.*M_PI - Angle;
669 Dangle = -(dnw.Dot(ns2) + ns.Dot(dn2w))/Sina;
670 ncrn = nplan.Crossed(ns);
671 dncrn = dnplan.Crossed(ns).Added(nplan.Crossed(dnw));
674 for (i=2; i <= NbPoint-1; i++) {
675 lambda = (Standard_Real)(i-1)/(Standard_Real)(NbPoint-1);
676 Cosa = Cos(lambda*Angle);
677 Sina = Sin(lambda*Angle);
678 tabP(lowp+i-1).SetXYZ(pts.XYZ() +
679 Abs(ray)*((Cosa-1)*ns.XYZ() + Sina*ncrn.XYZ()));
681 temp.SetLinearForm(-Sina,ns,Cosa,ncrn);
682 temp.Multiply(lambda*Dangle);
683 temp.Add(((Cosa-1)*dnw).Added(Sina*dncrn));
684 temp.Multiply(Abs(ray));
686 tabV(lowv+i-1)= temp;
688 return Standard_True;
690 return Standard_False;
694 //=======================================================================
695 //function : IsRational
697 //=======================================================================
699 Standard_Boolean BlendFunc_CSConstRad::IsRational () const
701 return (mySShape==BlendFunc_Rational || mySShape==BlendFunc_QuasiAngular);
704 //=======================================================================
705 //function : GetSectionSize
707 //=======================================================================
708 Standard_Real BlendFunc_CSConstRad::GetSectionSize() const
710 return maxang*Abs(ray);
713 //=======================================================================
714 //function : GetMinimalWeight
716 //=======================================================================
717 void BlendFunc_CSConstRad::GetMinimalWeight(TColStd_Array1OfReal& Weights) const
719 BlendFunc::GetMinimalWeights(mySShape, myTConv, minang, maxang, Weights );
720 // On suppose que cela ne depend pas du Rayon!
723 //=======================================================================
724 //function : NbIntervals
726 //=======================================================================
728 Standard_Integer BlendFunc_CSConstRad::NbIntervals (const GeomAbs_Shape S) const
730 return curv->NbIntervals(BlendFunc::NextShape(S));
734 //=======================================================================
735 //function : Intervals
737 //=======================================================================
739 void BlendFunc_CSConstRad::Intervals (TColStd_Array1OfReal& T,
740 const GeomAbs_Shape S) const
742 curv->Intervals(T, BlendFunc::NextShape(S));
745 //=======================================================================
746 //function : GetShape
748 //=======================================================================
750 void BlendFunc_CSConstRad::GetShape (Standard_Integer& NbPoles,
751 Standard_Integer& NbKnots,
752 Standard_Integer& Degree,
753 Standard_Integer& NbPoles2d)
756 BlendFunc::GetShape(mySShape,maxang,NbPoles,NbKnots,Degree,myTConv);
759 //=======================================================================
760 //function : GetTolerance
761 //purpose : Determine les Tolerance a utiliser dans les approximations.
762 //=======================================================================
763 void BlendFunc_CSConstRad::GetTolerance(const Standard_Real BoundTol,
764 const Standard_Real SurfTol,
765 const Standard_Real AngleTol,
767 math_Vector& Tol1d) const
769 const Standard_Integer low = Tol3d.Lower();
770 const Standard_Integer up = Tol3d.Upper();
771 const Standard_Real Tol = GeomFill::GetTolerance(myTConv, minang, Abs(ray), AngleTol, SurfTol);
774 Tol3d(low+1) = Tol3d(up-1) = Min( Tol, SurfTol);
775 Tol3d(low) = Tol3d(up) = Min( Tol, BoundTol);
778 //=======================================================================
781 //=======================================================================
783 void BlendFunc_CSConstRad::Knots(TColStd_Array1OfReal& TKnots)
785 GeomFill::Knots(myTConv,TKnots);
789 //=======================================================================
792 //=======================================================================
794 void BlendFunc_CSConstRad::Mults(TColStd_Array1OfInteger& TMults)
796 GeomFill::Mults(myTConv,TMults);
800 //=======================================================================
803 //=======================================================================
805 void BlendFunc_CSConstRad::Section(const Blend_Point& P,
806 TColgp_Array1OfPnt& Poles,
807 TColgp_Array1OfPnt2d& Poles2d,
808 TColStd_Array1OfReal& Weights)
810 gp_Vec d1u1,d1v1;//,d1;
811 gp_Vec ns,ns2;//,temp,np2;
814 Standard_Real norm,u1,v1,w;
816 Standard_Real prm = P.Parameter();
817 Standard_Integer low = Poles.Lower();
818 Standard_Integer upp = Poles.Upper();
820 guide->D1(prm,ptgui,d1gui);
821 nplan = d1gui.Normalized();
823 P.ParametersOnS(u1,v1);
824 w = P.ParameterOnC();
826 surf->D1(u1,v1,pts,d1u1,d1v1);
827 ptc = curv->Value(w);
829 Poles2d(Poles2d.Lower()).SetCoord(u1,v1);
832 if (mySShape == BlendFunc_Linear) {
840 ns = d1u1.Crossed(d1v1);
841 norm = nplan.Crossed(ns).Magnitude();
843 ns.SetLinearForm(nplan.Dot(ns)/norm,nplan, -1./norm,ns);
845 Center.SetXYZ(pts.XYZ()+ray*ns.XYZ());
847 ns2 = gp_Vec(Center,ptc).Normalized();
853 GeomFill::GetCircle(myTConv,
861 //=======================================================================
864 //=======================================================================
866 Standard_Boolean BlendFunc_CSConstRad::Section
867 (const Blend_Point& P,
868 TColgp_Array1OfPnt& Poles,
869 TColgp_Array1OfVec& DPoles,
870 TColgp_Array1OfPnt2d& Poles2d,
871 TColgp_Array1OfVec2d& DPoles2d,
872 TColStd_Array1OfReal& Weights,
873 TColStd_Array1OfReal& DWeights)
876 gp_Vec d1u1,d1v1,d2u1,d2v1,d2uv1,d1;
877 gp_Vec ns,ns2,dnplan,dnw,dn2w; //,np2,dnp2;
879 gp_Vec resulu,resulv,temp,tgct,resul;
883 Standard_Real norm,ndotns,grosterme;
885 math_Vector sol(1,3),valsol(1,3),secmember(1,3);
886 math_Matrix gradsol(1,3,1,3);
888 Standard_Real prm = P.Parameter();
889 Standard_Integer low = Poles.Lower();
890 Standard_Integer upp = Poles.Upper();
891 Standard_Boolean istgt;
893 guide->D2(prm,ptgui,d1gui,d2gui);
894 normtg = d1gui.Magnitude();
895 nplan = d1gui.Normalized();
896 dnplan.SetLinearForm(1./normtg,d2gui,
897 -1./normtg*(nplan.Dot(d2gui)),nplan);
899 P.ParametersOnS(sol(1),sol(2));
900 sol(3) = P.ParameterOnC();
902 Values(sol,valsol,gradsol);
904 surf->D2(sol(1),sol(2),pts,d1u1,d1v1,d2u1,d2v1,d2uv1);
905 curv->D1(sol(3),ptc,d1);
907 temp.SetXYZ(pts.XYZ()- ptgui.XYZ());
908 secmember(1) = normtg - dnplan.Dot(temp);
910 temp.SetXYZ(ptc.XYZ()- ptgui.XYZ());
911 secmember(2) = normtg - dnplan.Dot(temp);
913 ns = d1u1.Crossed(d1v1);
914 ncrossns = nplan.Crossed(ns);
915 ndotns = nplan.Dot(ns);
916 norm = ncrossns.Magnitude();
918 // Derivee de n1 par rapport a w
920 grosterme = ncrossns.Dot(dnplan.Crossed(ns))/norm/norm;
921 dnw.SetLinearForm((dnplan.Dot(ns)-grosterme*ndotns)/norm,nplan,
925 temp.SetLinearForm(ndotns/norm,nplan, -1./norm,ns);
926 resul.SetLinearForm(ray,temp,gp_Vec(ptc,pts));
927 secmember(3) = -2.*ray*(dnw.Dot(resul)); // jag 950105 il manquait ray
929 math_Gauss Resol(gradsol);
931 if (Resol.IsDone()) {
933 Resol.Solve(secmember);
935 tgs.SetLinearForm(secmember(1),d1u1,secmember(2),d1v1);
936 tgc = secmember(3)*d1;
938 // Derivee de n1 par rapport a u1
939 temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
940 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
941 resulu.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
945 // Derivee de n1 par rapport a v1
946 temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
947 grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
948 resulv.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
953 dnw.SetLinearForm(secmember(1),resulu,secmember(2),resulv,dnw);
954 ns.SetLinearForm(ndotns/norm,nplan, -1./norm,ns);
956 dn2w.SetLinearForm(ray, dnw, -1., tgc, tgs);
957 norm = resul.Magnitude();
959 ns2 = -resul.Normalized();
960 dn2w.SetLinearForm(ns2.Dot(dn2w),ns2,-1.,dn2w);
962 istgt = Standard_False;
965 ns.SetLinearForm(ndotns/norm,nplan, -1./norm,ns);
966 ns2 = -resul.Normalized();
967 istgt = Standard_True;
972 Poles2d(Poles2d.Lower()).SetCoord(sol(1),sol(2));
974 DPoles2d(Poles2d.Lower()).SetCoord(secmember(1),secmember(2));
978 if (mySShape == BlendFunc_Linear) {
993 Center.SetXYZ(pts.XYZ()+ray*ns.XYZ());
995 tgct = tgs.Added(ray*dnw);
1003 return GeomFill::GetCircle(myTConv,
1017 GeomFill::GetCircle(myTConv,
1022 return Standard_False;
1028 void BlendFunc_CSConstRad::Resolution(const Standard_Integer , const Standard_Real Tol,
1029 Standard_Real& TolU, Standard_Real& TolV) const
1031 TolU = surf->UResolution(Tol);
1032 TolV = surf->VResolution(Tol);