5a816450e4fa71e1c83edb89880e700751c2d7a0
[occt.git] / src / gp / gp_Circ2d.hxx
1 // Copyright (c) 1991-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #ifndef _gp_Circ2d_HeaderFile
16 #define _gp_Circ2d_HeaderFile
17
18 #include <gp_Ax22d.hxx>
19 #include <gp_Ax2d.hxx>
20 #include <gp_Pnt2d.hxx>
21 #include <gp_Trsf2d.hxx>
22 #include <gp_Vec2d.hxx>
23 #include <Standard_ConstructionError.hxx>
24
25 //! Describes a circle in the plane (2D space).
26 //! A circle is defined by its radius and positioned in the
27 //! plane with a coordinate system (a gp_Ax22d object) as follows:
28 //! -   the origin of the coordinate system is the center of the circle, and
29 //! -   the orientation (direct or indirect) of the coordinate
30 //! system gives an implicit orientation to the circle (and
31 //! defines its trigonometric sense).
32 //! This positioning coordinate system is the "local
33 //! coordinate system" of the circle.
34 //! Note: when a gp_Circ2d circle is converted into a
35 //! Geom2d_Circle circle, some implicit properties of the
36 //! circle are used explicitly:
37 //! -   the implicit orientation corresponds to the direction in
38 //! which parameter values increase,
39 //! -   the starting point for parameterization is that of the "X
40 //! Axis" of the local coordinate system (i.e. the "X Axis" of the circle).
41 //! See Also
42 //! GccAna and Geom2dGcc packages which provide
43 //! functions for constructing circles defined by geometric constraints
44 //! gce_MakeCirc2d which provides functions for more
45 //! complex circle constructions
46 //! Geom2d_Circle which provides additional functions for
47 //! constructing circles and works, with the parametric
48 //! equations of circles in particular  gp_Ax22d
49 class gp_Circ2d 
50 {
51 public:
52
53   DEFINE_STANDARD_ALLOC
54
55   //! creates an indefinite circle.
56   gp_Circ2d()
57   : radius  (RealLast())
58   {}
59
60   //! The location point of theXAxis is the center of the circle.
61   //! Warnings :
62   //! It is not forbidden to create a circle with theRadius = 0.0   Raises ConstructionError if theRadius < 0.0.
63   //! Raised if theRadius < 0.0.
64   gp_Circ2d (const gp_Ax2d& theXAxis, const Standard_Real theRadius, const Standard_Boolean theIsSense = Standard_True)
65   : radius (theRadius)
66   {
67     Standard_ConstructionError_Raise_if (theRadius < 0.0, "gp_Circ2d() - radius should be positive number");
68     pos = gp_Ax22d (theXAxis, theIsSense);
69   }
70
71   //! theAxis defines the Xaxis and Yaxis of the circle which defines
72   //! the origin and the sense of parametrization.
73   //! The location point of theAxis is the center of the circle.
74   //! Warnings :
75   //! It is not forbidden to create a circle with theRadius = 0.0 Raises ConstructionError if theRadius < 0.0.
76   //! Raised if theRadius < 0.0.
77   gp_Circ2d (const gp_Ax22d& theAxis, const Standard_Real theRadius)
78   : pos (theAxis),
79     radius (theRadius)
80   {
81     Standard_ConstructionError_Raise_if (theRadius < 0.0, "gp_Circ2d() - radius should be positive number");
82   }
83
84   //! Changes the location point (center) of the circle.
85   void SetLocation (const gp_Pnt2d& theP) { pos.SetLocation (theP); }
86
87   //! Changes the X axis of the circle.
88   void SetXAxis (const gp_Ax2d& theA) { pos.SetXAxis (theA); }
89
90   //! Changes the X axis of the circle.
91   void SetAxis (const gp_Ax22d& theA) { pos.SetAxis (theA); }
92
93   //! Changes the Y axis of the circle.
94   void SetYAxis (const gp_Ax2d& theA) { pos.SetYAxis (theA); }
95
96   //! Modifies the radius of this circle.
97   //! This class does not prevent the creation of a circle where
98   //! theRadius is null.
99   //! Exceptions
100   //! Standard_ConstructionError if theRadius is negative.
101   void SetRadius (const Standard_Real theRadius)
102   {
103     Standard_ConstructionError_Raise_if (theRadius < 0.0, "gp_Circ2d::SetRadius() - radius should be positive number");
104     radius = theRadius;
105   }
106
107   //! Computes the area of the circle.
108   Standard_Real Area() const { return M_PI * radius * radius; }
109
110   //! Returns the normalized coefficients from the implicit equation
111   //! of the circle :
112   //! theA * (X**2) + theB * (Y**2) + 2*theC*(X*Y) + 2*theD*X + 2*theE*Y + theF = 0.0
113   void Coefficients (Standard_Real& theA, Standard_Real& theB,
114                      Standard_Real& theC, Standard_Real& theD,
115                      Standard_Real& theE, Standard_Real& theF) const;
116
117   //! Does <me> contain theP ?
118   //! Returns True if the distance between theP and any point on
119   //! the circumference of the circle is lower of equal to
120   //! <theLinearTolerance>.
121   Standard_Boolean Contains (const gp_Pnt2d& theP, const Standard_Real theLinearTolerance) const
122   {
123     return Distance (theP) <= theLinearTolerance;
124   }
125
126   //! Computes the minimum of distance between the point theP and any
127   //! point on the circumference of the circle.
128   Standard_Real Distance (const gp_Pnt2d& theP) const;
129
130   //! Computes the square distance between <me> and the point theP.
131   Standard_Real SquareDistance (const gp_Pnt2d& theP) const;
132
133   //! computes the circumference of the circle.
134   Standard_Real Length() const { return 2. * M_PI * radius; }
135
136   //! Returns the location point (center) of the circle.
137   const gp_Pnt2d& Location() const { return pos.Location(); }
138
139   //! Returns the radius value of the circle.
140   Standard_Real Radius() const { return radius; }
141
142   //! returns the position of the circle.
143   const gp_Ax22d& Axis() const { return pos; }
144
145   //! returns the position of the circle. Idem Axis(me).
146   const gp_Ax22d& Position() const { return pos; }
147
148   //! returns the X axis of the circle.
149   gp_Ax2d XAxis() const { return gp_Ax2d (pos.XAxis()); }
150
151   //! Returns the Y axis of the circle.
152   //! Reverses the direction of the circle.
153   gp_Ax2d YAxis() const { return gp_Ax2d (pos.YAxis()); }
154
155   //! Reverses the orientation of the local coordinate system
156   //! of this circle (the "Y Direction" is reversed) and therefore
157   //! changes the implicit orientation of this circle.
158   //! Reverse assigns the result to this circle,
159   void Reverse()
160   {
161     gp_Dir2d aTemp = pos.YDirection();
162     aTemp.Reverse();
163     pos.SetAxis (gp_Ax22d (pos.Location(), pos.XDirection(), aTemp));
164   }
165
166   //! Reverses the orientation of the local coordinate system
167   //! of this circle (the "Y Direction" is reversed) and therefore
168   //! changes the implicit orientation of this circle.
169   //! Reversed creates a new circle.
170   Standard_NODISCARD gp_Circ2d Reversed() const;
171
172   //! Returns true if the local coordinate system is direct
173   //! and false in the other case.
174   Standard_Boolean IsDirect() const
175   {
176     return (pos.XDirection().Crossed (pos.YDirection())) >= 0.0;
177   }
178
179   Standard_EXPORT void Mirror (const gp_Pnt2d& theP);
180
181   //! Performs the symmetrical transformation of a circle with respect
182   //! to the point theP which is the center of the symmetry
183   Standard_NODISCARD Standard_EXPORT gp_Circ2d Mirrored (const gp_Pnt2d& theP) const;
184
185   Standard_EXPORT void Mirror (const gp_Ax2d& theA);
186
187   //! Performs the symmetrical transformation of a circle with respect
188   //! to an axis placement which is the axis of the symmetry.
189   Standard_NODISCARD Standard_EXPORT gp_Circ2d Mirrored (const gp_Ax2d& theA) const;
190
191   void Rotate (const gp_Pnt2d& theP, const Standard_Real theAng)
192   {
193     pos.Rotate (theP, theAng);
194   }
195
196   //! Rotates a circle. theP is the center of the rotation.
197   //! Ang is the angular value of the rotation in radians.
198   Standard_NODISCARD gp_Circ2d Rotated (const gp_Pnt2d& theP, const Standard_Real theAng) const
199   {
200     gp_Circ2d aCirc = *this;
201     aCirc.pos.Rotate (theP, theAng);
202     return aCirc;
203   }
204
205   void Scale (const gp_Pnt2d& theP, const Standard_Real theS);
206
207   //! Scales a circle. theS is the scaling value.
208   //! Warnings :
209   //! If theS is negative the radius stay positive but
210   //! the "XAxis" and the "YAxis" are  reversed as for
211   //! an ellipse.
212   Standard_NODISCARD gp_Circ2d Scaled (const gp_Pnt2d& theP, const Standard_Real theS) const;
213
214   void Transform (const gp_Trsf2d& theT);
215
216   //! Transforms a circle with the transformation theT from class Trsf2d.
217   Standard_NODISCARD gp_Circ2d Transformed (const gp_Trsf2d& theT) const;
218
219   void Translate (const gp_Vec2d& theV) { pos.Translate (theV); }
220
221   //! Translates a circle in the direction of the vector theV.
222   //! The magnitude of the translation is the vector's magnitude.
223   Standard_NODISCARD gp_Circ2d Translated (const gp_Vec2d& theV) const
224   {
225     gp_Circ2d aCirc = *this;
226     aCirc.pos.Translate (theV);
227     return aCirc;
228   }
229
230   void Translate (const gp_Pnt2d& theP1, const gp_Pnt2d& theP2) { pos.Translate (theP1, theP2); }
231
232   //! Translates a circle from the point theP1 to the point theP2.
233   Standard_NODISCARD gp_Circ2d Translated (const gp_Pnt2d& theP1, const gp_Pnt2d& theP2) const
234   {
235     gp_Circ2d aCirc = *this;
236     aCirc.pos.Translate (theP1, theP2);
237     return aCirc;
238   }
239
240 private:
241
242   gp_Ax22d pos;
243   Standard_Real radius;
244
245 };
246
247 // =======================================================================
248 // function : Coefficients
249 // purpose  :
250 // =======================================================================
251 inline void gp_Circ2d::Coefficients (Standard_Real& theA,
252                                      Standard_Real& theB,
253                                      Standard_Real& theC,
254                                      Standard_Real& theD,
255                                      Standard_Real& theE,
256                                      Standard_Real& theF) const
257 {
258   Standard_Real aXc = pos.Location().X();
259   Standard_Real anYc = pos.Location().Y();
260   theA = 1.0;
261   theB = 1.0;
262   theC = 0.0;
263   theD = - aXc;
264   theE = - anYc;
265   theF = aXc * aXc + anYc * anYc - radius * radius;
266 }
267
268 // =======================================================================
269 // function : Distance
270 // purpose  :
271 // =======================================================================
272 inline Standard_Real gp_Circ2d::Distance (const gp_Pnt2d& theP) const
273 {
274   gp_XY aCoord = theP.XY();
275   aCoord.Subtract (pos.Location().XY());
276   Standard_Real aD = radius - aCoord.Modulus();
277   if (aD < 0)
278   {
279     aD = -aD;
280   }
281   return aD;
282 }
283
284 // =======================================================================
285 // function : Reversed
286 // purpose  :
287 // =======================================================================
288 inline gp_Circ2d gp_Circ2d::Reversed() const
289 {
290   gp_Circ2d aCirc = *this;
291   gp_Dir2d aTemp = pos.YDirection();
292   aTemp.Reverse();
293   aCirc.pos.SetAxis (gp_Ax22d(pos.Location(), pos.XDirection(), aTemp));
294   return aCirc;
295 }
296
297 // =======================================================================
298 // function : SquareDistance
299 // purpose  :
300 // =======================================================================
301 inline Standard_Real gp_Circ2d::SquareDistance (const gp_Pnt2d& theP) const
302 {
303   gp_XY aCoord = theP.XY();
304   aCoord.Subtract (pos.Location().XY());
305   Standard_Real aD = radius - aCoord.Modulus();
306   return aD * aD;
307 }
308
309 // =======================================================================
310 // function : Scale
311 // purpose  :
312 // =======================================================================
313 inline void gp_Circ2d::Scale (const gp_Pnt2d& theP, const Standard_Real theS)
314 {
315   radius *= theS;
316   if (radius < 0)
317   {
318     radius = -radius;
319   }
320   pos.Scale (theP, theS);
321 }
322
323 // =======================================================================
324 // function : Scaled
325 // purpose  :
326 // =======================================================================
327 inline gp_Circ2d gp_Circ2d::Scaled (const gp_Pnt2d& theP, const Standard_Real theS) const
328 {
329   gp_Circ2d aCirc = *this;
330   aCirc.radius *= theS;
331   if (aCirc.radius < 0)
332   {
333     aCirc.radius = -aCirc.radius;
334   }
335   aCirc.pos.Scale (theP, theS);
336   return aCirc;
337 }
338
339 // =======================================================================
340 // function : Transform
341 // purpose  :
342 // =======================================================================
343 inline void gp_Circ2d::Transform (const gp_Trsf2d& theT)
344 {
345   radius *= theT.ScaleFactor();
346   if (radius < 0)
347   {
348     radius = -radius;
349   }
350   pos.Transform (theT);
351 }
352
353 // =======================================================================
354 // function : Transformed
355 // purpose  :
356 // =======================================================================
357 inline gp_Circ2d gp_Circ2d::Transformed (const gp_Trsf2d& theT) const
358 {
359   gp_Circ2d aCirc = *this;
360   aCirc.radius *= theT.ScaleFactor();
361   if (aCirc.radius < 0)
362   {
363     aCirc.radius = -aCirc.radius;
364   }
365   aCirc.pos.Transform (theT);
366   return aCirc;
367 }
368
369 #endif // _gp_Circ2d_HeaderFile