LCOV - code coverage report
Current view: top level - geom/Cholla/cgm - CubitPoint.hpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 16 53 30.2 %
Date: 2020-06-30 00:58:45 Functions: 10 26 38.5 %
Branches: 7 38 18.4 %

           Branch data     Line data    Source code
       1                 :            : //-----------------------------------------------------------------------------
       2                 :            : //
       3                 :            : //  File: CubitPoint.hpp
       4                 :            : //
       5                 :            : //  Purpose:  Point Class used for mesh based geometry and other tools.  It is
       6                 :            : //            primarily used in conjuction with CubitFacet and CubitFacetEdge 
       7                 :            : //            classes.
       8                 :            : //
       9                 :            : //  Notes:    Note that this class does not contain any private data.
      10                 :            : //            All data should be defined within the child classes inherited
      11                 :            : //            from this class.  The current Cubit data class that inherits
      12                 :            : //            from CubitPoint is CubitPointData.  This is done so that 
      13                 :            : //            other applications using CubitPoints can use their own
      14                 :            : //            point data, but take advantage of the CGM/Cubit functionality.
      15                 :            : //            Please do not add private data to this class; instead add the
      16                 :            : //            data to the children and access through virtual functions.
      17                 :            : // 
      18                 :            : //            Do not create a CubitPoint directly.  For example, don't do: 
      19                 :            : //              CubitPoint *cp = new CubitPoint(...);
      20                 :            : //            You should instead create the appropriate child class, and 
      21                 :            : //            cast it to a CubitPoint for use.  For example:
      22                 :            : //              CubitPoint *cp = (CubitPoint *) new CubitPointData(...);
      23                 :            : //                        
      24                 :            : //-----------------------------------------------------------------------------
      25                 :            : 
      26                 :            : #ifndef CUBITPOINT_HPP
      27                 :            : #define CUBITPOINT_HPP
      28                 :            : 
      29                 :            : // Include for CubitBoolean
      30                 :            : #include "CubitDefines.h"
      31                 :            : #include "CubitVector.hpp"
      32                 :            : #include "DLIList.hpp"
      33                 :            : #include "MemoryManager.hpp"
      34                 :            : #include "ToolDataUser.hpp"
      35                 :            : #include "CubitMatrix.hpp"
      36                 :            : #include "FacetEntity.hpp"
      37                 :            : class CubitFacet;
      38                 :            : class CubitQuadFacet;
      39                 :            : class CubitFacetEdge;
      40                 :            : class CubitPoint;
      41                 :            : class CubitTransformMatrix;
      42                 :            : class Surface;
      43                 :            : class CubitBox;
      44                 :            : 
      45                 :            : class CubitPoint : public FacetEntity
      46                 :            : {
      47                 :            : private:
      48                 :            : 
      49                 :            :   static double boxTol;
      50                 :            : 
      51                 :            : protected:
      52                 :            : 
      53                 :            :   int markedFlag;
      54                 :            :     //-generic marking flag.
      55                 :            : 
      56                 :            :   CubitVector *surfNormal;
      57                 :            :     //- The normalized surface normal (if required)
      58                 :            : 
      59                 :            :   double dCoef;
      60                 :            :     //- D coeficient in tangent plane equation Ax+By+Cz+D=0
      61                 :            :     //- where A,B,C is surfNormal
      62                 :            : 
      63                 :            :   double uVal, vVal, sizeVal;
      64                 :            :     //- parametric location of point
      65                 :            : 
      66                 :            :   CubitVector *surfU, *surfV;
      67                 :            :     //- Orthogonal surface tangent vectors at the point
      68                 :            : 
      69                 :            :   double *coefVector;
      70                 :            :     //- coefficients for quadric surface approximation
      71                 :            : 
      72                 :            :   IttyBit isFeature;
      73                 :            :     //- set if this point is a feature
      74                 :            : 
      75                 :            : public:
      76                 :            : 
      77                 :            :   CubitPoint();
      78                 :            :   virtual ~CubitPoint();
      79                 :            : 
      80                 :            :   virtual int id() = 0; 
      81                 :          0 :   virtual void set_id( int ) {};
      82                 :            : 
      83                 :            :   virtual double x() = 0;
      84                 :            :   virtual double y() = 0;
      85                 :            :   virtual double z() = 0;
      86                 :            :   virtual void set( const CubitVector &pos ) = 0;
      87                 :            : 
      88                 :          0 :   virtual void marked(int marked) {markedFlag = marked;};
      89                 :          0 :   virtual int marked() {return markedFlag;};
      90                 :            :       
      91                 :            :   virtual CubitVector coordinates() const = 0;
      92                 :            :   virtual void coordinates(double point_array[3]) = 0;
      93                 :            :   
      94                 :            :   virtual void add_facet( CubitFacet *facet) = 0;
      95                 :            :   virtual void remove_facet( CubitFacet *facet) = 0;
      96                 :            :   virtual int num_adj_facets() = 0;
      97                 :            : 
      98                 :            :   virtual void facets( DLIList<CubitFacet*> &facet_list ) = 0;
      99                 :            :   virtual void edges( DLIList<CubitFacetEdge*> &edge_list ) = 0;
     100                 :            :   virtual void points( DLIList<CubitPoint*> &point_list ) = 0;
     101                 :            : 
     102                 :          0 :   virtual void tris( DLIList<CubitFacet*> &facet_list ) { facets(facet_list); }
     103                 :            : 
     104                 :            :   virtual void normal( CubitVector &surf_norm );
     105                 :            :   virtual CubitVector normal();
     106                 :            :   virtual CubitVector* normal_ptr();
     107                 :            :   
     108                 :            :   virtual void set_normal( CubitVector &surf_norm );
     109                 :            :   virtual void reset_normal( );
     110                 :            : 
     111                 :        264 :   virtual void d_coef( const double d_coefficient ) {dCoef = d_coefficient;};
     112                 :          0 :   virtual double d_coef() {return dCoef;};
     113                 :            : 
     114                 :       1320 :   virtual double u() { return uVal; };
     115                 :       1320 :   virtual double v() { return vVal; };
     116                 :       1320 :   virtual double size() {return sizeVal; };
     117                 :          0 :   virtual void set_uv( double u, double v ) { uVal = u; vVal = v; };
     118                 :        308 :   virtual void set_uvs(double u, double v, double s) {uVal = u; vVal = v; sizeVal = s; }
     119                 :            :     //- get and set the u-v coordinates (careful with internal boundaries - see TDFacetBoundarPoint)
     120                 :            :   virtual CubitStatus get_uv( CubitFacet *facet, double &u, double &v );
     121                 :            :   virtual CubitStatus get_uvs( CubitFacet *facet, double &u, double &v, double &s);
     122                 :            :     //- return the u-v coords with respect to the surface that the facet is on
     123                 :            :   
     124                 :            :   virtual void du( CubitVector &duvec );
     125                 :            :   virtual CubitVector du();
     126                 :            : 
     127                 :            :   virtual void dv( CubitVector &dvvec );
     128                 :            :   virtual CubitVector dv();
     129                 :            : 
     130                 :            :   virtual double *coef_vector( );
     131                 :            :   virtual void coef_vector( const CubitMatrix& coef );
     132                 :            : 
     133                 :            :   virtual CubitStatus merge_points( CubitPoint *cp, CubitBoolean keep_point = CUBIT_FALSE );
     134                 :            : 
     135                 :            :   void shared_facets( CubitPoint* other_point, 
     136                 :            :                       CubitFacet*& facet1, 
     137                 :            :                       CubitFacet*& facet2 );
     138                 :            : 
     139                 :            :   void shared_facets( CubitPoint* other_point, 
     140                 :            :                       DLIList<CubitFacet*>& result_list );
     141                 :            : 
     142                 :            :   CubitFacetEdge *shared_edge( CubitPoint* other_point );
     143                 :            : 
     144                 :            :   
     145                 :            :   void adjacent_points( CubitPoint **adj_points,
     146                 :            :                         int &num_adj_points );
     147                 :            :   void adjacent_points( DLIList<CubitPoint*>& result_list );
     148                 :            :     //- return array of points sharing adjacent facets
     149                 :            : 
     150                 :            :   CubitBox bounding_box();
     151                 :            :     //-return a box around this point
     152                 :            : 
     153                 :            :   void facets_on_surf( int surf_id, DLIList<CubitFacet *> &facet_list,
     154                 :            :                        CubitBoolean &on_internal_boundary );
     155                 :            :     //- return facets adjacent this point that are on the given surface
     156                 :            :     //- surf_id is the FacetEvalTool ToolID
     157                 :            : 
     158                 :            :   CubitVector normal( CubitFacet *facet_ptr );
     159                 :            :   CubitVector normal( CubitQuadFacet *qfacet_ptr );
     160                 :            :   CubitVector normal( CubitFacetEdge *edge_ptr );
     161                 :            :     //- return normal with respect to the facet and edge
     162                 :            : 
     163                 :            :   CubitVector tangent( CubitFacetEdge *edge_ptr, double mindot );
     164                 :            :     //- return tangent with respect to the edge
     165                 :            :   void next_feature_edges( CubitFacetEdge *this_edge_ptr,
     166                 :            :                            DLIList <CubitFacetEdge *> feature_edge_list );
     167                 :            :     //- given a facet boundary edge and this point, get a list
     168                 :            :     //- of the next fetaure edges at this point
     169                 :            : 
     170                 :            :   CubitVector project_to_tangent_plane( CubitVector &pt );
     171                 :            :     //- Project a point to the tangent plane defined at the CubitPoint
     172                 :            : 
     173                 :            :   void transform_to_local( CubitVector &glob_vec,
     174                 :            :                            CubitVector &loc_vec );
     175                 :            :   void transform_to_global( CubitVector &loc_vec,
     176                 :            :                             CubitVector &glob_vec );
     177                 :            :     //- transform a point between local and global system
     178                 :            : 
     179                 :            :   void define_tangent_vectors();
     180                 :            :     //- set up the tangent vectors at the point for quadratic interpolation
     181                 :            : 
     182                 :            :   void get_parents( DLIList<FacetEntity*> &facet_list );
     183                 :            : 
     184                 :            :   void debug_draw( int color = -1, int flush = 1, int draw_uv=0 );
     185                 :            :     // debug drawing
     186                 :            : 
     187                 :            :   void compute_avg_normal();
     188                 :            :     //- compute the avg normal at this point based on adjacent facets
     189                 :            : 
     190                 :            :   CubitFacetEdge *get_edge( CubitPoint *other_point );
     191                 :            :     //- return the edge between two points if one exists
     192                 :            : 
     193                 :            :   void transform(CubitTransformMatrix &tfmat);
     194                 :            :   void rotate_normal(CubitTransformMatrix &rotmat);
     195                 :            :     //- apply transformations to the point
     196                 :            :     
     197                 :            :   CubitStatus check_inverted_facets( const CubitVector& new_position );
     198                 :            :     //- Check if moving this CubitPoint to the passed position
     199                 :            :     //- will invert any adjacent facets.  Returns true if no facets
     200                 :            :     //- will be inverted, false if one or more facets will be 
     201                 :            :     //- inerted when the point is moved.
     202                 :            : 
     203                 :       2244 :   void set_as_feature() { isFeature = 1; }
     204         [ +  + ]:       3696 :   CubitBoolean is_feature( ){return (isFeature ? CUBIT_TRUE : CUBIT_FALSE); }
     205                 :            :     // set and get the isFeature bit
     206                 :            : 
     207                 :          0 :   static void set_box_tol( double tol ) {boxTol = tol;}
     208                 :            : };
     209                 :            : 
     210                 :          0 : inline void CubitPoint::coef_vector(const CubitMatrix &input_matrix) 
     211                 :            : {
     212         [ #  # ]:          0 :   if (!coefVector) coefVector = new double[5];
     213         [ #  # ]:          0 :   for (int i=0; i<5; i++) {
     214                 :          0 :     coefVector[i] = input_matrix.get(i,0);
     215                 :            :   }
     216                 :          0 : }
     217                 :            : 
     218                 :        264 : inline void CubitPoint::normal( CubitVector &surf_norm )
     219                 :            : {
     220 [ +  + ][ +  - ]:        264 :   if(!surfNormal) surfNormal = new CubitVector (surf_norm);
     221                 :        176 :   else *surfNormal = surf_norm;
     222                 :        264 : }
     223                 :            : 
     224                 :        132 : inline CubitVector CubitPoint::normal()
     225                 :            : {
     226         [ +  + ]:        132 :   if (surfNormal==NULL) compute_avg_normal();
     227                 :        132 :   return *surfNormal;
     228                 :            : }
     229                 :            : 
     230                 :        748 : inline CubitVector* CubitPoint::normal_ptr()
     231                 :            : {
     232                 :        748 :   return surfNormal;
     233                 :            : }
     234                 :            : 
     235                 :          0 : inline void CubitPoint::set_normal( CubitVector &surf_norm )
     236                 :            : {
     237                 :          0 :   *surfNormal = surf_norm;
     238                 :          0 : }
     239                 :            : 
     240                 :          0 : inline void CubitPoint::reset_normal()
     241                 :            : {
     242                 :          0 :   compute_avg_normal();
     243                 :          0 : }
     244                 :            : 
     245                 :          0 : inline void CubitPoint::du( CubitVector &duvec )
     246                 :            : {
     247 [ #  # ][ #  # ]:          0 :   if(!surfU) surfU = new CubitVector (duvec);
     248                 :          0 :   else *surfU = duvec;
     249                 :          0 : }
     250                 :            : 
     251                 :          0 : inline void CubitPoint::dv( CubitVector &dvvec )
     252                 :            : {
     253 [ #  # ][ #  # ]:          0 :   if(!surfV) surfV = new CubitVector (dvvec);
     254                 :          0 :   else *surfV = dvvec;
     255                 :          0 : }
     256                 :            : 
     257                 :          0 : inline CubitVector CubitPoint::du()
     258                 :            : {
     259         [ #  # ]:          0 :   assert(surfU != NULL);
     260                 :          0 :   return *surfU;
     261                 :            : }
     262                 :            : 
     263                 :          0 : inline CubitVector CubitPoint::dv()
     264                 :            : {
     265         [ #  # ]:          0 :   assert(surfV != NULL);
     266                 :          0 :   return *surfV;
     267                 :            : }
     268                 :            : 
     269                 :          0 : inline double *CubitPoint::coef_vector( )
     270                 :            : {
     271         [ #  # ]:          0 :   assert (coefVector != NULL);
     272                 :          0 :   return coefVector;
     273                 :            : }
     274                 :            : 
     275                 :            : class CubitPointComparator {
     276                 :            : public: 
     277                 :          0 :   bool operator () (CubitPoint * a, CubitPoint * b) const
     278                 :            :   {
     279 [ #  # ][ #  # ]:          0 :     return ( a->x() < b->x() ) || (a->x()==b->x() && a->y()<b->y()) || (a->x() == b->x() && a->y()==b->y() && a->z() < b->z() );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     280                 :            :   }
     281                 :            : };
     282                 :            : 
     283                 :            : template <> struct DLIListSorter<CubitPoint*>
     284                 :            : {
     285                 :            :   bool operator()(CubitPoint* a, CubitPoint* b) { return a->id() < b->id(); }
     286                 :            : };
     287                 :            : 
     288                 :            : 
     289                 :            : #endif
     290                 :            : 
     291                 :            : 
     292                 :            : 
     293                 :            : 
     294                 :            : 
     295                 :            : 
     296                 :            : 

Generated by: LCOV version 1.11