LCOV - code coverage report
Current view: top level - geom/facet - TDOctreeRefEdge.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 1 81 1.2 %
Date: 2020-06-30 00:58:45 Functions: 2 10 20.0 %
Branches: 2 106 1.9 %

           Branch data     Line data    Source code
       1                 :            : //- Class:       TDOctreeRefEdge
       2                 :            : //- Description: Tool data for storing additional information needed for generating line source entities.
       3                 :            : //- Owner:       W. R. Quadors
       4                 :            : //- Checked by:
       5                 :            : //- Version:
       6                 :            : #include "TDOctreeRefEdge.hpp" 
       7                 :            : #include "CubitDefines.h" 
       8                 :            : #include "ToolData.hpp"
       9                 :            : #include "MemoryManager.hpp" 
      10                 :            : #include "DLIList.hpp"
      11                 :            : #include "CastTo.hpp"
      12                 :            : #include "RefEdge.hpp"
      13                 :            : #include "GMem.hpp"
      14                 :            : 
      15                 :            : 
      16                 :            : 
      17                 :            : // Constructor  
      18                 :          0 : TDOctreeRefEdge::TDOctreeRefEdge(){
      19 [ #  # ][ #  # ]:          0 :   resultPointData = new GMem;
      20                 :          0 :   visit = CUBIT_FALSE;
      21                 :          0 : }
      22                 :            : 
      23                 :            : 
      24                 :            : // Distructor
      25                 :          0 : TDOctreeRefEdge::~TDOctreeRefEdge(){
      26         [ #  # ]:          0 :   clean_gpoint_list();
      27                 :            :     //PRINT_INFO("Inside ~TDOctreeRefEdge\n");
      28         [ #  # ]:          0 : }
      29                 :            : 
      30                 :          0 : void TDOctreeRefEdge::clean_gpoint_list(){
      31         [ #  # ]:          0 :   delete resultPointData;  
      32                 :          0 : }
      33                 :            : 
      34                 :            : //-------------------------------------------------------------------------
      35                 :            : // Purpose       : To create TDOctreeRefEdge to MRefFace
      36                 :            : //
      37                 :            : // Special Notes :
      38                 :            : //
      39                 :            : // Creator       : W R Quadros
      40                 :            : //
      41                 :            : // Creation Date : 07/03
      42                 :            : //------------------------------------------------------------------------- 
      43                 :          0 : CubitStatus TDOctreeRefEdge::add_td(  RefEdge *mref_edge )
      44                 :            : {
      45                 :            :   ToolData *td;
      46                 :          0 :   td = mref_edge->get_TD(&TDOctreeRefEdge::is_td_skl_mref_edge);
      47         [ #  # ]:          0 :   if ( td == NULL )
      48                 :            :   {
      49         [ #  # ]:          0 :     TDOctreeRefEdge *td_gm = new TDOctreeRefEdge;
      50                 :          0 :     mref_edge->add_TD( td_gm);
      51                 :          0 :     td_gm->set_mref_edge( mref_edge );
      52                 :            :   }
      53                 :            :   else
      54                 :            :   {
      55         [ #  # ]:          0 :     TDOctreeRefEdge *td_gm = CAST_TO(td, TDOctreeRefEdge);
      56                 :          0 :     td_gm->set_mref_edge( mref_edge );
      57                 :            :   }
      58                 :          0 :   return CUBIT_SUCCESS;
      59                 :            : }
      60                 :            : 
      61                 :            : //-------------------------------------------------------------------------
      62                 :            : // Purpose       : get the TDOctreeRefEdge for a RefEdge
      63                 :            : //
      64                 :            : // Special Notes :
      65                 :            : //
      66                 :            : // Creator       : W R Quadros
      67                 :            : //
      68                 :            : // Creation Date : 07/03
      69                 :            : //------------------------------------------------------------------------- 
      70                 :          0 : TDOctreeRefEdge* TDOctreeRefEdge::get_td( RefEdge *mref_edge )
      71                 :            : {
      72                 :            :   ToolData *td;
      73                 :          0 :   td = mref_edge->get_TD(&TDOctreeRefEdge::is_td_skl_mref_edge);
      74         [ #  # ]:          0 :   if ( td != NULL )
      75                 :            :   {
      76         [ #  # ]:          0 :     TDOctreeRefEdge *td_gm = CAST_TO(td, TDOctreeRefEdge);
      77                 :          0 :     return td_gm;
      78                 :            :   }
      79                 :          0 :   return (TDOctreeRefEdge*) NULL;
      80                 :            : }
      81                 :            :  
      82                 :            : // curve decimating function
      83                 :            : // takes in points to decimate based on an angle_tolerance in degrees
      84                 :            : // and puts results into the result point data
      85                 :          0 : void TDOctreeRefEdge::decimate_curve_points_for_source_entity(GMem& point_data, double angle_tolerance, GMem& result_point_data)
      86                 :            : {
      87                 :            :     // pointListCount instead of point_data.point_list_size()  (they are different)
      88                 :          0 :   int num_pre_points = point_data.pointListCount;
      89                 :            : 
      90                 :            :     // only decimate if we have more than 2 points
      91         [ #  # ]:          0 :   if(num_pre_points <= 2)
      92                 :            :   {
      93                 :          0 :     result_point_data = point_data;
      94                 :          0 :     return;
      95                 :            :   }
      96                 :            : 
      97                 :            :     // get threshold value
      98                 :          0 :   const double threshold = cos( DEGREES_TO_RADIANS(angle_tolerance) );
      99                 :            : 
     100                 :            :     // mark array for what to keep and throw
     101                 :          0 :   char* mark_array = new char[num_pre_points];
     102                 :            :     // zero means keep the point, non-zero means remove the point
     103                 :          0 :   memset(mark_array, 0, num_pre_points);
     104                 :            : 
     105                 :          0 :   int num_points_to_keep = 2;   // initialize to keep start and end points
     106                 :            : 
     107                 :            :   int i;
     108                 :          0 :   GPoint* point_data_array = point_data.point_list();
     109                 :            :     // initialize first point
     110                 :          0 :   GPoint* pre_point = &(point_data_array[0]);
     111                 :            :     // traverse all but start and end points
     112         [ #  # ]:          0 :   for(i=1; i<(num_pre_points-1); i++)
     113                 :            :   {
     114                 :            : 
     115                 :            :       // create two vectors
     116                 :            :       // one from i-1 to i and another from i to i+1
     117                 :          0 :     GPoint* point = &(point_data_array[i]);
     118                 :          0 :     GPoint* next_point = &(point_data_array[i+1]);
     119                 :            : 
     120                 :            :     CubitVector v1(CubitVector(pre_point->x, pre_point->y, pre_point->z), 
     121 [ #  # ][ #  # ]:          0 :                    CubitVector(point->x, point->y, point->z));
                 [ #  # ]
     122         [ #  # ]:          0 :     v1.normalize();
     123                 :            : 
     124                 :            :     CubitVector v2(CubitVector(point->x, point->y, point->z),
     125 [ #  # ][ #  # ]:          0 :                    CubitVector(next_point->x, next_point->y, next_point->z));
                 [ #  # ]
     126         [ #  # ]:          0 :     v2.normalize();
     127                 :            : 
     128                 :            :       // compute whether to keep the point
     129         [ #  # ]:          0 :     double dot_product = v1 % v2;
     130                 :            : 
     131                 :          0 :     bool keep = dot_product > threshold ? false : true;
     132                 :            : 
     133                 :            :       // if keep
     134         [ #  # ]:          0 :     if(keep)
     135                 :            :     {
     136                 :          0 :       num_points_to_keep++;
     137                 :          0 :       pre_point = point;
     138                 :            :     }
     139                 :            :       // if not keep
     140                 :            :     else
     141                 :            :     {
     142                 :          0 :       mark_array[i] = 1;
     143                 :            :     }
     144                 :            :   }
     145                 :            : 
     146                 :            :     // make a new GPoint array
     147         [ #  # ]:          0 :   GPoint* new_point_list = new GPoint[num_points_to_keep];
     148                 :          0 :   int new_point_list_count = 0;
     149                 :            :     // copy points to keep into the new array
     150         [ #  # ]:          0 :   for(i=0; i<num_pre_points; i++)
     151                 :            :   {
     152         [ #  # ]:          0 :     if(mark_array[i] == 0)
     153                 :            :     {
     154                 :          0 :       new_point_list[new_point_list_count] = point_data_array[i];
     155                 :          0 :       new_point_list_count++;
     156                 :            :     }
     157                 :            :   }
     158                 :            : 
     159         [ #  # ]:          0 :   delete [] mark_array;
     160                 :            : 
     161         [ #  # ]:          0 :   assert(new_point_list_count == num_points_to_keep);
     162                 :            :     //printf("reduced points from %i to %i\n", num_pre_points, num_points_to_keep);
     163                 :            : 
     164                 :            :     // put data into the result gmem
     165                 :          0 :   result_point_data.replace_point_list(new_point_list, new_point_list_count, new_point_list_count);
     166                 :          0 :   result_point_data.points_consolidated(CUBIT_TRUE);
     167                 :            : }
     168                 :            : 
     169                 :          0 : CubitBoolean TDOctreeRefEdge::generate_gpoint_list( double decimation_ang )
     170                 :            : {
     171                 :            :     // get facets from cgm
     172         [ #  # ]:          0 :   GMem point_data;
     173         [ #  # ]:          0 :   refEdge->get_graphics( point_data );
     174                 :            :     // decimate the facets to the resolution we want
     175                 :            : 
     176         [ #  # ]:          0 :   TDOctreeRefEdge::decimate_curve_points_for_source_entity( point_data, decimation_ang, *resultPointData);
     177                 :            : 
     178         [ #  # ]:          0 :   return CUBIT_TRUE;
     179                 :            : }
     180                 :            : 
     181                 :            : 
     182                 :            : 
     183                 :            : //====================================================================== 
     184                 :            : // Description: return curvature at a point on the edge 
     185                 :            : // Author: sjowen 
     186                 :            : // Modified: W R Quadros
     187                 :            : // Date: 01/2005 
     188                 :            : //====================================================================== 
     189                 :          0 : CubitBoolean TDOctreeRefEdge::find_curve_curvature_using_three_points(CubitVector point_a, CubitVector point_b, CubitVector point_c, CubitVector &curvature ){
     190                 :            : 
     191                 :            : 
     192 [ #  # ][ #  # ]:          0 :   CubitVector vec_ba, vec_bc;
     193                 :            : 
     194 [ #  # ][ #  # ]:          0 :   vec_ba = point_a - point_b; 
     195 [ #  # ][ #  # ]:          0 :   vec_bc = point_c - point_b; 
     196                 :            :   
     197                 :            :     // Squares of lengths of the edges incident to `a'.
     198         [ #  # ]:          0 :   double ba_length = vec_ba.length_squared();
     199         [ #  # ]:          0 :   double bc_length = vec_bc.length_squared();
     200                 :            :   
     201                 :            :     // Cross product of these edges.
     202                 :            :     // (Take your chances with floating-point roundoff.)
     203         [ #  # ]:          0 :   CubitVector cross = vec_ba * vec_bc;
     204                 :            :   
     205                 :            :     // Calculate the denominator of the formulae.
     206         [ #  # ]:          0 :   double denominator = 0.5 / (cross % cross);
     207         [ #  # ]:          0 :   assert(denominator != 0.0);
     208                 :            :   
     209                 :            :     // Calculate offset (from `a') of circumcenter.
     210 [ #  # ][ #  # ]:          0 :   CubitVector circle_center  = (ba_length * vec_bc - bc_length * vec_ba) * cross;
         [ #  # ][ #  # ]
     211         [ #  # ]:          0 :   circle_center *= denominator;
     212                 :            : 
     213                 :            :     //store radius
     214         [ #  # ]:          0 :   double radius = circle_center.length();
     215         [ #  # ]:          0 :   circle_center.normalize();
     216         [ #  # ]:          0 :   circle_center /= radius;
     217                 :            :   
     218         [ #  # ]:          0 :   curvature = circle_center; 
     219                 :          0 :   return CUBIT_TRUE; 
     220 [ +  - ][ +  - ]:       6540 : } 
     221                 :            : 
     222                 :            :   // EOF
     223                 :            : 
     224                 :            : 
     225                 :            : 

Generated by: LCOV version 1.11