b035be6608149e52573d169e2cb2ef5e22653101
[occt.git] / src / Bnd / Bnd_Box2d.hxx
1 // Created on: 1991-01-28
2 // Created by: Remi Lequette
3 // Copyright (c) 1991-1999 Matra Datavision
4 // Copyright (c) 1999-2012 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 #ifndef _Bnd_Box2d_HeaderFile
18 #define _Bnd_Box2d_HeaderFile
19
20 #include <Standard.hxx>
21 #include <Standard_DefineAlloc.hxx>
22 #include <Standard_Handle.hxx>
23
24 #include <Standard_Real.hxx>
25 #include <Standard_Integer.hxx>
26 #include <Standard_Boolean.hxx>
27 class Standard_ConstructionError;
28 class gp_Pnt2d;
29 class gp_Dir2d;
30 class gp_Trsf2d;
31
32
33 //! Describes a bounding box in 2D space.
34 //! A bounding box is parallel to the axes of the coordinates
35 //! system. If it is finite, it is defined by the two intervals:
36 //! -   [ Xmin,Xmax ], and
37 //! -   [ Ymin,Ymax ].
38 //! A bounding box may be infinite (i.e. open) in one or more
39 //! directions. It is said to be:
40 //! -   OpenXmin if it is infinite on the negative side of the   "X Direction";
41 //! -   OpenXmax if it is infinite on the positive side of the   "X Direction";
42 //! -   OpenYmin if it is infinite on the negative side of the   "Y Direction";
43 //! -   OpenYmax if it is infinite on the positive side of the   "Y Direction";
44 //! -   WholeSpace if it is infinite in all four directions. In
45 //! this case, any point of the space is inside the box;
46 //! -   Void if it is empty. In this case, there is no point included in the box.
47 //! A bounding box is defined by four bounds (Xmin, Xmax, Ymin and Ymax) which
48 //! limit the bounding box if it is finite, six flags (OpenXmin, OpenXmax, OpenYmin,
49 //! OpenYmax, WholeSpace and Void) which describe the bounding box if it is infinite or empty, and
50 //! -   a gap, which is included on both sides in any direction when consulting the finite bounds of the box.
51 class Bnd_Box2d 
52 {
53 public:
54
55   DEFINE_STANDARD_ALLOC
56
57   
58   //! Creates an empty 2D bounding box.
59   //! The constructed box is qualified Void. Its gap is null.
60     Bnd_Box2d();
61   
62   //! Sets this bounding box so that it covers the whole 2D
63   //! space, i.e. it is infinite in all directions.
64     void SetWhole();
65   
66   //! Sets this 2D bounding box so that it is empty. All points are outside a void box.
67     void SetVoid();
68   
69   //! Sets this 2D bounding box so that it bounds
70   //! the point P. This involves first setting this bounding box
71   //! to be void and then adding the point PThe rectangle bounds   the  point <P>.
72     void Set (const gp_Pnt2d& P);
73   
74   //! Sets this 2D bounding box so that it bounds
75   //! the half-line defined by point P and direction D, i.e. all
76   //! points M defined by M=P+u*D, where u is greater than
77   //! or equal to 0, are inside the bounding area. This involves
78   //! first setting this 2D box to be void and then adding the   half-line.
79     void Set (const gp_Pnt2d& P, const gp_Dir2d& D);
80   
81   //! Enlarges this 2D bounding box, if required, so that it
82   //! contains at least:
83   //! -   interval [ aXmin,aXmax ] in the "X Direction",
84   //! -   interval [ aYmin,aYmax ] in the "Y Direction"
85   Standard_EXPORT void Update (const Standard_Real aXmin, const Standard_Real aYmin, const Standard_Real aXmax, const Standard_Real aYmax);
86   
87   //! Adds a point of coordinates (X,Y) to this bounding box.
88   Standard_EXPORT void Update (const Standard_Real X, const Standard_Real Y);
89   
90   //! Returns the gap of this 2D bounding box.
91     Standard_Real GetGap() const;
92   
93   //! Set the gap of this 2D bounding box to abs(Tol).
94     void SetGap (const Standard_Real Tol);
95   
96   //! Enlarges     the  box  with    a  tolerance  value.
97   //! This means that the minimum values of its X and Y
98   //! intervals of definition, when they are finite, are reduced by
99   //! the absolute value of Tol, while the maximum values are
100   //! increased by the same amount.
101     void Enlarge (const Standard_Real Tol);
102   
103   //! Returns the bounds of this 2D bounding box.
104   //! The gap is included. If this bounding box is infinite (i.e. "open"), returned values
105   //! may be equal to +/- Precision::Infinite().
106   //! if IsVoid()
107   Standard_EXPORT void Get (Standard_Real& aXmin, Standard_Real& aYmin, Standard_Real& aXmax, Standard_Real& aYmax) const;
108   
109   //! The Box will be infinitely long in the Xmin direction.
110     void OpenXmin();
111   
112   //! The Box will be infinitely long in the Xmax direction.
113     void OpenXmax();
114   
115   //! The Box will be infinitely long in the Ymin direction.
116     void OpenYmin();
117   
118   //! The Box will be infinitely long in the Ymax direction.
119     void OpenYmax();
120   
121   //! Returns true if this bounding box is open in the Xmin direction.
122     Standard_Boolean IsOpenXmin() const;
123   
124   //! Returns true if this bounding box is open in the Xmax direction.
125     Standard_Boolean IsOpenXmax() const;
126   
127   //! Returns true if this bounding box is open in the Ymin direction.
128     Standard_Boolean IsOpenYmin() const;
129   
130   //! Returns true if this bounding box is open in the Ymax direction.
131     Standard_Boolean IsOpenYmax() const;
132   
133
134   //! Returns true if this bounding box is infinite in all 4
135   //! directions (Whole Space flag).
136     Standard_Boolean IsWhole() const;
137   
138
139   //! Returns true if this 2D bounding box is empty (Void flag).
140     Standard_Boolean IsVoid() const;
141   
142   //! Returns a bounding box which is the result of applying the
143   //! transformation T to this bounding box.
144   //! Warning
145   //! Applying a geometric transformation (for example, a
146   //! rotation) to a bounding box generally increases its
147   //! dimensions. This is not optimal for algorithms which use it.
148   Standard_EXPORT Bnd_Box2d Transformed (const gp_Trsf2d& T) const;
149   
150   //! Adds the 2d box <Other> to <me>.
151   Standard_EXPORT void Add (const Bnd_Box2d& Other);
152   
153   //! Adds  the 2d pnt <P> to <me>.
154     void Add (const gp_Pnt2d& P);
155   
156   //! Extends <me> from the Pnt <P> in the direction <D>.
157     void Add (const gp_Pnt2d& P, const gp_Dir2d& D);
158   
159   //! Extends the Box  in the given Direction, i.e. adds
160   //! a half-line. The box may become infinite in 1 or 2
161   //! directions.
162   Standard_EXPORT void Add (const gp_Dir2d& D);
163   
164   //! Returns True if the 2d pnt <P> is out <me>.
165   Standard_EXPORT Standard_Boolean IsOut (const gp_Pnt2d& P) const;
166   
167   //! Returns True if <Box2d> is out <me>.
168   Standard_EXPORT Standard_Boolean IsOut (const Bnd_Box2d& Other) const;
169   
170   //! Returns True if transformed <Box2d> is out <me>.
171     Standard_Boolean IsOut (const Bnd_Box2d& Other, const gp_Trsf2d& T) const;
172   
173   //! Compares  a transformed  bounding with  a    transformed
174   //! bounding. The default implementation is  to make a copy
175   //! of <me> and <Other>, to transform them and to test.
176     Standard_Boolean IsOut (const gp_Trsf2d& T1, const Bnd_Box2d& Other, const gp_Trsf2d& T2) const;
177   
178   Standard_EXPORT void Dump() const;
179   
180   //! Computes the squared diagonal of me.
181     Standard_Real SquareExtent() const;
182
183
184
185
186 protected:
187
188
189
190
191
192 private:
193
194
195
196   Standard_Real Xmin;
197   Standard_Real Xmax;
198   Standard_Real Ymin;
199   Standard_Real Ymax;
200   Standard_Real Gap;
201   Standard_Integer Flags;
202
203
204 };
205
206
207 #include <Bnd_Box2d.lxx>
208
209
210
211
212
213 #endif // _Bnd_Box2d_HeaderFile