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&); 50 ON_Geometry& operator=(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 381