0024023: Revamp the OCCT Handle - gcc and clang
[occt.git] / src / GeomFill / GeomFill_CoonsAlgPatch.cxx
1 // Created on: 1995-12-04
2 // Created by: Laurent BOURESCHE
3 // Copyright (c) 1995-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <GeomFill_Boundary.hxx>
19 #include <GeomFill_CoonsAlgPatch.hxx>
20 #include <gp_Pnt.hxx>
21 #include <gp_Vec.hxx>
22 #include <gp_XYZ.hxx>
23 #include <Law_Function.hxx>
24 #include <Law_Linear.hxx>
25 #include <Standard_Type.hxx>
26
27 //=======================================================================
28 //function : GeomFill_CoonsAlgPatch
29 //purpose  : 
30 //=======================================================================
31 GeomFill_CoonsAlgPatch::GeomFill_CoonsAlgPatch
32 (const Handle(GeomFill_Boundary)& B1, 
33  const Handle(GeomFill_Boundary)& B2, 
34  const Handle(GeomFill_Boundary)& B3, 
35  const Handle(GeomFill_Boundary)& B4)
36 {
37   bound[0] = B1; bound[1] = B2; bound[2] = B3; bound[3] = B4; 
38   Standard_Real deb0, deb1, fin0, fin1;
39
40   B2->Bounds(deb1,fin1);
41   Handle(Law_Linear) aLaw0 = new Law_Linear();
42   aLaw0->Set (deb1, 1., fin1, 0.);
43   a[0] = aLaw0;
44
45   B1->Bounds(deb0,fin0);
46   Handle(Law_Linear) aLaw1 = new Law_Linear();
47   aLaw1->Set (deb0, 0., fin0, 1.);
48   a[1] = aLaw1;
49
50   gp_XYZ temp;
51   temp = B4->Value(deb1).XYZ().Added(B1->Value(deb0).XYZ());
52   temp.Multiply(0.5);
53   c[0].SetXYZ(temp);
54   temp = B1->Value(fin0).XYZ().Added(B2->Value(deb1).XYZ());
55   temp.Multiply(0.5);
56   c[1].SetXYZ(temp);
57   temp = B2->Value(fin1).XYZ().Added(B3->Value(fin0).XYZ());
58   temp.Multiply(0.5);
59   c[2].SetXYZ(temp);
60   temp = B3->Value(deb0).XYZ().Added(B4->Value(fin1).XYZ());
61   temp.Multiply(0.5);
62   c[3].SetXYZ(temp);
63 }
64
65
66 //=======================================================================
67 //function : SetFunc
68 //purpose  : 
69 //=======================================================================
70
71 void GeomFill_CoonsAlgPatch::SetFunc(const Handle(Law_Function)& f1, 
72                                      const Handle(Law_Function)& f2)
73 {
74   a[0] = f1;
75   a[1] = f2;
76 }
77
78
79 //=======================================================================
80 //function : Func
81 //purpose  : 
82 //=======================================================================
83
84 void GeomFill_CoonsAlgPatch::Func(Handle(Law_Function)& f1, 
85                                   Handle(Law_Function)& f2)const 
86 {
87   f1 = a[0];
88   f2 = a[1];
89 }
90
91
92 //=======================================================================
93 //function : Value
94 //purpose  : 
95 //=======================================================================
96
97 //gp_Pnt GeomFill_CoonsAlgPatch::Value(const Standard_Real U, 
98 gp_Pnt GeomFill_CoonsAlgPatch::Value(const Standard_Real , 
99                                      const Standard_Real V) const 
100 {
101   Standard_Real a0,a1,a2,a3;
102   a0 = a[0]->Value(V);
103   a1 = a[1]->Value(V);
104   a2 = 1. - a0;
105   a3 = 1. - a1;
106   gp_XYZ cor,cortemp;
107
108   cor = bound[0]->Value(V).XYZ();
109   cor.Multiply(a0);
110
111   cortemp = bound[1]->Value(V).XYZ();
112   cortemp.Multiply(a1);
113   cor.Add(cortemp);
114
115   cortemp = bound[2]->Value(V).XYZ();
116   cortemp.Multiply(a2);
117   cor.Add(cortemp);
118
119   cortemp = bound[3]->Value(V).XYZ();
120   cortemp.Multiply(a3);
121   cor.Add(cortemp);
122
123   cortemp = c[0].XYZ();
124   cortemp.Multiply(-a0*a3);
125   cor.Add(cortemp);
126   
127   cortemp = c[1].XYZ();
128   cortemp.Multiply(-a0*a1);
129   cor.Add(cortemp);
130   
131   cortemp = c[2].XYZ();
132   cortemp.Multiply(-a1*a2);
133   cor.Add(cortemp);
134   
135   cortemp = c[3].XYZ();
136   cortemp.Multiply(-a2*a3);
137   cor.Add(cortemp);
138
139   return gp_Pnt(cor);
140 }
141
142
143 //=======================================================================
144 //function : D1U
145 //purpose  : 
146 //=======================================================================
147
148 gp_Vec GeomFill_CoonsAlgPatch::D1U(const Standard_Real U, 
149                                    const Standard_Real V) const 
150 {
151   Standard_Real a0,a1,a2,a3,bid;
152   a0 = a[0]->Value(V);
153   a[1]->D1(U,bid,a1);
154   a2 = 1 - a0;
155   a3 = -a1;
156   gp_XYZ cor,cortemp;
157   gp_Pnt pbid;
158   gp_Vec vbid;
159
160   bound[0]->D1(U,pbid,vbid);
161   cor = vbid.XYZ();
162   cor.Multiply(a0);
163
164   cortemp = bound[1]->Value(V).XYZ();
165   cortemp.Multiply(a1);
166   cor.Add(cortemp);
167
168   bound[2]->D1(U,pbid,vbid);
169   cortemp = vbid.XYZ();
170   cortemp.Multiply(a2);
171   cor.Add(cortemp);
172
173   cortemp = bound[3]->Value(V).XYZ();
174   cortemp.Multiply(a3);
175   cor.Add(cortemp);
176
177   cortemp = c[0].XYZ();
178   cortemp.Multiply(-a0*a3);
179   cor.Add(cortemp);
180   
181   cortemp = c[1].XYZ();
182   cortemp.Multiply(-a0*a1);
183   cor.Add(cortemp);
184   
185   cortemp = c[2].XYZ();
186   cortemp.Multiply(-a1*a2);
187   cor.Add(cortemp);
188   
189   cortemp = c[3].XYZ();
190   cortemp.Multiply(-a2*a3);
191   cor.Add(cortemp);
192   
193   vbid.SetXYZ(cor);
194   return vbid;
195 }
196
197
198 //=======================================================================
199 //function : D1V
200 //purpose  : 
201 //=======================================================================
202
203 gp_Vec GeomFill_CoonsAlgPatch::D1V(const Standard_Real U, 
204                                    const Standard_Real V) const 
205 {
206   Standard_Real a0,a1,a2,a3,bid;
207   a[0]->D1(V,bid,a0);
208   a1 = a[1]->Value(U);
209   a2 = -a0;
210   a3 = 1. - a1;
211   gp_XYZ cor,cortemp;
212   gp_Pnt pbid;
213   gp_Vec vbid;
214
215   cor = bound[0]->Value(U).XYZ();
216   cor.Multiply(a0);
217
218   bound[1]->D1(V,pbid,vbid);
219   cortemp = vbid.XYZ();
220   cortemp.Multiply(a1);
221   cor.Add(cortemp);
222
223   cortemp = bound[2]->Value(U).XYZ();
224   cortemp.Multiply(a2);
225   cor.Add(cortemp);
226
227   bound[3]->D1(V,pbid,vbid);
228   cortemp = vbid.XYZ();
229   cortemp.Multiply(a3);
230   cor.Add(cortemp);
231
232   cortemp = c[0].XYZ();
233   cortemp.Multiply(-a0*a3);
234   cor.Add(cortemp);
235   
236   cortemp = c[1].XYZ();
237   cortemp.Multiply(-a0*a1);
238   cor.Add(cortemp);
239   
240   cortemp = c[2].XYZ();
241   cortemp.Multiply(-a1*a2);
242   cor.Add(cortemp);
243   
244   cortemp = c[3].XYZ();
245   cortemp.Multiply(-a2*a3);
246   cor.Add(cortemp);
247   
248   vbid.SetXYZ(cor);
249   return vbid;
250 }
251
252
253 //=======================================================================
254 //function : DUV
255 //purpose  : 
256 //=======================================================================
257
258 gp_Vec GeomFill_CoonsAlgPatch::DUV(const Standard_Real U, 
259                                    const Standard_Real V) const 
260 {
261   Standard_Real a0,a1,a2,a3,bid;
262   a[0]->D1(V,bid,a0);
263   a[1]->D1(U,bid,a1);
264   a2 = -a0;
265   a3 = -a1;
266
267   gp_XYZ cor,cortemp;
268   gp_Pnt pbid;
269   gp_Vec vbid;
270
271   bound[0]->D1(U,pbid,vbid);
272   cor = vbid.XYZ();
273   cor.Multiply(a0);
274
275   bound[1]->D1(V,pbid,vbid);
276   cortemp = vbid.XYZ();
277   cortemp.Multiply(a1);
278   cor.Add(cortemp);
279
280   bound[2]->D1(U,pbid,vbid);
281   cortemp = vbid.XYZ();
282   cortemp.Multiply(a2);
283   cor.Add(cortemp);
284
285   bound[3]->D1(V,pbid,vbid);
286   cortemp = vbid.XYZ();
287   cortemp.Multiply(a3);
288   cor.Add(cortemp);
289
290   cortemp = c[0].XYZ();
291   cortemp.Multiply(-a0*a3);
292   cor.Add(cortemp);
293   
294   cortemp = c[1].XYZ();
295   cortemp.Multiply(-a0*a1);
296   cor.Add(cortemp);
297   
298   cortemp = c[2].XYZ();
299   cortemp.Multiply(-a1*a2);
300   cor.Add(cortemp);
301   
302   cortemp = c[3].XYZ();
303   cortemp.Multiply(-a2*a3);
304   cor.Add(cortemp);
305   
306   vbid.SetXYZ(cor);
307   return vbid;
308 }
309
310
311 //=======================================================================
312 //function : Bound
313 //purpose  : 
314 //=======================================================================
315
316 const Handle(GeomFill_Boundary)& GeomFill_CoonsAlgPatch::Bound
317 (const Standard_Integer I) const 
318 {
319   return bound[I];
320 }
321
322
323 //=======================================================================
324 //function : Corner
325 //purpose  : 
326 //=======================================================================
327
328 const gp_Pnt& GeomFill_CoonsAlgPatch::Corner(const Standard_Integer I) const 
329 {
330   return c[I];
331 }
332
333 //=======================================================================
334 //function : Func
335 //purpose  : 
336 //=======================================================================
337
338 const Handle(Law_Function)& GeomFill_CoonsAlgPatch::Func
339 (const Standard_Integer I)const
340 {
341   return a[I];
342 }