1 // File: Geom_ConicalSurface.cxx
2 // Created: Wed Mar 10 09:33:39 1993
5 // Copyright: Matra Datavision 1993
7 //File Geom_ConicalSurface.cxx, JCV 17/01/91
10 #include <Geom_ConicalSurface.ixx>
12 #include <Standard_ConstructionError.hxx>
13 #include <Standard_RangeError.hxx>
15 #include <Precision.hxx>
18 #include <gp_Circ.hxx>
19 #include <gp_Ax2d.hxx>
23 #include <GeomAbs_UVSense.hxx>
24 #include <Geom_Line.hxx>
25 #include <Geom_Circle.hxx>
27 typedef Geom_ConicalSurface ConicalSurface;
28 typedef Handle(Geom_ConicalSurface) Handle(ConicalSurface);
43 //=======================================================================
46 //=======================================================================
48 Handle(Geom_Geometry) Geom_ConicalSurface::Copy () const {
50 Handle(ConicalSurface) Cs;
51 Cs = new ConicalSurface (pos, semiAngle, radius);
55 //=======================================================================
56 //function : Geom_ConicalSurface
58 //=======================================================================
60 Geom_ConicalSurface::Geom_ConicalSurface ( const Ax3& A3 ,
61 const Standard_Real Ang,
62 const Standard_Real R) :
63 radius(R), semiAngle (Ang)
66 if (R < 0.0 || Abs(Ang) <= gp::Resolution() || Abs(Ang) >= PI/2.0 - gp::Resolution())
67 Standard_ConstructionError::Raise();
73 //=======================================================================
74 //function : Geom_ConicalSurface
76 //=======================================================================
78 Geom_ConicalSurface::Geom_ConicalSurface ( const gp_Cone& C )
79 : radius (C.RefRadius()), semiAngle (C.SemiAngle())
85 //=======================================================================
86 //function : UReversedParameter
88 //=======================================================================
90 Standard_Real Geom_ConicalSurface::UReversedParameter( const Standard_Real U) const
96 //=======================================================================
97 //function : VReversedParameter
99 //=======================================================================
101 Standard_Real Geom_ConicalSurface::VReversedParameter( const Standard_Real V) const
106 //=======================================================================
107 //function : VReverse
109 //=======================================================================
111 void Geom_ConicalSurface::VReverse()
113 semiAngle = -semiAngle;
117 //=======================================================================
118 //function : RefRadius
120 //=======================================================================
122 Standard_Real Geom_ConicalSurface::RefRadius () const
125 //=======================================================================
126 //function : SemiAngle
128 //=======================================================================
130 Standard_Real Geom_ConicalSurface::SemiAngle () const
133 //=======================================================================
134 //function : IsUClosed
136 //=======================================================================
138 Standard_Boolean Geom_ConicalSurface::IsUClosed () const
139 { return Standard_True; }
141 //=======================================================================
142 //function : IsVClosed
144 //=======================================================================
146 Standard_Boolean Geom_ConicalSurface::IsVClosed () const
147 { return Standard_False; }
149 //=======================================================================
150 //function : IsUPeriodic
152 //=======================================================================
154 Standard_Boolean Geom_ConicalSurface::IsUPeriodic () const
155 { return Standard_True; }
157 //=======================================================================
158 //function : IsVPeriodic
160 //=======================================================================
162 Standard_Boolean Geom_ConicalSurface::IsVPeriodic () const
163 { return Standard_False; }
165 //=======================================================================
168 //=======================================================================
170 gp_Cone Geom_ConicalSurface::Cone () const {
172 return gp_Cone (pos, semiAngle, radius);
176 //=======================================================================
179 //=======================================================================
181 void Geom_ConicalSurface::SetCone (const gp_Cone& C) {
183 radius = C.RefRadius ();
184 semiAngle = C.SemiAngle ();
189 //=======================================================================
190 //function : SetRadius
192 //=======================================================================
194 void Geom_ConicalSurface::SetRadius (const Standard_Real R) {
196 if (R < 0.0) Standard_ConstructionError::Raise();
201 //=======================================================================
202 //function : SetSemiAngle
204 //=======================================================================
206 void Geom_ConicalSurface::SetSemiAngle (const Standard_Real Ang) {
208 if (Abs(Ang) <= gp::Resolution() || Abs(Ang) >= PI/2.0 - gp::Resolution()) {
209 Standard_ConstructionError::Raise();
215 //=======================================================================
218 //=======================================================================
220 Pnt Geom_ConicalSurface::Apex () const
223 XYZ Coord = Position().Direction().XYZ();
224 Coord.Multiply (-radius / Tan (semiAngle));
225 Coord.Add (Position().Location().XYZ());
230 //=======================================================================
233 //=======================================================================
235 void Geom_ConicalSurface::Bounds (Standard_Real& U1, Standard_Real& U2,
236 Standard_Real& V1, Standard_Real& V2) const {
238 U1 = 0.0; U2 = 2.0 * PI;
239 V1 = -Precision::Infinite(); V2 = Precision::Infinite();
243 //=======================================================================
244 //function : Coefficients
246 //=======================================================================
248 void Geom_ConicalSurface::Coefficients (Standard_Real& A1, Standard_Real& A2, Standard_Real& A3,
249 Standard_Real& B1, Standard_Real& B2, Standard_Real& B3,
250 Standard_Real& C1, Standard_Real& C2, Standard_Real& C3,
251 Standard_Real& D) const
253 // Dans le repere du cone :
254 // X**2 + Y**2 - (Myradius - Z * Tan(semiAngle))**2 = 0.0
257 T.SetTransformation (pos);
258 Standard_Real KAng = Tan (semiAngle);
259 Standard_Real T11 = T.Value (1, 1);
260 Standard_Real T12 = T.Value (1, 2);
261 Standard_Real T13 = T.Value (1, 3);
262 Standard_Real T14 = T.Value (1, 4);
263 Standard_Real T21 = T.Value (2, 1);
264 Standard_Real T22 = T.Value (2, 2);
265 Standard_Real T23 = T.Value (2, 3);
266 Standard_Real T24 = T.Value (2, 4);
267 Standard_Real T31 = T.Value (3, 1) * KAng;
268 Standard_Real T32 = T.Value (3, 2) * KAng;
269 Standard_Real T33 = T.Value (3, 3) * KAng;
270 Standard_Real T34 = T.Value (3, 4) * KAng;
271 A1 = T11 * T11 + T21 * T21 - T31 * T31;
272 A2 = T12 * T12 + T22 * T22 - T32 * T32;
273 A3 = T13 * T13 + T23 * T23 - T33 * T33;
274 B1 = T11 * T12 + T21 * T22 - T31 * T32;
275 B2 = T11 * T13 + T21 * T23 - T31 * T33;
276 B3 = T12 * T13 + T22 * T23 - T32 * T33;
277 C1 = T11 * T14 + T21 * T24 + radius * T31;
278 C2 = T12 * T14 + T22 * T24 + radius * T32;
279 C3 = T13 * T14 + T23 * T24 + radius * T33;
280 D = T14 * T14 + T24 * T24 - radius * radius - T34 * T34 +
286 //=======================================================================
289 //=======================================================================
291 void Geom_ConicalSurface::D0 (const Standard_Real U, const Standard_Real V, Pnt& P) const
294 P = ElSLib::ConeValue (U, V, pos, radius, semiAngle);
298 //=======================================================================
301 //=======================================================================
303 void Geom_ConicalSurface::D1 (const Standard_Real U , const Standard_Real V,
305 Vec& D1U, Vec& D1V ) const
307 ElSLib::ConeD1 (U, V, pos, radius, semiAngle, P, D1U, D1V);
311 //=======================================================================
314 //=======================================================================
316 void Geom_ConicalSurface::D2 ( const Standard_Real U , const Standard_Real V,
319 Vec& D2U, Vec& D2V, Vec& D2UV) const
321 ElSLib::ConeD2 (U, V, pos, radius, semiAngle, P, D1U, D1V,
326 //=======================================================================
329 //=======================================================================
331 void Geom_ConicalSurface::D3 (const Standard_Real U, const Standard_Real V,
334 Vec& D2U , Vec& D2V, Vec& D2UV,
335 Vec& D3U , Vec& D3V, Vec& D3UUV, Vec& D3UVV
338 ElSLib::ConeD3 (U, V, pos, radius, semiAngle, P, D1U, D1V, D2U, D2V,
339 D2UV, D3U, D3V, D3UUV, D3UVV);
343 //=======================================================================
346 //=======================================================================
348 Vec Geom_ConicalSurface::DN (const Standard_Real U , const Standard_Real V,
349 const Standard_Integer Nu, const Standard_Integer Nv ) const
351 Standard_RangeError_Raise_if (Nu + Nv < 1 || Nu < 0 || Nv < 0, " ");
352 if (Nv > 1) { return Vec (0.0, 0.0, 0.0); }
354 return ElSLib::ConeDN (U, V, pos, radius, semiAngle, Nu, Nv);
359 //=======================================================================
362 //=======================================================================
364 Handle(Geom_Curve) Geom_ConicalSurface::UIso (const Standard_Real U) const
367 GL = new Geom_Line(ElSLib::ConeUIso(pos,radius,semiAngle,U));
372 //=======================================================================
375 //=======================================================================
377 Handle(Geom_Curve) Geom_ConicalSurface::VIso (const Standard_Real V) const
380 GC = new Geom_Circle(ElSLib::ConeVIso(pos,radius,semiAngle,V));
385 //=======================================================================
386 //function : Transform
388 //=======================================================================
390 void Geom_ConicalSurface::Transform (const Trsf& T)
392 radius = radius * Abs(T.ScaleFactor());
396 //=======================================================================
397 //function : TransformParameters
399 //=======================================================================
401 void Geom_ConicalSurface::TransformParameters(Standard_Real& ,
406 if (!Precision::IsInfinite(V)) V *= Abs(T.ScaleFactor());
409 //=======================================================================
410 //function : ParametricTransformation
412 //=======================================================================
414 gp_GTrsf2d Geom_ConicalSurface::ParametricTransformation(const gp_Trsf& T)
418 gp_Ax2d Axis(gp::Origin2d(),gp::DX2d());
419 T2.SetAffinity(Axis, Abs(T.ScaleFactor()));