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 | |
22 | GeomLib_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 | |
36 | Standard_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 | |