/* $NoKeywords: $ */ /* // // Copyright (c) 1993-2012 Robert McNeel & Associates. All rights reserved. // OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert // McNeel & Associates. // // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. // ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF // MERCHANTABILITY ARE HEREBY DISCLAIMED. // // For complete openNURBS copyright information see . // //////////////////////////////////////////////////////////////// */ #if !defined(ON_OFFSETSURFACE_INC_) #define ON_OFFSETSURFACE_INC_ // This file is to be used in V3 plug-ins. // In V4, this will be included as part of opennurbs. // Ask Dale Lear if you have any questions. class ON_BumpFunction { public: ON_BumpFunction(); bool operator==(const ON_BumpFunction& other) const; bool operator<(const ON_BumpFunction& other) const; bool operator>(const ON_BumpFunction& other) const; double ValueAt( double s, double t ) const; void Evaluate( double s, double t, int der_count, double* value ) const; ON_2dPoint m_point; // center of bump int m_type[2]; // 1 = linear, 5 = quintic; // numbers used in evaluation double m_x0; double m_y0; double m_sx[2]; // 1/(suppor radius) double m_sy[2]; // 1/(suppor radius) double m_a; // evaluation coefficient void EvaluateHelperLinearBump(double t, double dt, int der_count, double* value) const; void EvaluateHelperQuinticBump(double t, double dt, int der_count, double* value) const; }; class ON_OffsetSurfaceValue { public: double m_s; double m_t; double m_distance; double m_radius; int m_index; }; #if defined(ON_DLL_TEMPLATE) // This stuff is here because of a limitation in the way Microsoft // handles templates and DLLs. See Microsoft's knowledge base // article ID Q168958 for details. #pragma warning( push ) #pragma warning( disable : 4231 ) ON_DLL_TEMPLATE template class ON_CLASS ON_SimpleArray; ON_DLL_TEMPLATE template class ON_CLASS ON_SimpleArray; #pragma warning( pop ) #endif class ON_CLASS ON_OffsetSurfaceFunction { public: ON_OffsetSurfaceFunction(); ~ON_OffsetSurfaceFunction(); /* Description: Sets base surface for the offset function. Parameters: srf - [in] pointer to the base surface. This surface must remain valid while the ON_OffsetSurfaceFunction class is used. Returns: True if successful. */ bool SetBaseSurface( const ON_Surface* srf ); /* Returns: Base surface specified SetBaseSurface(). */ const ON_Surface* BaseSurface() const; /* Description: Use set SetSideTangency if you want the offset surface and base surface to have the same unit normals along a side of the surfaces's parameter spaces. Parameters: side - [in] 0 = south side 1 = east side 2 = north side 3 = west side bEnable - [in] true to enable tangency, false to disable tangency Returns: True if successful. */ bool SetSideTangency( int side, bool bEnable ); /* Parameters: side - [in] 0 = south side 1 = east side 2 = north side 3 = west side Returns: True if side tangency is enabled. */ bool SideTangency(int side) const; /* Description: Sets the offset distance at a point. Call this function once for each point wher the user specifies an offset. Parameters: s - [in] t - [in] (s,t) is a base surface evaluation parameter distance - [in] distance is the offset distance. radius - [in] if radius>0, then this value will be the the approximate radius of the offset "bump". */ bool SetOffsetPoint( double s, double t, double distance, double radius = 0.0 ); /* Description: Sets the surface parameters of an existing offset point. Parameters: index - [in] index of the point to set s - [in] t - [in] (s,t) is a base surface evaluation parameter */ bool SetPoint( int index, double s, double t ); /* Description: Set the offset distance for an existing point Parameters: index - [in] index of the point to set distance - [in] new distance */ bool SetDistance( int index, double distance); /* Returns: Number of points specified using SetOffsetPoint(). */ int OffsetPointCount() const; /* Parameters: i - [in] an index >= 0 and < OffsetPointCount() Returns: Surface parameter specified using SetOffsetPoint(). */ ON_2dPoint OffsetSurfaceParameter(int i) const; /* Parameters: i - [in] an index >= 0 and < OffsetPointCount() Returns: Offset distance specified using SetOffsetPoint(). */ double OffsetDistance(int i) const; /* Description: Value of the offset distance at any surface parameter. Parameters: s - [in] t - [in] (s,t) is a base surface evaluation parameter Returns: offset distance at the surface parameter */ double DistanceAt( double s, double t ) const; /* Description: Value of the offset distance at any surface parameter. Parameters: s - [in] t - [in] (s,t) is a base surface evaluation parameter num_der - [in] number of derivatives value - [out] value and derivatives of distance function value[0] = distance, value[1] = 1rst derivative, value[2] = 2nd derivative, ... Returns: True if successful */ bool EvaluateDistance( double s, double t, int num_der, double* value ) const; /* Description: Value of the offset function at any surface parameter. Parameters: s - [in] t - [in] (s,t) is a base surface evaluation parameter Returns: Point on the offset surface. */ ON_3dPoint PointAt( double s, double t ) const; /* Description: Resets this class if you want to reuse it. */ void Destroy(); private: friend class ON_OffsetSurface; bool Initialize(); const ON_Surface* m_srf; ON_Interval m_domain[2]; bool m_bZeroSideDerivative[4]; // S,E,N,W side ON_SimpleArray m_offset_value; ON_SimpleArray m_bumps; bool m_bValid; }; class ON_CLASS ON_OffsetSurface : public ON_SurfaceProxy { // This is still a work in progress. In particular, // this surface class can not be saved in files, used // as a brep surface, added to Rhino, etc. // // As of January 2004, it is useful for calculating // offset meshes and any other fitting and approximation // tools that requires a surface evaluator but do not need // NURBS forms, isocurves, and so on. ON_OBJECT_DECLARE(ON_OffsetSurface); public: ON_OffsetSurface(); ~ON_OffsetSurface(); ON_OffsetSurface( const ON_OffsetSurface& src); ON_OffsetSurface& operator=(const ON_OffsetSurface& src); ON_BOOL32 GetBBox( double* bbox_min, double* bbox_max, int bGrowBox = false ) const; ON_BOOL32 Evaluate( // returns false if unable to evaluate double, double, // evaluation parameters int, // number of derivatives (>=0) int, // array stride (>=Dimension()) double*, // array of length stride*(ndir+1)*(ndir+2)/2 int = 0, // optional - determines which quadrant to evaluate from // 0 = default // 1 from NE quadrant // 2 from NW quadrant // 3 from SW quadrant // 4 from SE quadrant int* = 0 // optional - evaluation hint (int[2]) used to speed // repeated evaluations ) const; /* Description: Sets base surface to a surface that is not managed by the ON_OffsetSurface class. Parameters: base_surface - [in] points to a base surface the caller insures will exist for the lifetimes of the ON_OffsetSurface class. Returns: True if successful. */ bool SetBaseSurface( const ON_Surface* base_surface ); /* Description: Sets base surface to a surface that is optionally managed by the ON_OffsetSurface class. Parameters: base_surface - [in] points to a base surface the caller insures will exist for the lifetimes of the ON_OffsetSurface class. bManage - [in] if true, the base_surface must point to a surface that is on the heap and the surface will be deleted by ~ON_OffsetSurface. Returns: True if successful. */ bool SetBaseSurface( ON_Surface* base_surface, bool bManage ); /* Returns: Base surface; */ const ON_Surface* BaseSurface() const; ON_OffsetSurfaceFunction& OffsetFunction(); const ON_OffsetSurfaceFunction& OffsetFunction() const; private: // If not NULL, this points to the base surface ON_Surface* m__pSrf; ON_OffsetSurfaceFunction m_offset_function; }; #endif