Point Cloud Library (PCL)  1.9.1-dev
opennurbs_geometry.h
1 /* $NoKeywords: $ */
2 /*
3 //
4 // Copyright (c) 1993-2012 Robert McNeel & Associates. All rights reserved.
5 // OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert
6 // McNeel & Associates.
7 //
8 // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
9 // ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF
10 // MERCHANTABILITY ARE HEREBY DISCLAIMED.
11 //
12 // For complete openNURBS copyright information see <http://www.opennurbs.org>.
13 //
14 ////////////////////////////////////////////////////////////////
15 */
16 
17 ////////////////////////////////////////////////////////////////
18 //
19 // virtual base class for all geomtric objects
20 //
21 ////////////////////////////////////////////////////////////////
22 
23 #if !defined(OPENNURBS_GEOMETRY_INC_)
24 #define OPENNURBS_GEOMETRY_INC_
25 
26 class ON_Brep;
27 
28 ////////////////////////////////////////////////////////////////
29 
30 // Description:
31 // Base class for all geometry classes that must
32 // provide runtime class id. Provides interface
33 // for common geometric operations like finding bounding
34 // boxes and transforming.
35 //
36 class ON_CLASS ON_Geometry : public ON_Object
37 {
38  // Any object derived from ON_Geometry should have a
39  // ON_OBJECT_DECLARE(ON_...);
40  // as the last line of its class definition and a
41  // ON_OBJECT_IMPLEMENT( ON_..., ON_baseclass );
42  // in a .cpp file.
43  //
44  // See the definition of ON_Object for details.
45  ON_OBJECT_DECLARE(ON_Geometry);
46 
47 public:
48  ON_Geometry();
49  ON_Geometry(const ON_Geometry&);
51  virtual ~ON_Geometry();
52 
53  // Description:
54  // Get object's 3d axis aligned bounding box.
55  // Returns:
56  // 3d bounding box.
57  // Remarks:
58  // Uses virtual GetBBox() function to calculate the result.
59  ON_BoundingBox BoundingBox() const;
60 
61  // Description:
62  // Get object's 3d axis aligned bounding box or the
63  // union of the input box with the object's bounding box.
64  // Parameters:
65  // bbox - [in/out] 3d axis aligned bounding box
66  // bGrowBox - [in] (default=false)
67  // If true, then the union of the input bbox and the
68  // object's bounding box is returned in bbox.
69  // If false, the object's bounding box is returned in bbox.
70  // Returns:
71  // true if object has bounding box and calculation was successful.
72  // Remarks:
73  // Uses virtual GetBBox() function to calculate the result.
74  ON_BOOL32 GetBoundingBox(
75  ON_BoundingBox& bbox,
76  int bGrowBox = false
77  ) const;
78 
79  // Description:
80  // Get corners of object's 3d axis aligned bounding box
81  // or the union of the input box with the object's bounding
82  // box.
83  // Parameters:
84  // bbox_min - [in/out] minimum corner of the 3d bounding box
85  // bbox_max - [in/out] maximum corner of the 3d bounding box
86  // bGrowBox - [in] (default=false)
87  // If true, then the union of the input bbox and the
88  // object's bounding box is returned.
89  // If false, the object's bounding box is returned.
90  // Returns:
91  // true if successful.
92  ON_BOOL32 GetBoundingBox(
93  ON_3dPoint& bbox_min,
94  ON_3dPoint& bbox_max,
95  int bGrowBox = false
96  ) const;
97 
98  // Description:
99  // Rotates the object about the specified axis. A positive
100  // rotation angle results in a counter-clockwise rotation
101  // about the axis (right hand rule).
102  // Parameters:
103  // sin_angle - [in] sine of rotation angle
104  // cos_angle - [in] sine of rotation angle
105  // rotation_axis - [in] direction of the axis of rotation
106  // rotation_center - [in] point on the axis of rotation
107  // Returns:
108  // true if object successfully rotated
109  // Remarks:
110  // Uses virtual Transform() function to calculate the result.
111  ON_BOOL32 Rotate(
112  double sin_angle,
113  double cos_angle,
114  const ON_3dVector& rotation_axis,
115  const ON_3dPoint& rotation_center
116  );
117 
118  // Description:
119  // Rotates the object about the specified axis. A positive
120  // rotation angle results in a counter-clockwise rotation
121  // about the axis (right hand rule).
122  // Parameters:
123  // rotation_angle - [in] angle of rotation in radians
124  // rotation_axis - [in] direction of the axis of rotation
125  // rotation_center - [in] point on the axis of rotation
126  // Returns:
127  // true if object successfully rotated
128  // Remarks:
129  // Uses virtual Transform() function to calculate the result.
130  ON_BOOL32 Rotate(
131  double rotation_angle,
132  const ON_3dVector& rotation_axis,
133  const ON_3dPoint& rotation_center
134  );
135 
136  // Description:
137  // Translates the object along the specified vector.
138  // Parameters:
139  // translation_vector - [in] translation vector
140  // Returns:
141  // true if object successfully translated
142  // Remarks:
143  // Uses virtual Transform() function to calculate the result.
144  ON_BOOL32 Translate(
145  const ON_3dVector& translation_vector
146  );
147 
148  // Description:
149  // Scales the object by the specified facotor. The scale is
150  // centered at the origin.
151  // Parameters:
152  // scale_factor - [in] scale factor
153  // Returns:
154  // true if object successfully scaled
155  // Remarks:
156  // Uses virtual Transform() function to calculate the result.
157  ON_BOOL32 Scale(
158  double scale_factor
159  );
160 
161  // Description:
162  // Dimension of the object.
163  // Returns:
164  // Dimension of the object.
165  // Remarks:
166  // The dimension is typically three. For parameter space trimming
167  // curves the dimension is two. In rare cases the dimension can
168  // be one or greater than three.
169  virtual
170  int Dimension() const = 0;
171 
172  // Description:
173  // This is the virtual function that actually calculates axis
174  // aligned bounding boxes.
175  // Parameters:
176  // boxmin - [in/out] array of Dimension() doubles
177  // boxmax - [in/out] array of Dimension() doubles
178  // bGrowBox - [in] (default=false)
179  // If true, then the union of the input bbox and the
180  // object's bounding box is returned in bbox.
181  // If false, the object's bounding box is returned in bbox.
182  // Returns:
183  // true if object has bounding box and calculation was successful
184  virtual
185  ON_BOOL32 GetBBox(
186  double* boxmin,
187  double* boxmax,
188  int bGrowBox = false
189  ) const = 0;
190 
191  /*
192  Description:
193  Get tight bounding box.
194  Parameters:
195  tight_bbox - [in/out] tight bounding box
196  bGrowBox -[in] (default=false)
197  If true and the input tight_bbox is valid, then returned
198  tight_bbox is the union of the input tight_bbox and the
199  curve's tight bounding box.
200  xform -[in] (default=NULL)
201  If not NULL, the tight bounding box of the transformed
202  geometry is calculated. The geometry is not modified.
203  Returns:
204  True if a valid tight_bbox is returned.
205  Remarks:
206  In general, GetTightBoundingBox is slower that BoundingBox,
207  especially when xform is not null.
208  */
209  virtual
210  bool GetTightBoundingBox(
211  ON_BoundingBox& tight_bbox,
212  int bGrowBox = false,
213  const ON_Xform* xform = 0
214  ) const;
215 
216  // Description:
217  // Some objects cache bounding box information.
218  // If you modify an object, then call ClearBoundingBox()
219  // to inform the object that any cached bounding boxes
220  // are invalid.
221  //
222  // Remarks:
223  // Generally, ClearBoundingBox() overrides
224  // simply invalidate a cached bounding box and then wait
225  // for a call to GetBBox() before recomputing the bounding box.
226  //
227  // The default implementation does nothing.
228  virtual
229  void ClearBoundingBox();
230 
231  /*
232  Description:
233  Transforms the object.
234 
235  Parameters:
236  xform - [in] transformation to apply to object.
237  If xform.IsSimilarity() is zero, then you may
238  want to call MakeSquishy() before calling
239  Transform.
240 
241  Remarks:
242  When overriding this function, be sure to include a call
243  to ON_Object::TransformUserData() which takes care of
244  transforming any ON_UserData that may be attached to
245  the object.
246 
247  See Also:
248  ON_Geometry::IsDeformable();
249 
250  Remarks:
251  Classes derived from ON_Geometry should call
252  ON_Geometry::Transform() to handle user data
253  transformations and then transform their
254  definition.
255  */
256  virtual
257  ON_BOOL32 Transform(
258  const ON_Xform& xform
259  );
260 
261  /*
262  Returns:
263  True if object can be accuratly modified with
264  "squishy" transformations like projections,
265  shears, an non-uniform scaling.
266  See Also:
267  ON_Geometry::MakeDeformable();
268  */
269  virtual
270  bool IsDeformable() const;
271 
272  /*
273  Description:
274  If possible, converts the object into a form that can
275  be accuratly modified with "squishy" transformations
276  like projections, shears, an non-uniform scaling.
277  Returns:
278  False if object cannot be converted to a deformable
279  object. True if object was already deformable or
280  was converted into a deformable object.
281  See Also:
282  ON_Geometry::IsDeformable();
283  */
284  virtual
285  bool MakeDeformable();
286 
287  // Description:
288  // Swaps object coordinate values with indices i and j.
289  //
290  // Parameters:
291  // i - [in] coordinate index
292  // j - [in] coordinate index
293  //
294  // Remarks:
295  // The default implementation uses the virtual Transform()
296  // function to calculate the result. If you are creating
297  // an object where Transform() is slow, coordinate swapping
298  // will be frequently used, and coordinate swapping can
299  // be quickly accomplished, then override this function.
300  //
301  // Example:
302  //
303  // ON_Point point(7,8,9);
304  // point.SwapCoordinates(0,2);
305  // // point = (9,8,7)
306  virtual
307  ON_BOOL32 SwapCoordinates(
308  int i,
309  int j
310  );
311 
312  /*
313  Description:
314  Query an object to see if it has an ON_Brep form.
315  Result:
316  Returns true if the virtual ON_Geometry::BrepForm can compute
317  an ON_Brep representation of this object.
318  Remarks:
319  The default implementation of ON_Geometry::BrepForm returns
320  false.
321  See Also
322  ON_Geometry::BrepForm
323  */
324  virtual
325  ON_BOOL32 HasBrepForm() const;
326 
327  /*
328  Description:
329  If possible, BrepForm() creates a brep form of the
330  ON_Geometry.
331  Parameters:
332  brep - [in] if not NULL, brep is used to store the brep
333  form of the geometry.
334  Result:
335  Returns a pointer to on ON_Brep or NULL. If the brep
336  parameter is not NULL, then brep is returned if the
337  geometry has a brep form and NULL is returned if the
338  geometry does not have a brep form.
339  Remarks:
340  The caller is responsible for managing the brep memory.
341  See Also
342  ON_Geometry::HasBrepForm
343  */
344  virtual
345  ON_Brep* BrepForm( ON_Brep* brep = NULL ) const;
346 
347  /*
348  Description:
349  If this piece of geometry is a component in something
350  larger, like an ON_BrepEdge in an ON_Brep, then this
351  function returns the component index.
352  Returns:
353  This object's component index. If this object is
354  not a sub-piece of a larger geometric entity, then
355  the returned index has
356  m_type = ON_COMPONENT_INDEX::invalid_type
357  and
358  m_index = -1.
359  */
360  virtual
361  ON_COMPONENT_INDEX ComponentIndex() const;
362 
363  /*
364  Description:
365  Evaluate the location of a point from the object
366  reference.
367  Parameters:
368  objref - [in]
369  point - [out]
370  If the evaluation cannot be performed, ON_UNSET_POINT
371  is returned.
372  Returns:
373  True if successful.
374  */
375  virtual
376  bool EvaluatePoint( const class ON_ObjRef& objref, ON_3dPoint& P ) const;
377 };
378 
379 #endif
380 
ON_Object & operator=(const ON_Object &)