0022627: Change OCCT memory management defaults
[occt.git] / src / GeomLib / GeomLib_DenominatorMultiplier.cxx
CommitLineData
7fd59977 1// File: GeomLib_DenominatorMultiplier.cxx
2// Created: Tue May 13 11:48:12 1997
3// Author: Stagiaire Francois DUMONT
4// <dum@brunox.paris1.matra-dtv.fr>
5
6
7#include <GeomLib_DenominatorMultiplier.ixx>
8#include <gp_Pnt.hxx>
9#include <gp_Vec.hxx>
10#include <TColgp_Array2OfPnt.hxx>
11#include <TColStd_Array2OfReal.hxx>
12#include <TColStd_Array1OfReal.hxx>
13#include <TColStd_Array1OfInteger.hxx>
14#include <BSplSLib.hxx>
15#include <math_Matrix.hxx>
16
17//=======================================================================
18//function :GeomLib_DenominatorMultiplier
19//purpose :
20//=======================================================================
21
22GeomLib_DenominatorMultiplier::GeomLib_DenominatorMultiplier
23 (const Handle(Geom_BSplineSurface) & Surface,
24 const TColStd_Array1OfReal & KnotVector):mySurface(Surface),
25 myKnotFlatVector(1,KnotVector.Length())
26{Standard_Integer i;
27 for (i=1;i<=KnotVector.Length();i++)
28 myKnotFlatVector.SetValue(i,KnotVector(i));
29}
30
31//=======================================================================
32//function : value
33//purpose : give the value of a(UParameter,VParameter)
34//=======================================================================
35
36Standard_Real GeomLib_DenominatorMultiplier::Value(const Standard_Real UParameter,
37 const Standard_Real VParameter)const
38
39{Standard_Real Dumaxv,Duminv,dDduumaxv,dDduuminv,
40 Dv,Buv=0.0;
41// gp_Pnt HermPnt;
42 gp_Pnt N;
43 gp_Vec Nu,Nv;
44 TColgp_Array2OfPnt surface_poles(1,mySurface->NbUPoles(),
45 1,mySurface->NbVPoles()) ;
46 TColStd_Array2OfReal surface_weights(1,mySurface->NbUPoles(),
47 1,mySurface->NbVPoles()) ;
48 TColStd_Array1OfReal surface_u_knots(1,mySurface->NbUKnots()) ;
49 TColStd_Array1OfInteger surface_u_mults(1,mySurface->NbUKnots()) ;
50
51 TColStd_Array1OfReal surface_v_knots(1,mySurface->NbVKnots()) ;
52 TColStd_Array1OfInteger surface_v_mults(1,mySurface->NbVKnots()) ;
53 Standard_Integer udegree,vdegree;
54
55 mySurface->UKnots(surface_u_knots) ;
56 mySurface->UMultiplicities(surface_u_mults) ;
57 mySurface->Poles(surface_poles) ;
58 mySurface->Weights(surface_weights) ;
59 mySurface->VKnots(surface_v_knots) ;
60 mySurface->VMultiplicities(surface_v_mults) ;
61 udegree=mySurface->UDegree();
62 vdegree=mySurface->VDegree();
63
64 BSplSLib::HomogeneousD1(mySurface->UKnot(mySurface->LastUKnotIndex()),VParameter,
65 0,0,
66 surface_poles,
67 surface_weights,
68 surface_u_knots,surface_v_knots,
69 surface_u_mults,surface_v_mults,
70 udegree,vdegree,
71 mySurface->IsURational(),mySurface->IsVRational(),
72 mySurface->IsUPeriodic(),mySurface->IsVPeriodic(),
73 N,Nu,Nv,
74 Dumaxv,
75 dDduumaxv,
76 Dv);
77 BSplSLib::HomogeneousD1(mySurface->UKnot(1),VParameter,
78 0,0,
79 surface_poles,
80 surface_weights,
81 surface_u_knots,surface_v_knots,
82 surface_u_mults,surface_v_mults,
83 udegree,vdegree,
84 mySurface->IsURational(),mySurface->IsVRational(),
85 mySurface->IsUPeriodic(),mySurface->IsVPeriodic(),
86 N,Nu,Nv,
87 Duminv,
88 dDduuminv,
89 Dv);
90
91 math_Matrix BSplineBasisDeriv(1,2,1,4,0.0);
92 Standard_Real B1prim0,Bprelastprim1,
93 lambda=(mySurface->Weight(1,1)/mySurface->Weight(mySurface->NbUPoles(),1));
94 Standard_Integer index,i;
95
96 BSplCLib::EvalBsplineBasis(1,
97 1,
98 4,
99 myKnotFlatVector,
100 0.0,
101 index,
102 BSplineBasisDeriv);
103 B1prim0=BSplineBasisDeriv(2,2);
104
105 BSplCLib::EvalBsplineBasis(1,
106 1,
107 4,
108 myKnotFlatVector,
109 1.0,
110 index,
111 BSplineBasisDeriv);
112 Bprelastprim1=BSplineBasisDeriv(2,3);
113
114 math_Matrix BSplineBasisValue(1,1,1,4,0.0);
115 BSplCLib::EvalBsplineBasis(1,
116 0,
117 4,
118 myKnotFlatVector,
119 UParameter,
120 index,
121 BSplineBasisValue);
122
123 TColStd_Array1OfReal value(0,5);
124 TColStd_Array1OfReal Polesenv(0,5); //poles of a(u,v)
125
126 for (i=0;i<=5;i++)
127 Polesenv(i)=0.0;
128 Polesenv(0)=Duminv;
129 Polesenv(1)=Duminv-dDduuminv/B1prim0;
130 Polesenv(4)=lambda*lambda*(Dumaxv-dDduumaxv/Bprelastprim1);
131 Polesenv(5)=lambda*lambda*Dumaxv;
132
133 if (myKnotFlatVector.Length()==8){
134 value(0)=BSplineBasisValue(1,1); //values of the basic functions
135 value(1)=BSplineBasisValue(1,2);
136 value(2)=0.0;
137 value(3)=0.0;
138 value(4)=BSplineBasisValue(1,3);
139 value(5)=BSplineBasisValue(1,4);
140 }
141 if (myKnotFlatVector.Length()==9){
142 if (index==1){
143 value(0)=BSplineBasisValue(1,1);
144 value(1)=BSplineBasisValue(1,2);
145 value(2)=BSplineBasisValue(1,3);
146 value(3)=0.0;
147 value(4)=BSplineBasisValue(1,4);
148 value(5)=0.0;
149 }
150 else{
151 value(0)=0.0;
152 value(1)=BSplineBasisValue(1,1);
153 value(2)=BSplineBasisValue(1,2);
154 value(3)=0.0;
155 value(4)=BSplineBasisValue(1,3);
156 value(5)=BSplineBasisValue(1,4);
157 }
158 Polesenv(2)=(0.5*(Polesenv(0)+Polesenv(5)));
159 }
160 if (myKnotFlatVector.Length()==10){
161 if (index==1){
162 value(0)=BSplineBasisValue(1,1);
163 value(1)=BSplineBasisValue(1,2);
164 value(2)=BSplineBasisValue(1,3);
165 value(3)=BSplineBasisValue(1,4);
166 value(4)=0.0;
167 value(5)=0.0;
168 }
169 if (index==2){
170 value(0)=0.0;
171 value(1)=BSplineBasisValue(1,1);
172 value(2)=BSplineBasisValue(1,2);
173 value(3)=BSplineBasisValue(1,3);
174 value(4)=BSplineBasisValue(1,4);
175 value(5)=0.0;
176 }
177 if (index==3){
178 value(0)=0.0;
179 value(1)=0.0;
180 value(2)=BSplineBasisValue(1,1);
181 value(3)=BSplineBasisValue(1,2);
182 value(4)=BSplineBasisValue(1,3);
183 value(5)=BSplineBasisValue(1,4);
184 }
185 Polesenv(2)=(0.5*(Polesenv(0)+Polesenv(5)));
186 Polesenv(3)=Polesenv(2);
187 }
188 for (i=0;i<=5;i++)
189 Buv+=Polesenv(i)*value(i);
190 return Buv;
191}
192
193
194
195