LCOV - code coverage report
Current view: top level - geom - SurfaceOverlapFacet.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 2 111 1.8 %
Date: 2020-06-30 00:58:45 Functions: 2 14 14.3 %
Branches: 2 182 1.1 %

           Branch data     Line data    Source code
       1                 :            : //- Class: SurfaceOverlapFacet
       2                 :            : //- Description: Facet definition class for efficient processing
       3                 :            : //-              for SurfaceOverlapTool.  
       4                 :            : //- Owner: Steve Storm
       5                 :            : //- Created: January 26, 2003
       6                 :            : 
       7                 :            : #include "SurfaceOverlapFacet.hpp"
       8                 :            : #include "GfxPreview.hpp"
       9                 :            : 
      10                 :       1635 : AnalyticGeometryTool* SurfaceOverlapFacet::agt = AnalyticGeometryTool::instance();
      11                 :            : 
      12                 :            : // Constructor
      13                 :          0 : SurfaceOverlapFacet::SurfaceOverlapFacet( GPoint p[3] )
      14                 :            : {
      15                 :          0 :   t.b.x = p[0].x;
      16                 :          0 :   t.b.y = p[0].y;
      17                 :          0 :   t.b.z = p[0].z;
      18                 :            : 
      19                 :          0 :   t.e0.x = p[1].x - p[0].x;
      20                 :          0 :   t.e0.y = p[1].y - p[0].y;
      21                 :          0 :   t.e0.z = p[1].z - p[0].z;
      22                 :            : 
      23                 :          0 :   t.e1.x = p[2].x - p[0].x;
      24                 :          0 :   t.e1.y = p[2].y - p[0].y;
      25                 :          0 :   t.e1.z = p[2].z - p[0].z;
      26                 :            : 
      27         [ #  # ]:          0 :   CubitVector min;
      28                 :            :    
      29         [ #  # ]:          0 :   min.set( CUBIT_MIN_3( p[0].x, p[1].x, p[2].x ),
      30         [ #  # ]:          0 :     CUBIT_MIN_3( p[0].y, p[1].y, p[2].y ),
      31 [ #  # ][ #  # ]:          0 :     CUBIT_MIN_3( p[0].z, p[1].z, p[2].z ) );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
      32                 :            :   
      33         [ #  # ]:          0 :   CubitVector max;
      34                 :            :   
      35         [ #  # ]:          0 :   max.set( CUBIT_MAX_3( p[0].x, p[1].x, p[2].x ),
      36         [ #  # ]:          0 :     CUBIT_MAX_3( p[0].y, p[1].y, p[2].y ),
      37 [ #  # ][ #  # ]:          0 :     CUBIT_MAX_3( p[0].z, p[1].z, p[2].z ) );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
      38                 :            : 
      39         [ #  # ]:          0 :   boundingBox.reset( min, max );
      40                 :          0 : }
      41                 :            : 
      42                 :            : // Destructor
      43                 :          0 : SurfaceOverlapFacet::~SurfaceOverlapFacet()
      44                 :            : {
      45                 :          0 : }
      46                 :            : 
      47                 :          0 : double SurfaceOverlapFacet::distance( SurfaceOverlapFacet &other_facet )
      48                 :            : {
      49                 :            :   double s, t2, u, v;
      50         [ #  # ]:          0 :   return agt->MinTriangleTriangle( t, other_facet.t, s, t2, u, v );
      51                 :            : }
      52                 :            : 
      53                 :          0 : double SurfaceOverlapFacet::perimeter()
      54                 :            : {
      55         [ #  # ]:          0 :   CubitVector pt0( t.b.x, t.b.y, t.b.z );
      56                 :            :   CubitVector pt1( t.b.x + t.e0.x,
      57                 :            :                    t.b.y + t.e0.y,
      58         [ #  # ]:          0 :                    t.b.z + t.e0.z );
      59                 :            :   CubitVector pt2( t.b.x + t.e1.x,
      60                 :            :                    t.b.y + t.e1.y,
      61         [ #  # ]:          0 :                    t.b.z + t.e1.z ); 
      62                 :            : 
      63         [ #  # ]:          0 :   double total_dist = pt0.distance_between(pt1);
      64         [ #  # ]:          0 :   total_dist += pt1.distance_between( pt2 );
      65         [ #  # ]:          0 :   total_dist += pt2.distance_between( pt0 );
      66                 :            : 
      67                 :          0 :   return total_dist;
      68                 :            : }
      69                 :            : 
      70                 :          0 : bool SurfaceOverlapFacet::facet_points_within_tol( SurfaceOverlapFacet *other_face, double tolerance )
      71                 :            : {
      72         [ #  # ]:          0 :   CubitVector tmp_pt( t.b.x, t.b.y, t.b.z );
      73 [ #  # ][ #  # ]:          0 :   if( this->distance_from_position( tmp_pt ) > tolerance )
      74                 :          0 :     return false;
      75                 :            : 
      76                 :            :   tmp_pt.set( t.b.x + t.e0.x,
      77                 :            :               t.b.y + t.e0.y,
      78         [ #  # ]:          0 :               t.b.z + t.e0.z );
      79                 :            : 
      80 [ #  # ][ #  # ]:          0 :   if( this->distance_from_position( tmp_pt ) > tolerance )
      81                 :          0 :     return false;
      82                 :            : 
      83                 :            :   tmp_pt.set( t.b.x + t.e1.x,
      84                 :            :               t.b.y + t.e1.y,
      85         [ #  # ]:          0 :               t.b.z + t.e1.z );
      86                 :            : 
      87 [ #  # ][ #  # ]:          0 :   if( this->distance_from_position( tmp_pt ) > tolerance )
      88                 :          0 :     return false;
      89                 :            : 
      90                 :          0 :   return true;
      91                 :            : }
      92                 :            : 
      93                 :          0 : double SurfaceOverlapFacet::distance_from_position( CubitVector &position )
      94                 :            : {
      95                 :            :   double s,t;  
      96                 :            :   Point3 tmp_point;
      97         [ #  # ]:          0 :   tmp_point.x = position.x();
      98         [ #  # ]:          0 :   tmp_point.y = position.y();
      99         [ #  # ]:          0 :   tmp_point.z = position.z();
     100         [ #  # ]:          0 :   return agt->MinPointTriangle( tmp_point, this->t, s, t );
     101                 :            : } 
     102                 :            : 
     103                 :            : CubitBoolean
     104                 :          0 : SurfaceOverlapFacet::facing( SurfaceOverlapFacet &other_facet )
     105                 :            : {
     106                 :            :     double norm1[3];
     107         [ #  # ]:          0 :     agt->Normal( t, norm1 );
     108                 :            :     double norm2[3];
     109         [ #  # ]:          0 :     agt->Normal( other_facet.t, norm2 );
     110                 :            : 
     111                 :            :     // move to the origin
     112                 :            :     double o1[3];
     113                 :          0 :     o1[0] = other_facet.t.b.x-t.b.x;
     114                 :          0 :     o1[1] = other_facet.t.b.y-t.b.y;
     115                 :          0 :     o1[2] = other_facet.t.b.z-t.b.z;
     116                 :            : 
     117         [ #  # ]:          0 :     double dot_p = agt->dot_vec(norm1,o1);
     118                 :          0 :     return (CubitBoolean)(dot_p >= 0.0);
     119                 :            : }
     120                 :            : 
     121                 :            : double
     122                 :          0 : SurfaceOverlapFacet::angle( SurfaceOverlapFacet &other_facet )
     123                 :            : {
     124                 :          0 :   return agt->Angle( t, other_facet.t ) * RADtoDEG;
     125                 :            : }
     126                 :            : 
     127                 :            : double
     128                 :          0 : SurfaceOverlapFacet::projected_overlap( SurfaceOverlapFacet &other_facet, CubitBoolean draw_overlap )
     129                 :            : {
     130                 :          0 :   double tmp_double = agt->ProjectedOverlap( t, other_facet.t, draw_overlap );
     131                 :            : 
     132         [ #  # ]:          0 :   if( tmp_double > 0.00 ) 
     133                 :            :   {
     134         [ #  # ]:          0 :     CubitVector edge0(t.e0.x, t.e0.y, t.e0.z);  
     135         [ #  # ]:          0 :     CubitVector edge1(t.e1.x, t.e1.y, t.e1.z);  
     136         [ #  # ]:          0 :     CubitVector normal = edge0 * edge1;
     137         [ #  # ]:          0 :     double area_facet1 = normal.length() / 2;
     138                 :            : 
     139         [ #  # ]:          0 :     edge0.set(other_facet.t.e0.x, other_facet.t.e0.y, other_facet.t.e0.z);  
     140         [ #  # ]:          0 :     edge1.set(other_facet.t.e1.x, other_facet.t.e1.y, other_facet.t.e1.z);  
     141 [ #  # ][ #  # ]:          0 :     normal = edge0 * edge1;
     142         [ #  # ]:          0 :     double area_facet2 = normal.length() / 2;
     143                 :            :     
     144                 :            :     //don't report overlapping area between facets unless it is greater 
     145                 :            :     //than one hundredth of the area of the smaller facet
     146         [ #  # ]:          0 :     if( area_facet1 < area_facet2 )
     147                 :            :     {
     148         [ #  # ]:          0 :       if( tmp_double < (area_facet1*0.01))
     149                 :          0 :         tmp_double = 0.0;
     150                 :            :     }
     151         [ #  # ]:          0 :     else if( tmp_double < (area_facet2*0.01 ))
     152                 :          0 :       tmp_double = 0.0;
     153                 :            :   }
     154                 :          0 :   return tmp_double;
     155                 :            : }
     156                 :            : 
     157                 :            : 
     158                 :          0 : void SurfaceOverlapFacet::draw( int color ) 
     159                 :            : {
     160         [ #  # ]:          0 :   CubitVector point1 = CubitVector( t.b.x, t.b.y, t.b.z );    
     161                 :            :   CubitVector point2 = CubitVector( t.e0.x + t.b.x, 
     162                 :            :                                     t.e0.y + t.b.y, 
     163         [ #  # ]:          0 :                                     t.e0.z + t.b.z );    
     164                 :            :   CubitVector point3 = CubitVector( t.e1.x + t.b.x, 
     165                 :            :                                     t.e1.y + t.b.y, 
     166         [ #  # ]:          0 :                                     t.e1.z + t.b.z );    
     167                 :            : 
     168         [ #  # ]:          0 :   GfxPreview::draw_line( point1, point2, color );
     169         [ #  # ]:          0 :   GfxPreview::draw_line( point2, point3, color );
     170         [ #  # ]:          0 :   GfxPreview::draw_line( point1, point3, color );
     171                 :            :   
     172                 :          0 :   return;
     173                 :            : }
     174                 :            : 
     175                 :          0 : CubitVector SurfaceOverlapFacet::centroid()
     176                 :            : {
     177                 :            : 
     178         [ #  # ]:          0 :   CubitVector point1 = CubitVector( t.b.x, t.b.y, t.b.z );    
     179                 :            :   CubitVector point2 = CubitVector( t.e0.x + t.b.x, 
     180                 :            :                                     t.e0.y + t.b.y, 
     181         [ #  # ]:          0 :                                     t.e0.z + t.b.z );    
     182                 :            :   CubitVector point3 = CubitVector( t.e1.x + t.b.x, 
     183                 :            :                                     t.e1.y + t.b.y, 
     184         [ #  # ]:          0 :                                     t.e1.z + t.b.z );    
     185                 :            : 
     186         [ #  # ]:          0 :   point1 += point2;
     187         [ #  # ]:          0 :   point1 += point3;
     188         [ #  # ]:          0 :   point1 /= 3;
     189                 :            :   
     190                 :          0 :   return point1;
     191                 :            : }
     192                 :            : 
     193                 :          0 : CubitVector SurfaceOverlapFacet::smallest_edge_midpoint()
     194                 :            : {
     195         [ #  # ]:          0 :   CubitVector point1 = CubitVector( t.b.x, t.b.y, t.b.z );    
     196                 :            :   CubitVector point2 = CubitVector( t.e0.x + t.b.x, 
     197                 :            :                                     t.e0.y + t.b.y, 
     198         [ #  # ]:          0 :                                     t.e0.z + t.b.z );    
     199                 :            :   CubitVector point3 = CubitVector( t.e1.x + t.b.x, 
     200                 :            :                                     t.e1.y + t.b.y, 
     201         [ #  # ]:          0 :                                     t.e1.z + t.b.z );    
     202                 :            :   
     203         [ #  # ]:          0 :   double len_12 = point1.distance_between( point2 );
     204         [ #  # ]:          0 :   double len_23 = point2.distance_between( point3 );
     205         [ #  # ]:          0 :   double len_13 = point1.distance_between( point3 );
     206                 :            : 
     207 [ #  # ][ #  # ]:          0 :   if( (len_12 < len_23) && (len_12 < len_13) )
     208                 :            :   {
     209         [ #  # ]:          0 :     point1 += point2;
     210         [ #  # ]:          0 :     point1 /= 2;
     211         [ #  # ]:          0 :     return point1;
     212                 :            :   }
     213         [ #  # ]:          0 :   else if( len_23 < len_13 )
     214                 :            :   {
     215         [ #  # ]:          0 :     point2 += point3;
     216         [ #  # ]:          0 :     point2 /= 2;
     217         [ #  # ]:          0 :     return point2;
     218                 :            :   }
     219                 :            :   else
     220                 :            :   {
     221         [ #  # ]:          0 :     point1 += point3;
     222         [ #  # ]:          0 :     point1 /= 2;
     223         [ #  # ]:          0 :     return point1;
     224                 :            :   }
     225 [ +  - ][ +  - ]:       6540 : }

Generated by: LCOV version 1.11