1 // Created on: 1995-09-08
2 // Created by: Laurent BOURESCHE
3 // Copyright (c) 1995-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 #include <BSplCLib.hxx>
18 #include <TColStd_Array1OfInteger.hxx>
19 #include <TColStd_Array1OfReal.hxx>
21 #define No_Standard_RangeError
22 #define No_Standard_OutOfRange
24 //=======================================================================
25 //struct : BSplCLib_BezierArrays
26 //purpose: Auxiliary structure providing standard definitions of bspline
27 // knots for bezier (using stack allocation)
28 //=======================================================================
30 class BSplCLib_BezierArrays
33 BSplCLib_BezierArrays (Standard_Integer Degree)
34 : knots (aKnots[0], 1, 2), mults (aMults[0], 1, 2)
38 aMults[0] = aMults[1] = Degree + 1;
42 Standard_Real aKnots[2];
43 Standard_Integer aMults[2];
46 TColStd_Array1OfReal knots;
47 TColStd_Array1OfInteger mults;
50 //=======================================================================
51 //function : IncreaseDegree
53 //=======================================================================
55 void BSplCLib::IncreaseDegree(const Standard_Integer NewDegree,
56 const TColgp_Array1OfPnt& Poles,
57 const TColStd_Array1OfReal* Weights,
58 TColgp_Array1OfPnt& NewPoles,
59 TColStd_Array1OfReal* NewWeights)
61 Standard_Integer deg = Poles.Length() - 1;
62 BSplCLib_BezierArrays bzarr(deg);
63 BSplCLib::IncreaseDegree(deg, NewDegree, 0,
64 Poles, Weights, bzarr.knots, bzarr.mults,
65 NewPoles, NewWeights, bzarr.knots, bzarr.mults);
68 //=======================================================================
69 //function : IncreaseDegree
71 //=======================================================================
73 void BSplCLib::IncreaseDegree(const Standard_Integer NewDegree,
74 const TColgp_Array1OfPnt2d& Poles,
75 const TColStd_Array1OfReal* Weights,
76 TColgp_Array1OfPnt2d& NewPoles,
77 TColStd_Array1OfReal* NewWeights)
79 Standard_Integer deg = Poles.Length() - 1;
80 BSplCLib_BezierArrays bzarr(deg);
81 BSplCLib::IncreaseDegree(deg, NewDegree, 0,
82 Poles, Weights, bzarr.knots, bzarr.mults,
83 NewPoles, NewWeights, bzarr.knots, bzarr.mults);
86 //=======================================================================
87 //function : PolesCoefficients
89 //=======================================================================
91 void BSplCLib::PolesCoefficients(const TColgp_Array1OfPnt& Poles,
92 const TColStd_Array1OfReal* Weights,
93 TColgp_Array1OfPnt& CachePoles,
94 TColStd_Array1OfReal* CacheWeights)
96 Standard_Integer deg = Poles.Length() - 1;
97 TColStd_Array1OfReal bidflatknots (FlatBezierKnots(deg), 1, 2*(deg+1));
98 BSplCLib::BuildCache(0.,1.,0,deg,bidflatknots,
99 Poles, Weights, CachePoles,CacheWeights);
102 //=======================================================================
103 //function : PolesCoefficients
105 //=======================================================================
107 void BSplCLib::PolesCoefficients(const TColgp_Array1OfPnt2d& Poles,
108 const TColStd_Array1OfReal* Weights,
109 TColgp_Array1OfPnt2d& CachePoles,
110 TColStd_Array1OfReal* CacheWeights)
112 Standard_Integer deg = Poles.Length() - 1;
113 TColStd_Array1OfReal bidflatknots (FlatBezierKnots(deg), 1, 2*(deg+1));
114 BSplCLib::BuildCache(0.,1.,0,deg,bidflatknots,
115 Poles, Weights, CachePoles,CacheWeights);
118 //=======================================================================
121 //=======================================================================
123 void BSplCLib::D0(const Standard_Real U,
124 const TColgp_Array1OfPnt& Poles,
125 const TColStd_Array1OfReal* Weights,
128 Standard_Integer deg = Poles.Length() - 1;
129 BSplCLib_BezierArrays bzarr(deg);
130 BSplCLib::D0(U, 1, deg, 0, Poles, Weights, bzarr.knots, &bzarr.mults, P);
133 //=======================================================================
136 //=======================================================================
138 void BSplCLib::D0(const Standard_Real U,
139 const TColgp_Array1OfPnt2d& Poles,
140 const TColStd_Array1OfReal* Weights,
143 Standard_Integer deg = Poles.Length() - 1;
144 BSplCLib_BezierArrays bzarr(deg);
145 BSplCLib::D0(U, 1, deg, 0, Poles, Weights, bzarr.knots, &bzarr.mults, P);
148 //=======================================================================
151 //=======================================================================
153 void BSplCLib::D1(const Standard_Real U,
154 const TColgp_Array1OfPnt& Poles,
155 const TColStd_Array1OfReal* Weights,
159 Standard_Integer deg = Poles.Length() - 1;
160 BSplCLib_BezierArrays bzarr(deg);
161 BSplCLib::D1(U, 1, deg, 0, Poles, Weights, bzarr.knots, &bzarr.mults, P, V);
164 //=======================================================================
167 //=======================================================================
169 void BSplCLib::D1(const Standard_Real U,
170 const TColgp_Array1OfPnt2d& Poles,
171 const TColStd_Array1OfReal* Weights,
175 Standard_Integer deg = Poles.Length() - 1;
176 BSplCLib_BezierArrays bzarr(deg);
177 BSplCLib::D1(U, 1, deg, 0, Poles, Weights, bzarr.knots, &bzarr.mults, P, V);
181 //=======================================================================
184 //=======================================================================
186 void BSplCLib::D2(const Standard_Real U,
187 const TColgp_Array1OfPnt& Poles,
188 const TColStd_Array1OfReal* Weights,
193 Standard_Integer deg = Poles.Length() - 1;
194 BSplCLib_BezierArrays bzarr(deg);
195 BSplCLib::D2(U, 1, deg, 0, Poles, Weights, bzarr.knots, &bzarr.mults, P, V1, V2);
198 //=======================================================================
201 //=======================================================================
203 void BSplCLib::D2(const Standard_Real U,
204 const TColgp_Array1OfPnt2d& Poles,
205 const TColStd_Array1OfReal* Weights,
210 Standard_Integer deg = Poles.Length() - 1;
211 BSplCLib_BezierArrays bzarr(deg);
212 BSplCLib::D2(U, 1, deg, 0, Poles, Weights, bzarr.knots, &bzarr.mults, P, V1, V2);
216 //=======================================================================
219 //=======================================================================
221 void BSplCLib::D3(const Standard_Real U,
222 const TColgp_Array1OfPnt& Poles,
223 const TColStd_Array1OfReal* Weights,
229 Standard_Integer deg = Poles.Length() - 1;
230 BSplCLib_BezierArrays bzarr(deg);
231 BSplCLib::D3(U, 1, deg, 0, Poles, Weights, bzarr.knots, &bzarr.mults,
235 //=======================================================================
238 //=======================================================================
240 void BSplCLib::D3(const Standard_Real U,
241 const TColgp_Array1OfPnt2d& Poles,
242 const TColStd_Array1OfReal* Weights,
248 Standard_Integer deg = Poles.Length() - 1;
249 BSplCLib_BezierArrays bzarr(deg);
250 BSplCLib::D3(U, 1, deg, 0, Poles, Weights, bzarr.knots, &bzarr.mults,