96e2e1baa446386ee391b3d3849a269c383af27f
[occt.git] / src / Geom / Geom_ToroidalSurface.cxx
1 // Created on: 1993-03-10
2 // Created by: JCV
3 // Copyright (c) 1993-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 #include <Geom_ToroidalSurface.ixx>
18
19 #include <GeomAbs_UVSense.hxx>
20 #include <Geom_Circle.hxx>
21 #include <gp.hxx>
22 #include <gp_Circ.hxx>
23 #include <gp_Dir.hxx>
24 #include <gp_XYZ.hxx>
25 #include <ElSLib.hxx>
26
27 #include <Standard_ConstructionError.hxx>
28 #include <Standard_RangeError.hxx>
29
30 typedef Geom_ToroidalSurface         ToroidalSurface;
31 typedef Handle(Geom_ToroidalSurface) Handle(ToroidalSurface);
32 typedef TColStd_Array1OfReal      Array1OfReal;
33 typedef gp_Ax1  Ax1;
34 typedef gp_Ax2  Ax2;
35 typedef gp_Ax3  Ax3;
36 typedef gp_Circ Circ;
37 typedef gp_Dir  Dir;
38 typedef gp_Pnt  Pnt;
39 typedef gp_Trsf Trsf;
40 typedef gp_Vec  Vec;
41 typedef gp_XYZ  XYZ;
42
43
44
45 //=======================================================================
46 //function : Copy
47 //purpose  : 
48 //=======================================================================
49
50 Handle(Geom_Geometry) Geom_ToroidalSurface::Copy () const {
51  
52    Handle(ToroidalSurface) Cs;
53    Cs = new ToroidalSurface (pos, majorRadius, minorRadius);
54    return Cs;
55 }
56
57
58
59 //=======================================================================
60 //function : Geom_ToroidalSurface
61 //purpose  : 
62 //=======================================================================
63
64 Geom_ToroidalSurface::Geom_ToroidalSurface 
65   ( const Ax3& A3, 
66     const Standard_Real MajorRadius, 
67     const Standard_Real MinorRadius )
68  
69 : majorRadius (MajorRadius), minorRadius (MinorRadius) {
70
71   if (MinorRadius < 0.0 || MajorRadius < 0.0) {
72     Standard_ConstructionError::Raise();
73   }
74   else {
75     pos = A3;
76   }
77 }
78
79
80 //=======================================================================
81 //function : Geom_ToroidalSurface
82 //purpose  : 
83 //=======================================================================
84
85 Geom_ToroidalSurface::Geom_ToroidalSurface (const gp_Torus& T)  
86 : majorRadius (T.MajorRadius()), minorRadius (T.MinorRadius()) {
87
88    pos = T.Position();
89 }
90
91
92
93 //=======================================================================
94 //function : MajorRadius
95 //purpose  : 
96 //=======================================================================
97
98 Standard_Real Geom_ToroidalSurface::MajorRadius () const { 
99
100   return majorRadius; 
101 }
102
103 //=======================================================================
104
105 //function : MinorRadius
106 //purpose  : 
107 //=======================================================================
108
109 Standard_Real Geom_ToroidalSurface::MinorRadius () const {
110   
111   return minorRadius; 
112 }
113
114
115 //=======================================================================
116 //function : UReversedParameter
117 //purpose  : 
118 //=======================================================================
119
120 Standard_Real Geom_ToroidalSurface::UReversedParameter( const Standard_Real U) const {
121
122   return (2.*M_PI - U);
123 }
124
125
126 //=======================================================================
127 //function : VReversedParameter
128 //purpose  : 
129 //=======================================================================
130
131 Standard_Real Geom_ToroidalSurface::VReversedParameter( const Standard_Real V) const {
132
133   return (2.*M_PI - V);
134 }
135
136
137 //=======================================================================
138 //function : IsUClosed
139 //purpose  : 
140 //=======================================================================
141
142 Standard_Boolean Geom_ToroidalSurface::IsUClosed () const {
143
144   return Standard_True; 
145 }
146
147 //=======================================================================
148 //function : IsVClosed
149 //purpose  : 
150 //=======================================================================
151
152 Standard_Boolean Geom_ToroidalSurface::IsVClosed () const {
153
154   return Standard_True; 
155 }
156
157 //=======================================================================
158 //function : IsUPeriodic
159 //purpose  : 
160 //=======================================================================
161
162 Standard_Boolean Geom_ToroidalSurface::IsUPeriodic () const {
163
164   return Standard_True; 
165 }
166
167 //=======================================================================
168 //function : IsVPeriodic
169 //purpose  : 
170 //=======================================================================
171
172 Standard_Boolean Geom_ToroidalSurface::IsVPeriodic () const {
173
174  return Standard_True; 
175 }
176
177
178 //=======================================================================
179 //function : SetMajorRadius
180 //purpose  : 
181 //=======================================================================
182
183 void Geom_ToroidalSurface::SetMajorRadius (const Standard_Real MajorRadius) {
184
185   if (MajorRadius - minorRadius <= gp::Resolution())
186     Standard_ConstructionError::Raise();
187   else 
188     majorRadius = MajorRadius;
189 }
190
191
192 //=======================================================================
193 //function : SetMinorRadius
194 //purpose  : 
195 //=======================================================================
196
197 void Geom_ToroidalSurface::SetMinorRadius (const Standard_Real MinorRadius) {
198
199   if (MinorRadius < 0.0 || majorRadius - MinorRadius <= gp::Resolution())
200     Standard_ConstructionError::Raise();
201   else 
202     minorRadius = MinorRadius;
203 }
204
205
206 //=======================================================================
207 //function : SetTorus
208 //purpose  : 
209 //=======================================================================
210
211 void Geom_ToroidalSurface::SetTorus (const gp_Torus& T) {
212   
213    minorRadius = T.MinorRadius();
214    majorRadius = T.MajorRadius();
215    pos = T.Position();
216 }
217
218
219 //=======================================================================
220 //function : Area
221 //purpose  : 
222 //=======================================================================
223
224 Standard_Real Geom_ToroidalSurface::Area () const {
225   return 4.0 * M_PI * M_PI * minorRadius * majorRadius;
226 }
227
228
229 //=======================================================================
230 //function : Bounds
231 //purpose  : 
232 //=======================================================================
233
234 void Geom_ToroidalSurface::Bounds (Standard_Real& U1,
235                                    Standard_Real& U2, 
236                                    Standard_Real& V1, 
237                                    Standard_Real& V2 ) const {
238  
239   U1 = 0.0;  
240   V1 = 0.0;  
241   U2 = 2*M_PI;  
242   V2 = 2*M_PI;
243 }
244
245
246 //=======================================================================
247 //function : Coefficients
248 //purpose  : 
249 //=======================================================================
250
251 void Geom_ToroidalSurface::Coefficients (Array1OfReal& Coef) const {
252
253   gp_Torus Tor (pos, majorRadius, minorRadius);
254   Tor.Coefficients (Coef);
255 }
256
257
258 //=======================================================================
259 //function : D0
260 //purpose  : 
261 //=======================================================================
262
263 void Geom_ToroidalSurface::D0 (const Standard_Real U, const Standard_Real V, Pnt& P) const 
264 {
265
266   ElSLib::TorusD0 (U, V, pos, majorRadius, minorRadius,P);
267 }
268
269
270 //=======================================================================
271 //function : D1
272 //purpose  : 
273 //=======================================================================
274
275 void Geom_ToroidalSurface::D1 
276   (const Standard_Real U, const Standard_Real V, 
277          Pnt& P, 
278          Vec& D1U, Vec& D1V) const 
279 {
280   ElSLib::TorusD1 (U, V, pos, majorRadius, minorRadius, P, D1U, D1V);  
281 }
282
283
284 //=======================================================================
285 //function : D2
286 //purpose  : 
287 //=======================================================================
288
289 void Geom_ToroidalSurface::D2 
290   (const Standard_Real U  , const Standard_Real V, 
291          Pnt& P  , 
292          Vec& D1U, Vec& D1V, 
293          Vec& D2U, Vec& D2V, Vec& D2UV ) const 
294 {
295   ElSLib::TorusD2 (U, V, pos, majorRadius, minorRadius, P, D1U, D1V,
296                    D2U, D2V, D2UV);  
297 }
298
299
300 //=======================================================================
301 //function : D3
302 //purpose  : 
303 //=======================================================================
304
305 void Geom_ToroidalSurface::D3 
306   (const Standard_Real U, const Standard_Real V,
307          Pnt& P, 
308          Vec& D1U, Vec& D1V,
309          Vec& D2U, Vec& D2V, Vec& D2UV,
310          Vec& D3U, Vec& D3V, Vec& D3UUV, Vec& D3UVV ) const 
311 {
312
313   ElSLib::TorusD3 (U, V, pos, majorRadius, minorRadius, P, D1U, D1V,
314                    D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV);  
315 }
316
317
318 //=======================================================================
319 //function : DN
320 //purpose  : 
321 //=======================================================================
322
323 Vec Geom_ToroidalSurface::DN 
324   (const Standard_Real    U , const Standard_Real    V, 
325    const Standard_Integer Nu, const Standard_Integer Nv ) const {
326
327   Standard_RangeError_Raise_if (Nu + Nv < 1 || Nu < 0 || Nv <0, "  ");
328   return ElSLib::TorusDN (U, V, pos, majorRadius, minorRadius, Nu, Nv);
329 }
330
331
332 //=======================================================================
333 //function : Torus
334 //purpose  : 
335 //=======================================================================
336
337 gp_Torus Geom_ToroidalSurface::Torus () const {
338
339    return gp_Torus (pos, majorRadius, minorRadius);
340 }
341
342
343 //=======================================================================
344 //function : UIso
345 //purpose  : 
346 //=======================================================================
347
348 Handle(Geom_Curve) Geom_ToroidalSurface::UIso (const Standard_Real U) const 
349 {
350   Handle(Geom_Circle) 
351     GC = new Geom_Circle(ElSLib::TorusUIso(pos,majorRadius,minorRadius,U));
352   return GC;
353 }
354
355
356 //=======================================================================
357 //function : VIso
358 //purpose  : 
359 //=======================================================================
360
361 Handle(Geom_Curve) Geom_ToroidalSurface::VIso (const Standard_Real V) const 
362 {
363   Handle(Geom_Circle) GC = 
364     new Geom_Circle(ElSLib::TorusVIso(pos,majorRadius,minorRadius,V));
365   return GC;
366 }
367
368
369 //=======================================================================
370 //function : Volume
371 //purpose  : 
372 //=======================================================================
373
374 Standard_Real Geom_ToroidalSurface::Volume () const {
375
376   return (M_PI * minorRadius * minorRadius) * (2.0 * M_PI * majorRadius);
377 }
378
379
380 //=======================================================================
381 //function : Transform
382 //purpose  : 
383 //=======================================================================
384
385 void Geom_ToroidalSurface::Transform (const Trsf& T) {
386
387    majorRadius = majorRadius * Abs(T.ScaleFactor());
388    minorRadius = minorRadius * Abs(T.ScaleFactor());
389    pos.Transform (T);
390 }