0024677: Control of license statements and non-ascii characters in integrated code
[occt.git] / src / ShapeExtend / ShapeExtend_CompositeSurface.cxx
CommitLineData
b311480e 1// Created on: 1999-04-27
2// Created by: Pavel DURANDIN
3// Copyright (c) 1999-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
42cf5bc1 17
18#include <Geom_Curve.hxx>
19#include <Geom_Geometry.hxx>
ec357c5c 20#include <Geom_Surface.hxx>
42cf5bc1 21#include <gp_Pnt.hxx>
22#include <gp_Pnt2d.hxx>
23#include <gp_Trsf.hxx>
24#include <gp_Trsf2d.hxx>
25#include <gp_Vec.hxx>
26#include <Precision.hxx>
27#include <ShapeExtend_CompositeSurface.hxx>
28#include <Standard_Type.hxx>
7fd59977 29
92efcf78 30IMPLEMENT_STANDARD_RTTIEXT(ShapeExtend_CompositeSurface,Geom_Surface)
31
7fd59977 32//=======================================================================
33//function : ShapeExtend_CompositeSurface
34//purpose :
35//=======================================================================
7fd59977 36ShapeExtend_CompositeSurface::ShapeExtend_CompositeSurface()
37{
38}
39
40//=======================================================================
41//function : Constructor
42//purpose :
43//=======================================================================
44
45ShapeExtend_CompositeSurface::ShapeExtend_CompositeSurface(const Handle(TColGeom_HArray2OfSurface)& GridSurf,
46 const ShapeExtend_Parametrisation param)
47{
48 Init ( GridSurf, param );
49}
50
51//=======================================================================
52//function : Constructor
53//purpose :
54//=======================================================================
55
56ShapeExtend_CompositeSurface::ShapeExtend_CompositeSurface(const Handle(TColGeom_HArray2OfSurface)& GridSurf,
57 const TColStd_Array1OfReal &UJoints,
58 const TColStd_Array1OfReal &VJoints)
59{
60 Init ( GridSurf, UJoints, VJoints );
61}
62
63//=======================================================================
64//function : Init
65//purpose :
66//=======================================================================
67
68Standard_Boolean ShapeExtend_CompositeSurface::Init (const Handle(TColGeom_HArray2OfSurface)& GridSurf,
69 const ShapeExtend_Parametrisation param)
70{
71 if ( GridSurf.IsNull() ) return Standard_False;
72 myPatches = GridSurf;
73 ComputeJointValues ( param );
74 return CheckConnectivity ( Precision::Confusion() );
75}
76
77//=======================================================================
78//function : Init
79//purpose :
80//=======================================================================
81
82Standard_Boolean ShapeExtend_CompositeSurface::Init (const Handle(TColGeom_HArray2OfSurface)& GridSurf,
83 const TColStd_Array1OfReal &UJoints,
84 const TColStd_Array1OfReal &VJoints)
85{
86 if ( GridSurf.IsNull() ) return Standard_False;
87 myPatches = GridSurf;
88
89 Standard_Boolean ok = Standard_True;
90 if ( ! SetUJointValues ( UJoints ) || ! SetVJointValues ( VJoints ) ) {
91 ok = Standard_False;
92 ComputeJointValues ( ShapeExtend_Natural );
0797d9d3 93#ifdef OCCT_DEBUG
7fd59977 94 cout << "Warning: ShapeExtend_CompositeSurface::Init: bad joint values" << endl;
95#endif
96 }
97
98 return ( CheckConnectivity ( Precision::Confusion() ) ? ok : Standard_False );
99}
100
101//=======================================================================
102//function : NbUPatches
103//purpose :
104//=======================================================================
105
106Standard_Integer ShapeExtend_CompositeSurface::NbUPatches() const
107{
108 return myPatches->ColLength();
109}
110
111//=======================================================================
112//function : NbVPatches
113//purpose :
114//=======================================================================
115
116Standard_Integer ShapeExtend_CompositeSurface::NbVPatches() const
117{
118 return myPatches->RowLength();
119}
120
121//=======================================================================
122//function : Patch
123//purpose :
124//=======================================================================
125
126const Handle(Geom_Surface)& ShapeExtend_CompositeSurface::Patch(const Standard_Integer i,
127 const Standard_Integer j) const
128{
129 return myPatches->Value(i,j);
130}
131
132//=======================================================================
133//function : Patches
134//purpose :
135//=======================================================================
136
137const Handle(TColGeom_HArray2OfSurface)& ShapeExtend_CompositeSurface::Patches() const
138{
139 return myPatches;
140}
141
142//=======================================================================
143//function : UJointValues
144//purpose :
145//=======================================================================
146
147Handle(TColStd_HArray1OfReal) ShapeExtend_CompositeSurface::UJointValues() const
148{
149 return myUJointValues;
150}
151
152//=======================================================================
153//function : VJointValues
154//purpose :
155//=======================================================================
156
157Handle(TColStd_HArray1OfReal) ShapeExtend_CompositeSurface::VJointValues() const
158{
159 return myVJointValues;
160}
161
162//=======================================================================
163//function : UJointValue
164//purpose :
165//=======================================================================
166
167Standard_Real ShapeExtend_CompositeSurface::UJointValue(const Standard_Integer i) const
168{
169 return myUJointValues->Value(i);
170}
171
172//=======================================================================
173//function : VJointValue
174//purpose :
175//=======================================================================
176
177Standard_Real ShapeExtend_CompositeSurface::VJointValue(const Standard_Integer i) const
178{
179 return myVJointValues->Value(i);
180}
181
182//=======================================================================
183//function : SetUJointValues
184//purpose :
185//=======================================================================
186
187Standard_Boolean ShapeExtend_CompositeSurface::SetUJointValues (const TColStd_Array1OfReal &UJoints)
188{
189 Standard_Integer NbU = NbUPatches();
190 if ( UJoints.Length() != NbU+1 ) return Standard_False;
191
192 Handle(TColStd_HArray1OfReal) UJointValues = new TColStd_HArray1OfReal(1,NbU+1);
193 for ( Standard_Integer i=1, j=UJoints.Lower(); i <= NbU+1; i++, j++ ) {
194 UJointValues->SetValue ( i, UJoints(j) );
195 if ( i >1 && UJoints(j) - UJoints(j-1) < Precision::PConfusion() )
196 return Standard_False;
197 }
198 myUJointValues = UJointValues;
199 return Standard_True;
200}
201
202//=======================================================================
203//function : SetVJointValues
204//purpose :
205//=======================================================================
206
207Standard_Boolean ShapeExtend_CompositeSurface::SetVJointValues (const TColStd_Array1OfReal &VJoints)
208{
209 Standard_Integer NbV = NbVPatches();
210 if ( VJoints.Length() != NbV+1 ) return Standard_False;
211
212 Handle(TColStd_HArray1OfReal) VJointValues = new TColStd_HArray1OfReal(1,NbV+1);
213 for ( Standard_Integer i=1, j=VJoints.Lower(); i <= NbV+1; i++, j++ ) {
214 VJointValues->SetValue ( i, VJoints(j) );
215 if ( i >1 && VJoints(j) - VJoints(j-1) < Precision::PConfusion() )
216 return Standard_False;
217 }
218 myVJointValues = VJointValues;
219 return Standard_True;
220}
221
222//=======================================================================
223//function : SetUFirstValue
224//purpose :
225//=======================================================================
226
227void ShapeExtend_CompositeSurface::SetUFirstValue (const Standard_Real UFirst)
228{
229 if ( myUJointValues.IsNull() ) return;
230
231 Standard_Real shift = UFirst - myUJointValues->Value(1);
232 Standard_Integer NbU = myUJointValues->Length();
233 for ( Standard_Integer i=1; i <= NbU; i++ ) {
234 myUJointValues->SetValue ( i, myUJointValues->Value(i) + shift );
235 }
236}
237
238//=======================================================================
239//function : SetVFirstValue
240//purpose :
241//=======================================================================
242
243void ShapeExtend_CompositeSurface::SetVFirstValue (const Standard_Real VFirst)
244{
245 if ( myVJointValues.IsNull() ) return;
246
247 Standard_Real shift = VFirst - myVJointValues->Value(1);
248 Standard_Integer NbV = myVJointValues->Length();
249 for ( Standard_Integer i=1; i <= NbV; i++ ) {
250 myVJointValues->SetValue ( i, myVJointValues->Value(i) + shift );
251 }
252}
253
254//=======================================================================
255//function : LocateUParameter
256//purpose :
257//=======================================================================
258
259Standard_Integer ShapeExtend_CompositeSurface::LocateUParameter(const Standard_Real U) const
260{
261 Standard_Integer nbPatch = NbUPatches();
262 for(Standard_Integer i = 2; i <= nbPatch; i++)
263 if (U < myUJointValues->Value(i)) return i-1;
264 return nbPatch;
265}
266
267//=======================================================================
268//function : LocateVParameter
269//purpose :
270//=======================================================================
271
272Standard_Integer ShapeExtend_CompositeSurface::LocateVParameter(const Standard_Real V) const
273{
274 Standard_Integer nbPatch = NbVPatches();
275 for(Standard_Integer i = 2; i <= nbPatch; i++)
276 if (V < myVJointValues->Value(i)) return i-1;
277 return nbPatch;
278}
279
280//=======================================================================
281//function : LocateUVPoint
282//purpose :
283//=======================================================================
284
285void ShapeExtend_CompositeSurface::LocateUVPoint(const gp_Pnt2d& pnt,
286 Standard_Integer& i,
287 Standard_Integer& j) const
288{
289 i = LocateUParameter(pnt.X());
290 j = LocateVParameter(pnt.Y());
291}
292
293//=======================================================================
294//function : Patch
295//purpose :
296//=======================================================================
297
298const Handle(Geom_Surface)& ShapeExtend_CompositeSurface::Patch(const Standard_Real U,
299 const Standard_Real V) const
300{
301 return myPatches->Value ( LocateUParameter(U), LocateVParameter(V) );
302}
303
304//=======================================================================
305//function : Patch
306//purpose :
307//=======================================================================
308
309const Handle(Geom_Surface)& ShapeExtend_CompositeSurface::Patch(const gp_Pnt2d& pnt) const
310{
311 return myPatches->Value ( LocateUParameter(pnt.X()), LocateVParameter(pnt.Y()) );
312}
313
314//=======================================================================
315//function : ULocalToGlobal
316//purpose :
317//=======================================================================
318
319Standard_Real ShapeExtend_CompositeSurface::ULocalToGlobal (const Standard_Integer i,
320 const Standard_Integer j,
321 const Standard_Real u) const
322{
323 Standard_Real u1, u2, v1, v2;
324 myPatches->Value(i,j)->Bounds ( u1, u2, v1, v2 );
325 Standard_Real scale = ( myUJointValues->Value(i+1) - myUJointValues->Value(i) ) / ( u2 - u1 );
326 return u * scale + ( myUJointValues->Value(i) - u1 * scale ); // ! this formula is stable if u1 is infinite
327}
328
329//=======================================================================
330//function : VLocalToGlobal
331//purpose :
332//=======================================================================
333
334Standard_Real ShapeExtend_CompositeSurface::VLocalToGlobal (const Standard_Integer i,
335 const Standard_Integer j,
336 const Standard_Real v) const
337{
338 Standard_Real u1, u2, v1, v2;
339 myPatches->Value(i,j)->Bounds ( u1, u2, v1, v2 );
340 Standard_Real scale = ( myVJointValues->Value(j+1) - myVJointValues->Value(j) ) / ( v2 - v1 );
341 return v * scale + ( myVJointValues->Value(j) - v1 * scale ); // ! this formula is stable if v1 is infinite
342}
343
344//=======================================================================
345//function : LocalToGlobal
346//purpose :
347//=======================================================================
348
349gp_Pnt2d ShapeExtend_CompositeSurface::LocalToGlobal (const Standard_Integer i,
350 const Standard_Integer j,
351 const gp_Pnt2d &uv) const
352{
353 Standard_Real u1, u2, v1, v2;
354 myPatches->Value(i,j)->Bounds ( u1, u2, v1, v2 );
355 Standard_Real scaleu = ( myUJointValues->Value(i+1) - myUJointValues->Value(i) ) / ( u2 - u1 );
356 Standard_Real scalev = ( myVJointValues->Value(j+1) - myVJointValues->Value(j) ) / ( v2 - v1 );
357 return gp_Pnt2d ( uv.X() * scaleu + ( myUJointValues->Value(i) - u1 * scaleu ), // ! this formula is stable if u1 or v1 is infinite
358 uv.Y() * scalev + ( myVJointValues->Value(j) - v1 * scalev ) );
359}
360
361//=======================================================================
362//function : UGlobalToLocal
363//purpose :
364//=======================================================================
365
366Standard_Real ShapeExtend_CompositeSurface::UGlobalToLocal (const Standard_Integer i,
367 const Standard_Integer j,
368 const Standard_Real U) const
369{
370 Standard_Real u1, u2, v1, v2;
371 myPatches->Value(i,j)->Bounds ( u1, u2, v1, v2 );
372 Standard_Real scale = ( u2 - u1 ) / ( myUJointValues->Value(i+1) - myUJointValues->Value(i) );
373 return U * scale + ( u1 - myUJointValues->Value(i) * scale ); // ! this formula is stable if u1 is infinite
374}
375
376//=======================================================================
377//function : VGlobalToLocal
378//purpose :
379//=======================================================================
380
381Standard_Real ShapeExtend_CompositeSurface::VGlobalToLocal (const Standard_Integer i,
382 const Standard_Integer j,
383 const Standard_Real V) const
384{
385 Standard_Real u1, u2, v1, v2;
386 myPatches->Value(i,j)->Bounds ( u1, u2, v1, v2 );
387 Standard_Real scale = ( v2 - v1 ) / ( myVJointValues->Value(j+1) - myVJointValues->Value(j) );
388 return V * scale + ( v1 - myVJointValues->Value(j) * scale ); // ! this formula is stable if v1 is infinite
389}
390
391//=======================================================================
392//function : GlobalToLocal
393//purpose :
394//=======================================================================
395
396gp_Pnt2d ShapeExtend_CompositeSurface::GlobalToLocal (const Standard_Integer i,
397 const Standard_Integer j,
398 const gp_Pnt2d &UV) const
399{
400 Standard_Real u1, u2, v1, v2;
401 myPatches->Value(i,j)->Bounds ( u1, u2, v1, v2 );
402 Standard_Real scaleu = ( u2 - u1 ) / ( myUJointValues->Value(i+1) - myUJointValues->Value(i) );
403 Standard_Real scalev = ( v2 - v1 ) / ( myVJointValues->Value(j+1) - myVJointValues->Value(j) );
404 return gp_Pnt2d ( UV.X() * scaleu + ( u1 - myUJointValues->Value(i) * scaleu ), // ! this formula is stable if u1 or v1 is infinite
405 UV.Y() * scalev + ( v1 - myVJointValues->Value(j) * scalev ) );
406}
407
408//=======================================================================
409//function : GlobalToLocalTransformation
410//purpose :
411//=======================================================================
412
413Standard_Boolean ShapeExtend_CompositeSurface::GlobalToLocalTransformation (const Standard_Integer i,
414 const Standard_Integer j,
415 Standard_Real &uFact,
416 gp_Trsf2d &Trsf) const
417{
418 Standard_Real u1, u2, v1, v2;
419 myPatches->Value(i,j)->Bounds ( u1, u2, v1, v2 );
420
421 Standard_Real scaleu = ( u2 - u1 ) / ( myUJointValues->Value(i+1) - myUJointValues->Value(i) );
422 Standard_Real scalev = ( v2 - v1 ) / ( myVJointValues->Value(j+1) - myVJointValues->Value(j) );
423 gp_Vec2d shift ( u1 / scaleu - myUJointValues->Value(i),
424 v1 / scalev - myVJointValues->Value(j) );
425
426 uFact = scaleu / scalev;
427 gp_Trsf2d Shift, Scale;
428 if ( shift.X() != 0. || shift.Y() != 0. ) Shift.SetTranslation ( shift );
429 if ( scalev != 1. ) Scale.SetScale ( gp_Pnt2d(0,0), scalev );
430 Trsf = Scale * Shift;
431 return uFact != 1. || Trsf.Form() != gp_Identity;
432}
433
434//=======================================================================
435// Inherited methods (from Geom_Geometry and Geom_Surface)
436//=======================================================================
437
438//=======================================================================
439//function : Transform
440//purpose :
441//=======================================================================
442
443void ShapeExtend_CompositeSurface::Transform (const gp_Trsf &T)
444{
445 if ( myPatches.IsNull() ) return;
446 for ( Standard_Integer i=1; i <= NbUPatches(); i++ )
447 for ( Standard_Integer j=1; j <= NbVPatches(); j++ )
448 Patch(i,j)->Transform ( T );
449}
450
451//=======================================================================
452//function : Copy
453//purpose :
454//=======================================================================
455
456Handle(Geom_Geometry) ShapeExtend_CompositeSurface::Copy () const
457{
458 Handle(ShapeExtend_CompositeSurface) surf = new ShapeExtend_CompositeSurface;
459 if ( myPatches.IsNull() ) return surf;
460
461 Handle(TColGeom_HArray2OfSurface) patches =
462 new TColGeom_HArray2OfSurface ( 1, NbUPatches(), 1, NbVPatches() );
463 for ( Standard_Integer i=1; i <= NbUPatches(); i++ )
464 for ( Standard_Integer j=1; j <= NbVPatches(); j++ )
465 patches->SetValue ( i, j, Handle(Geom_Surface)::DownCast ( Patch(i,j)->Copy() ) );
466 surf->Init ( patches );
467 return surf;
468}
469
470//=======================================================================
471//function : UReverse
472//purpose :
473//=======================================================================
474
475void ShapeExtend_CompositeSurface::UReverse ()
476{
477}
478
479//=======================================================================
480//function : UReversedParameter
481//purpose :
482//=======================================================================
483
484Standard_Real ShapeExtend_CompositeSurface::UReversedParameter (const Standard_Real U) const
485{
486 return U;
487}
488
489//=======================================================================
490//function : VReverse
491//purpose :
492//=======================================================================
493
494void ShapeExtend_CompositeSurface::VReverse ()
495{
496}
497
498//=======================================================================
499//function : VReversedParameter
500//purpose :
501//=======================================================================
502
503Standard_Real ShapeExtend_CompositeSurface::VReversedParameter (const Standard_Real V) const
504{
505 return V;
506}
507
508//=======================================================================
509//function : Bounds
510//purpose :
511//=======================================================================
512
513void ShapeExtend_CompositeSurface::Bounds(Standard_Real& U1,
514 Standard_Real& U2,
515 Standard_Real& V1,
516 Standard_Real& V2) const
517{
518 U1 = UJointValue(1);
519 V1 = VJointValue(1);
520 U2 = UJointValue(NbUPatches()+1);
521 V2 = VJointValue(NbVPatches()+1);
522}
523
524//=======================================================================
525//function : IsUPeriodic
526//purpose :
527//=======================================================================
528
529Standard_Boolean ShapeExtend_CompositeSurface::IsUPeriodic () const
530{
531 return Standard_False;
532}
533
534//=======================================================================
535//function : IsVPeriodic
536//purpose :
537//=======================================================================
538
539Standard_Boolean ShapeExtend_CompositeSurface::IsVPeriodic () const
540{
541 return Standard_False;
542}
543
544//=======================================================================
545//function : UIso
546//purpose :
547//=======================================================================
548
549Handle(Geom_Curve) ShapeExtend_CompositeSurface::UIso (const Standard_Real ) const
550{
551 Handle(Geom_Curve) dummy;
552 return dummy;
553}
554
555//=======================================================================
556//function : VIso
557//purpose :
558//=======================================================================
559
560Handle(Geom_Curve) ShapeExtend_CompositeSurface::VIso (const Standard_Real ) const
561{
562 Handle(Geom_Curve) dummy;
563 return dummy;
564}
565
566//=======================================================================
567//function : Continuity
568//purpose :
569//=======================================================================
570
571GeomAbs_Shape ShapeExtend_CompositeSurface::Continuity () const
572{
573 return GeomAbs_C0;
574}
575
576//=======================================================================
577//function : IsCNu
578//purpose :
579//=======================================================================
580
581Standard_Boolean ShapeExtend_CompositeSurface::IsCNu (const Standard_Integer N) const
582{
583 return N <=0;
584}
585
586//=======================================================================
587//function : IsCNv
588//purpose :
589//=======================================================================
590
591Standard_Boolean ShapeExtend_CompositeSurface::IsCNv (const Standard_Integer N) const
592{
593 return N <=0;
594}
595
596//=======================================================================
597//function : IsUClosed
598//purpose :
599//=======================================================================
600
601Standard_Boolean ShapeExtend_CompositeSurface::IsUClosed () const
602{
603 return myUClosed;
604}
605
606//=======================================================================
607//function : IsVClosed
608//purpose :
609//=======================================================================
610
611Standard_Boolean ShapeExtend_CompositeSurface::IsVClosed () const
612{
613 return myVClosed;
614}
615
616//=======================================================================
617//function : D0
618//purpose :
619//=======================================================================
620
621void ShapeExtend_CompositeSurface::D0 (const Standard_Real U,
622 const Standard_Real V,
623 gp_Pnt& P) const
624{
625 Standard_Integer i = LocateUParameter ( U );
626 Standard_Integer j = LocateVParameter ( V );
627 gp_Pnt2d uv = GlobalToLocal ( i, j, gp_Pnt2d ( U, V ) );
628 myPatches->Value(i,j)->D0 ( uv.X(), uv.Y(), P );
629}
630
631//=======================================================================
632//function : D1
633//purpose :
634//=======================================================================
635
636void ShapeExtend_CompositeSurface::D1 (const Standard_Real U,
637 const Standard_Real V,
638 gp_Pnt& P,
639 gp_Vec& D1U,
640 gp_Vec& D1V) const
641{
642 Standard_Integer i = LocateUParameter ( U );
643 Standard_Integer j = LocateVParameter ( V );
644 gp_Pnt2d uv = GlobalToLocal ( i, j, gp_Pnt2d ( U, V ) );
645 myPatches->Value(i,j)->D1 ( uv.X(), uv.Y(), P, D1U, D1V );
646}
647
648//=======================================================================
649//function : D2
650//purpose :
651//=======================================================================
652
653void ShapeExtend_CompositeSurface::D2 (const Standard_Real U,
654 const Standard_Real V,
655 gp_Pnt& P,
656 gp_Vec& D1U,
657 gp_Vec& D1V,
658 gp_Vec& D2U,
659 gp_Vec& D2V,
660 gp_Vec& D2UV) const
661{
662 Standard_Integer i = LocateUParameter ( U );
663 Standard_Integer j = LocateVParameter ( V );
664 gp_Pnt2d uv = GlobalToLocal ( i, j, gp_Pnt2d ( U, V ) );
665 myPatches->Value(i,j)->D2 ( uv.X(), uv.Y(), P, D1U, D1V, D2U, D2V, D2UV );
666}
667
668//=======================================================================
669//function : D3
670//purpose :
671//=======================================================================
672
673void ShapeExtend_CompositeSurface::D3 (const Standard_Real U,
674 const Standard_Real V,
675 gp_Pnt& P,
676 gp_Vec& D1U,
677 gp_Vec& D1V,
678 gp_Vec& D2U,
679 gp_Vec& D2V,
680 gp_Vec& D2UV,
681 gp_Vec& D3U,
682 gp_Vec& D3V,
683 gp_Vec& D3UUV,
684 gp_Vec& D3UVV) const
685{
686 Standard_Integer i = LocateUParameter ( U );
687 Standard_Integer j = LocateVParameter ( V );
688 gp_Pnt2d uv = GlobalToLocal ( i, j, gp_Pnt2d ( U, V ) );
689 myPatches->Value(i,j)->D3 ( uv.X(), uv.Y(), P, D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV );
690}
691
692//=======================================================================
693//function : DN
694//purpose :
695//=======================================================================
696
697gp_Vec ShapeExtend_CompositeSurface::DN (const Standard_Real U,
698 const Standard_Real V,
699 const Standard_Integer Nu,
700 const Standard_Integer Nv) const
701{
702 Standard_Integer i = LocateUParameter ( U );
703 Standard_Integer j = LocateVParameter ( V );
704 gp_Pnt2d uv = GlobalToLocal ( i, j, gp_Pnt2d ( U, V ) );
705 return myPatches->Value(i,j)->DN ( uv.X(), uv.Y(), Nu, Nv );
706}
707
708//=======================================================================
709//function : Value
710//purpose :
711//=======================================================================
712
713gp_Pnt ShapeExtend_CompositeSurface::Value (const gp_Pnt2d& pnt) const
714{
715 Standard_Integer i = LocateUParameter ( pnt.X() );
716 Standard_Integer j = LocateVParameter ( pnt.Y() );
717 gp_Pnt2d uv = GlobalToLocal ( i, j, pnt );
718 gp_Pnt point;
719 myPatches->Value(i,j)->D0 ( uv.X(), uv.Y(), point );
720 return point;
721}
722
723//=======================================================================
724//function : ComputeJointValues
725//purpose :
726//=======================================================================
727
728void ShapeExtend_CompositeSurface::ComputeJointValues (const ShapeExtend_Parametrisation param)
729{
730 Standard_Integer NbU = NbUPatches();
731 Standard_Integer NbV = NbVPatches();
732 myUJointValues = new TColStd_HArray1OfReal(1,NbU+1);
733 myVJointValues = new TColStd_HArray1OfReal(1,NbV+1);
734
735 if ( param == ShapeExtend_Natural ) {
736 Standard_Real U1, U2, V1, V2, U=0, V=0;
737 Standard_Integer i; // svv Jan 10 2000 : porting on DEC
738 for ( i = 1; i <= NbU; i++ ) {
739 myPatches->Value(i,1)->Bounds(U1,U2,V1,V2);
740 if ( i ==1 ) myUJointValues->SetValue ( 1, U = U1 );
741 U += ( U2 - U1 );
742 myUJointValues->SetValue ( i+1, U );
743 }
744 for ( i = 1; i <= NbV; i++ ) {
745 myPatches->Value(1,i)->Bounds(U1,U2,V1,V2);
746 if ( i ==1 ) myVJointValues->SetValue ( 1, V = V1 );
747 V += ( V2 - V1 );
748 myVJointValues->SetValue ( i+1, V );
749 }
750 }
751 else {
752 Standard_Real stepu = 1., stepv = 1.; // suppose param == ShapeExtend_Uniform
753 if ( param == ShapeExtend_Unitary ) {
754 stepu /= NbU;
755 stepv /= NbV;
756 }
757 Standard_Integer i; // svv Jan 10 2000 : porting on DEC
758 for ( i=0; i <= NbU; i++ )
759 myUJointValues->SetValue ( i+1, i * stepu );
760 for ( i=0; i <= NbV; i++ )
761 myVJointValues->SetValue ( i+1, i * stepv );
762 }
763}
764
765//=======================================================================
766//function : CheckConnectivity
767//purpose :
768//=======================================================================
769
770static inline Standard_Real LimitValue (const Standard_Real &par)
771{
772 return Precision::IsInfinite(par) ? ( par <0 ? -10000. : 10000. ) : par;
773}
774
775static void GetLimitedBounds (const Handle(Geom_Surface) &surf,
776 Standard_Real &U1, Standard_Real &U2,
777 Standard_Real &V1, Standard_Real &V2)
778{
779 surf->Bounds ( U1, U2, V1, V2 );
780 U1 = LimitValue ( U1 );
781 U2 = LimitValue ( U2 );
782 V1 = LimitValue ( V1 );
783 V2 = LimitValue ( V2 );
784}
785
786Standard_Boolean ShapeExtend_CompositeSurface::CheckConnectivity (const Standard_Real Prec)
787{
788 const Standard_Integer NPOINTS = 23;
789 Standard_Boolean ok = Standard_True;
790 Standard_Integer NbU = NbUPatches();
791 Standard_Integer NbV = NbVPatches();
792
793 // check in u direction
794 Standard_Integer i,j; // svv Jan 10 2000 : porting on DEC
795 for ( i=1, j = NbU; i <= NbU; j = i++ ) {
796 Standard_Real maxdist2 = 0.;
797 for ( Standard_Integer k=1; k <= NbV; k++ ) {
798 Handle(Geom_Surface) sj = myPatches->Value(j,k);
799 Handle(Geom_Surface) si = myPatches->Value(i,k);
800 Standard_Real Uj1, Uj2, Vj1, Vj2;
801 GetLimitedBounds ( sj, Uj1, Uj2, Vj1, Vj2 );
802 Standard_Real Ui1, Ui2, Vi1, Vi2;
803 GetLimitedBounds ( si, Ui1, Ui2, Vi1, Vi2 );
804 Standard_Real stepj = ( Vj2 - Vj1 ) / ( NPOINTS - 1 );
805 Standard_Real stepi = ( Vi2 - Vi1 ) / ( NPOINTS - 1 );
806 for ( Standard_Integer isample=0; isample < NPOINTS; isample++ ) {
807 Standard_Real parj = Vj1 + stepj * isample;
808 Standard_Real pari = Vi1 + stepi * isample;
809 Standard_Real dist2 = sj->Value ( Uj2, parj ).SquareDistance ( si->Value ( Ui1, pari ) );
810 if ( maxdist2 < dist2 ) maxdist2 = dist2;
811 }
812 }
813 if ( i==1 ) myUClosed = ( maxdist2 <= Prec*Prec );
814 else if ( maxdist2 > Prec*Prec ) ok = Standard_False;
815 }
816
817 // check in v direction
818 for ( i=1, j = NbV; i <= NbV; j = i++ ) {
819 Standard_Real maxdist2 = 0.;
820 for ( Standard_Integer k=1; k <= NbU; k++ ) {
821 Handle(Geom_Surface) sj = myPatches->Value(k,j);
822 Handle(Geom_Surface) si = myPatches->Value(k,i);
823 Standard_Real Uj1, Uj2, Vj1, Vj2;
824 GetLimitedBounds ( sj, Uj1, Uj2, Vj1, Vj2 );
825 Standard_Real Ui1, Ui2, Vi1, Vi2;
826 GetLimitedBounds ( si, Ui1, Ui2, Vi1, Vi2 );
827 Standard_Real stepj = ( Uj2 - Uj1 ) / ( NPOINTS - 1 );
828 Standard_Real stepi = ( Ui2 - Ui1 ) / ( NPOINTS - 1 );
829 for ( Standard_Integer isample=0; isample < NPOINTS; isample++ ) {
830 Standard_Real parj = Uj1 + stepj * isample;
831 Standard_Real pari = Ui1 + stepi * isample;
832 Standard_Real dist2 = sj->Value ( parj, Vj2 ).SquareDistance ( si->Value ( pari, Vi1 ) );
833 if ( maxdist2 < dist2 ) maxdist2 = dist2;
834 }
835 }
836 if ( i==1 ) myVClosed = ( maxdist2 <= Prec*Prec );
837 else if ( maxdist2 > Prec*Prec ) ok = Standard_False;
838 }
839
0797d9d3 840#ifdef OCCT_DEBUG
7fd59977 841 if ( ! ok ) cout << "Warning: ShapeExtend_CompositeSurface: not connected in 3d" << endl;
842#endif
843 return ok;
844}