LCOV - code coverage report
Current view: top level - geom - CurveOverlapFacet.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 1 110 0.9 %
Date: 2020-06-30 00:58:45 Functions: 2 11 18.2 %
Branches: 2 142 1.4 %

           Branch data     Line data    Source code
       1                 :            : //- Class: CurveOverlapFacet
       2                 :            : //- Description: Facet definition class for efficient processing
       3                 :            : //-              for OverlapTool.  
       4                 :            : //- Owner: Corey Ernst 
       5                 :            : //- Created: August 11, 2005
       6                 :            : 
       7                 :            : #include "CurveOverlapFacet.hpp"
       8                 :            : #include "IntersectionTool.hpp"
       9                 :            : #include "GfxPreview.hpp"
      10                 :            : 
      11                 :            : //AnalyticGeometryTool* CurveOverlapFacet::agt = AnalyticGeometryTool::instance();
      12                 :            : 
      13                 :            : // Constructor
      14                 :          0 : CurveOverlapFacet::CurveOverlapFacet( GPoint p[2] )
      15                 :            : {
      16         [ #  # ]:          0 :   p0.set( p[0].x, p[0].y, p[0].z);
      17         [ #  # ]:          0 :   p1.set( p[1].x, p[1].y, p[1].z);
      18                 :            : 
      19         [ #  # ]:          0 :   CubitVector min;
      20                 :          0 :   min.set( CUBIT_MIN( p[0].x, p[1].x ),
      21                 :          0 :            CUBIT_MIN( p[0].y, p[1].y ),
      22 [ #  # ][ #  # ]:          0 :            CUBIT_MIN( p[0].z, p[1].z ) );
         [ #  # ][ #  # ]
      23                 :            :   
      24         [ #  # ]:          0 :   CubitVector max;
      25                 :          0 :   max.set( CUBIT_MAX( p[0].x, p[1].x ),
      26                 :          0 :            CUBIT_MAX( p[0].y, p[1].y ),
      27 [ #  # ][ #  # ]:          0 :            CUBIT_MAX( p[0].z, p[1].z ) );
         [ #  # ][ #  # ]
      28                 :            :   
      29         [ #  # ]:          0 :   boundingBox.reset( min, max );
      30                 :            : 
      31                 :          0 :   facetLength = 0.0;
      32                 :          0 : }
      33                 :            : 
      34                 :            : // Destructor
      35                 :          0 : CurveOverlapFacet::~CurveOverlapFacet()
      36                 :            : {
      37                 :          0 : }
      38                 :            : 
      39                 :          0 : double CurveOverlapFacet::distance_overlapping( CurveOverlapFacet *other_facet )
      40                 :            : {
      41                 :            :   //determine which is the smaller facet
      42                 :            :   CurveOverlapFacet *short_facet, *long_facet;
      43 [ #  # ][ #  # ]:          0 :   if( this->length() < other_facet->length() )
                 [ #  # ]
      44                 :            :   {
      45                 :          0 :     short_facet = this;
      46                 :          0 :     long_facet = other_facet;
      47                 :            :   }
      48                 :            :   else
      49                 :            :   {
      50                 :          0 :     short_facet = other_facet;
      51                 :          0 :     long_facet = this;
      52                 :            :   }
      53                 :            : 
      54         [ #  # ]:          0 :   CubitVector long_facet_vector(long_facet->p1 - long_facet->p0);
      55         [ #  # ]:          0 :   double long_facet_length = long_facet_vector.length();
      56         [ #  # ]:          0 :   long_facet_vector.normalize();
      57                 :            :   
      58         [ #  # ]:          0 :   CubitVector l_p0_to_s_p0( short_facet->p0 - long_facet->p0 );   
      59         [ #  # ]:          0 :   CubitVector l_p0_to_s_p1( short_facet->p1 - long_facet->p0 );   
      60                 :            : 
      61         [ #  # ]:          0 :   double dot_to_s_p0 = l_p0_to_s_p0 % long_facet_vector; 
      62         [ #  # ]:          0 :   double dot_to_s_p1 = l_p0_to_s_p1 % long_facet_vector; 
      63                 :            : 
      64                 :            :   //no overlap
      65 [ #  # ][ #  # ]:          0 :   if( ( dot_to_s_p0 <= 0.0 && dot_to_s_p1 <= 0.0) || 
                 [ #  # ]
      66         [ #  # ]:          0 :       ( dot_to_s_p0 >= long_facet_length  && 
      67                 :            :         dot_to_s_p1 >= long_facet_length ) )
      68                 :            :   {
      69                 :          0 :     return 0.0;
      70                 :            :   }
      71                 :            : 
      72                 :            :   //overlap like this:
      73                 :            :   // o-----------o
      74                 :            :   //        o---------------------o           
      75 [ #  # ][ #  # ]:          0 :   if(  dot_to_s_p0 > 0.0 && dot_to_s_p1 < 0.0 ) 
      76                 :          0 :     return dot_to_s_p0;
      77 [ #  # ][ #  # ]:          0 :   if( dot_to_s_p1 > 0.0 && dot_to_s_p0 < 0.0 ) 
      78                 :          0 :     return dot_to_s_p1;
      79 [ #  # ][ #  # ]:          0 :   if( dot_to_s_p0 > long_facet_length &&
      80                 :            :       dot_to_s_p1 < long_facet_length )
      81                 :          0 :     return long_facet_length - dot_to_s_p1;
      82 [ #  # ][ #  # ]:          0 :   if( dot_to_s_p1 > long_facet_length &&
      83                 :            :       dot_to_s_p0 < long_facet_length )
      84                 :          0 :     return long_facet_length - dot_to_s_p0;
      85                 :            :    
      86                 :            : 
      87                 :            :   //overlap like this 
      88                 :            :   // o-----------o
      89                 :            :   // o---------------------o           
      90                 :            :   // or this:
      91                 :            :   //    o-----------o
      92                 :            :   // o---------------------o           
      93                 :            :   // or this:
      94                 :            :   // o---------------------o           
      95                 :            :   // o---------------------o           
      96 [ #  # ][ #  # ]:          0 :   if( (dot_to_s_p0 <= long_facet_length &&
      97         [ #  # ]:          0 :        dot_to_s_p1 < long_facet_length ) || 
      98         [ #  # ]:          0 :       (dot_to_s_p1 <= long_facet_length &&
      99                 :            :        dot_to_s_p0 < long_facet_length ) ) 
     100                 :          0 :     return fabs( dot_to_s_p0 - dot_to_s_p1 );
     101                 :            : 
     102                 :          0 :   return 0.0;
     103                 :            : 
     104                 :            : /*
     105                 :            :   //create vectors
     106                 :            :   CubitVector v0( long_facet->p1 - long_facet->p0 ); 
     107                 :            :   CubitVector v1( short_facet->p0 - long_facet->p0 ); 
     108                 :            :   CubitVector v2( short_facet->p1 - long_facet->p0 ); 
     109                 :            :   CubitVector normalized_v0 = v0;
     110                 :            :   normalized_v0.normalize();
     111                 :            :   
     112                 :            :   //project v1 and v2 onto v0
     113                 :            :   double dot1 = normalized_v0 % v1; 
     114                 :            :   double dot2 = normalized_v0 % v2; 
     115                 :            :   v1 = normalized_v0 * dot1;
     116                 :            :   v2 = normalized_v0 * dot2;
     117                 :            :   double length0 = v0.length();
     118                 :            :   double length1 = v1.length();
     119                 :            :   double length2 = v2.length();
     120                 :            : 
     121                 :            :   //no overlap at all
     122                 :            :   if( (length1 > long_facet->length() && length2 > long_facet->length() ) ||
     123                 :            :       (dot1 <= 0 && dot2 <= 0 ) )
     124                 :            :   {
     125                 :            :     return 0.0;
     126                 :            :   }
     127                 :            :   else if( dot1 <= 0 && dot2 > 0 )
     128                 :            :   {
     129                 :            :     return length2; 
     130                 :            :   }
     131                 :            :   else if( length2 <= 0 && length1 > 0 )
     132                 :            :   {
     133                 :            :     return length1; 
     134                 :            :   }
     135                 :            :   else if( length1 > length0 )
     136                 :            :   {
     137                 :            :     return length0 - length2;
     138                 :            :   }
     139                 :            :   else if( length2 > length0 )
     140                 :            :   {
     141                 :            :     return length0 - length1;
     142                 :            :   }
     143                 :            :   //else
     144                 :            :     return fabs( length2 - length1 );
     145                 :            : */
     146                 :            : /*
     147                 :            :   CubitVector tmp_vec1( p0.x, p0.y, p0.z);
     148                 :            :   CubitVector tmp_vec2( p1.x, p1.y, p1.z);
     149                 :            : 
     150                 :            :   CubitVector tmp_vec3( other_facet->p0.x, other_facet->p0.y, other_facet->p0.z);
     151                 :            :   CubitVector tmp_vec4( other_facet->p1.x, other_facet->p1.y, other_facet->p1.z);
     152                 :            : 
     153                 :            : 
     154                 :            :   IntersectionTool int_tool( GEOMETRY_RESABS );
     155                 :            :  
     156                 :            :   CubitVector closest_point_seg_1;
     157                 :            :   CubitVector closest_point_seg_2;
     158                 :            :   double sc, tc;
     159                 :            :   CubitStatus stat = int_tool.closest_points_on_segments( p0, p1, 
     160                 :            :                             other_facet->p0, other_facet->p1,
     161                 :            :                             closest_point_seg_1, closest_point_seg_2,
     162                 :            :                             sc, tc );
     163                 :            :   //Make sure the closest points aren't the end points.  If they are
     164                 :            :   //and we are within tolerance, it may be that the tolerance is too big
     165                 :            :   //cause we shouldn't be at a cross if the closest point is an end point...
     166                 :            :   if ( sc > 0. && sc < 1. && tc > 0. && tc < 1. &&
     167                 :            :        closest_point_seg_1.within_tolerance(closest_point_seg_2, 0.001) )
     168                 :            :   {
     169                 :            :     
     170                 :            : 
     171                 :            : 
     172                 :            :   }
     173                 :            :   return 0.0;
     174                 :            :   */
     175                 :            : }
     176                 :            : 
     177                 :          0 : double CurveOverlapFacet::angle( CurveOverlapFacet *other_facet )
     178                 :            : {
     179         [ #  # ]:          0 :   CubitVector vec1 = p1 - p0;
     180         [ #  # ]:          0 :   CubitVector vec2 = other_facet->p1 - other_facet->p0;
     181                 :            : 
     182         [ #  # ]:          0 :   double angle = vec1.interior_angle( vec2 );
     183                 :          0 :   return angle;
     184                 :            : }
     185                 :            : 
     186                 :          0 : double CurveOverlapFacet::length()
     187                 :            : {
     188         [ #  # ]:          0 :   if( facetLength == 0.0 )
     189                 :            :   {
     190         [ #  # ]:          0 :     CubitVector tmp_vec = p1 - p0;
     191         [ #  # ]:          0 :     facetLength = tmp_vec.length();
     192                 :            :   }
     193                 :          0 :   return facetLength;
     194                 :            : }
     195                 :            : 
     196                 :          0 : double CurveOverlapFacet::facet_to_facet_distance( CurveOverlapFacet *other_facet )
     197                 :            : {
     198         [ #  # ]:          0 :   CubitVector u = p1 - p0;
     199         [ #  # ]:          0 :   CubitVector v = other_facet->p1 - other_facet->p0;
     200         [ #  # ]:          0 :   CubitVector w = p0 - other_facet->p0;
     201         [ #  # ]:          0 :   double a = u%u;
     202         [ #  # ]:          0 :   double b = u%v;
     203         [ #  # ]:          0 :   double c = v%v;
     204         [ #  # ]:          0 :   double d = u%w;
     205         [ #  # ]:          0 :   double e = v%w;
     206                 :          0 :   double D = a*c - b*b;
     207                 :          0 :   double sc, sN, sD = D;
     208                 :          0 :   double tc, tN, tD = D;
     209                 :            : 
     210                 :            :   // compute the line parameters of the two closest points
     211         [ #  # ]:          0 :   if( D < GEOMETRY_RESABS )  ///the lines are almost parallel
     212                 :            :   {
     213                 :          0 :     sN = 0.0;        // force using point P0 on segment S1
     214                 :          0 :     sD = 1.0;        // to prevent possible division by 0.0 later
     215                 :          0 :     tN = e;
     216                 :          0 :     tD = c;
     217                 :            :   }
     218                 :            :   else // get the closest points on the infinite lines
     219                 :            :   {
     220                 :          0 :     sN = (b*e - c*d);
     221                 :          0 :     tN = (a*e - b*d);
     222         [ #  # ]:          0 :     if (sN < 0.0) 
     223                 :            :     {       // sc < 0 => the s=0 edge is visible
     224                 :          0 :       sN = 0.0;
     225                 :          0 :       tN = e;
     226                 :          0 :       tD = c;
     227                 :            :     }
     228         [ #  # ]:          0 :     else if (sN > sD) 
     229                 :            :     {  // sc > 1 => the s=1 edge is visible
     230                 :          0 :       sN = sD;
     231                 :          0 :       tN = e + b;
     232                 :          0 :       tD = c;
     233                 :            :     }
     234                 :            :   }
     235                 :            : 
     236         [ #  # ]:          0 :   if (tN < 0.0) 
     237                 :            :   {           // tc < 0 => the t=0 edge is visible
     238                 :          0 :     tN = 0.0;
     239                 :            :     // recompute sc for this edge
     240         [ #  # ]:          0 :     if (-d < 0.0)
     241                 :          0 :       sN = 0.0;
     242         [ #  # ]:          0 :     else if (-d > a)
     243                 :          0 :       sN = sD;
     244                 :            :     else 
     245                 :            :     {
     246                 :          0 :       sN = -d;
     247                 :          0 :       sD = a;
     248                 :            :     }
     249                 :            :   }
     250         [ #  # ]:          0 :   else if (tN > tD) 
     251                 :            :   {      // tc > 1 => the t=1 edge is visible
     252                 :          0 :     tN = tD;
     253                 :            :     // recompute sc for this edge
     254         [ #  # ]:          0 :     if ((-d + b) < 0.0)
     255                 :          0 :       sN = 0;
     256         [ #  # ]:          0 :     else if ((-d + b) > a)
     257                 :          0 :       sN = sD;
     258                 :            :     else 
     259                 :            :     {
     260                 :          0 :       sN = (-d + b);
     261                 :          0 :       sD = a;
     262                 :            :     }
     263                 :            :   }
     264                 :            : 
     265                 :            :   // finally do the division to get sc and tc
     266         [ #  # ]:          0 :   sc = (fabs(sN) < GEOMETRY_RESABS ? 0.0 : sN / sD);
     267         [ #  # ]:          0 :   tc = (fabs(tN) < GEOMETRY_RESABS ? 0.0 : tN / tD);
     268                 :            : 
     269                 :            :   // get the difference of the two closest points
     270 [ #  # ][ #  # ]:          0 :   CubitVector   dP = w + (sc * u) - (tc * v);  // = S1(sc) - S2(tc)
         [ #  # ][ #  # ]
     271                 :            : 
     272         [ #  # ]:          0 :   return dP.length();   // return the closest distance
     273                 :            : }
     274                 :            : 
     275                 :          0 : void CurveOverlapFacet::draw( int color ) 
     276                 :            : {
     277                 :          0 :   GfxPreview::draw_line( p0, p1, color );
     278                 :          0 :   return;
     279                 :            : }
     280                 :            : 
     281                 :          0 : CubitVector CurveOverlapFacet::start_point()
     282                 :            : {
     283                 :          0 :   return p0; 
     284                 :            : }
     285                 :            : 
     286                 :          0 : CubitVector CurveOverlapFacet::end_point()
     287                 :            : {
     288                 :          0 :   return p1; 
     289 [ +  - ][ +  - ]:       6540 : }
     290                 :            : 

Generated by: LCOV version 1.11