LCOV - code coverage report
Current view: top level - src/point - GeometryOperation.cpp (source / functions) Hit Total Coverage
Test: ad_map_access Lines: 65 67 97.0 %
Date: 2022-10-04 09:48:07 Functions: 12 12 100.0 %
Branches: 60 90 66.7 %

           Branch data     Line data    Source code
       1                 :            : // ----------------- BEGIN LICENSE BLOCK ---------------------------------
       2                 :            : //
       3                 :            : // Copyright (C) 2018-2021 Intel Corporation
       4                 :            : //
       5                 :            : // SPDX-License-Identifier: MIT
       6                 :            : //
       7                 :            : // ----------------- END LICENSE BLOCK -----------------------------------
       8                 :            : 
       9                 :            : #include "ad/map/point/GeometryOperation.hpp"
      10                 :            : 
      11                 :            : #include <algorithm>
      12                 :            : #include "ad/map/access/Logging.hpp"
      13                 :            : #include "ad/map/access/Operation.hpp"
      14                 :            : #include "ad/map/point/Operation.hpp"
      15                 :            : 
      16                 :            : namespace ad {
      17                 :            : namespace map {
      18                 :            : namespace point {
      19                 :            : 
      20                 :      47709 : Geometry createGeometry(const ECEFEdge &points, bool closed)
      21                 :            : {
      22                 :      47709 :   Geometry geometry;
      23                 :      47709 :   geometry.isClosed = closed;
      24         [ +  - ]:      47709 :   geometry.ecefEdge = points;
      25                 :      47709 :   geometry.private_enuEdgeCache.enuVersion = 0;
      26   [ +  +  +  -  :      47709 :   geometry.isValid = (points.size() >= 2) && isValid(points);
                   +  - ]
      27         [ +  - ]:      47709 :   geometry.length = calcLength(points);
      28                 :      47709 :   return geometry;
      29                 :            : }
      30                 :            : 
      31                 :         24 : ENUEdge getCachedENUEdge(Geometry const &geometry)
      32                 :            : {
      33         [ +  - ]:         48 :   auto coordinateTransform = access::getCoordinateTransform();
      34                 :         24 :   ENUEdgeCache &mutable_enuEdgeCache = const_cast<Geometry *>(&geometry)->private_enuEdgeCache;
      35   [ +  -  +  -  :         24 :   if (!coordinateTransform || geometry.private_enuEdgeCache.enuVersion != coordinateTransform->getENURef())
             +  +  +  + ]
      36                 :            :   {
      37                 :         23 :     mutable_enuEdgeCache.enuEdge.clear();
      38                 :            :   }
      39         [ +  + ]:         24 :   if (geometry.private_enuEdgeCache.enuEdge.empty())
      40                 :            :   {
      41         [ +  - ]:         23 :     if (coordinateTransform)
      42                 :            :     {
      43   [ +  -  +  - ]:         23 :       if (coordinateTransform->isENUValid())
      44                 :            :       {
      45         [ +  - ]:         23 :         mutable_enuEdgeCache.enuVersion = coordinateTransform->getENURef();
      46         [ +  - ]:         23 :         coordinateTransform->convert(geometry.ecefEdge, mutable_enuEdgeCache.enuEdge);
      47                 :            :       }
      48                 :            :       else
      49                 :            :       {
      50   [ #  #  #  # ]:          0 :         access::getLogger()->error("Geometry::GetENU: ENU Reference Point not defined.");
      51                 :            :       }
      52                 :            :     }
      53                 :            :     else
      54                 :            :     {
      55   [ #  #  #  # ]:          0 :       access::getLogger()->error("Geometry::GetENU: Coordinate transformations not defined.");
      56                 :            :     }
      57                 :            :   }
      58         [ +  - ]:         48 :   return geometry.private_enuEdgeCache.enuEdge;
      59                 :            : }
      60                 :            : 
      61                 :            : /////////////
      62                 :            : // Operations
      63                 :            : 
      64                 :         29 : bool isSuccessor(Geometry const &geometry, const Geometry &other)
      65                 :            : {
      66   [ +  +  -  +  :         29 :   if (geometry.ecefEdge.empty() || other.ecefEdge.empty())
                   +  + ]
      67                 :            :   {
      68                 :          1 :     return false;
      69                 :            :   }
      70         [ +  + ]:         28 :   else if (geometry.ecefEdge.front() == other.ecefEdge.back())
      71                 :            :   {
      72                 :          8 :     return true;
      73                 :            :   }
      74         [ +  + ]:         20 :   else if (geometry.ecefEdge.back() == other.ecefEdge.back())
      75                 :            :   {
      76                 :          7 :     return true;
      77                 :            :   }
      78                 :            :   else
      79                 :            :   {
      80                 :         13 :     return false;
      81                 :            :   }
      82                 :            : }
      83                 :            : 
      84                 :         26 : bool isPredecessor(Geometry const &geometry, const Geometry &other)
      85                 :            : {
      86   [ +  +  -  +  :         26 :   if (geometry.ecefEdge.empty() || other.ecefEdge.empty())
                   +  + ]
      87                 :            :   {
      88                 :          1 :     return false;
      89                 :            :   }
      90         [ +  + ]:         25 :   else if (geometry.ecefEdge.front() == other.ecefEdge.front())
      91                 :            :   {
      92                 :          7 :     return true;
      93                 :            :   }
      94         [ +  + ]:         18 :   else if (geometry.ecefEdge.back() == other.ecefEdge.front())
      95                 :            :   {
      96                 :          5 :     return true;
      97                 :            :   }
      98                 :            :   else
      99                 :            :   {
     100                 :         13 :     return false;
     101                 :            :   }
     102                 :            : }
     103                 :            : 
     104                 :         12 : bool haveSameStart(Geometry const &geometry, const Geometry &other)
     105                 :            : {
     106   [ +  +  -  +  :         12 :   if (geometry.ecefEdge.empty() || other.ecefEdge.empty())
                   +  + ]
     107                 :            :   {
     108                 :          1 :     return false;
     109                 :            :   }
     110                 :            :   else
     111                 :            :   {
     112                 :         11 :     return geometry.ecefEdge.front() == other.ecefEdge.front();
     113                 :            :   }
     114                 :            : }
     115                 :            : 
     116                 :          8 : bool haveSameEnd(Geometry const &geometry, const Geometry &other)
     117                 :            : {
     118   [ +  +  -  +  :          8 :   if (geometry.ecefEdge.empty() || other.ecefEdge.empty())
                   +  + ]
     119                 :            :   {
     120                 :          1 :     return false;
     121                 :            :   }
     122                 :            :   else
     123                 :            :   {
     124                 :          7 :     return geometry.ecefEdge.back() == other.ecefEdge.back();
     125                 :            :   }
     126                 :            : }
     127                 :            : 
     128                 :    1774820 : point::ECEFPoint getParametricPoint(Geometry const &geometry, const physics::ParametricValue &t)
     129                 :            : {
     130                 :    1774820 :   return point::getParametricPoint(geometry.ecefEdge, geometry.length, t);
     131                 :            : }
     132                 :            : 
     133                 :         14 : void getParametricRange(Geometry const &geometry,
     134                 :            :                         const physics::ParametricRange &trange,
     135                 :            :                         ECEFEdge &outputEdge,
     136                 :            :                         const bool revertOrder)
     137                 :            : {
     138                 :         14 :   outputEdge = point::getParametricRange(geometry.ecefEdge, geometry.length, trange);
     139         [ +  + ]:         14 :   if (revertOrder)
     140                 :            :   {
     141                 :          5 :     std::reverse(outputEdge.begin(), outputEdge.end());
     142                 :            :   }
     143                 :         14 : }
     144                 :            : 
     145                 :         10 : void getParametricRange(Geometry const &geometry,
     146                 :            :                         const physics::ParametricRange &trange,
     147                 :            :                         GeoEdge &outputEdge,
     148                 :            :                         const bool revertOrder)
     149                 :            : {
     150         [ +  - ]:         20 :   ECEFEdge const ecefEdge = point::getParametricRange(geometry.ecefEdge, geometry.length, trange);
     151         [ +  - ]:         10 :   outputEdge = toGeo(ecefEdge);
     152         [ +  + ]:         10 :   if (revertOrder)
     153                 :            :   {
     154         [ +  - ]:          3 :     std::reverse(outputEdge.begin(), outputEdge.end());
     155                 :            :   }
     156                 :         10 : }
     157                 :            : 
     158                 :         24 : void getParametricRange(Geometry const &geometry,
     159                 :            :                         const physics::ParametricRange &trange,
     160                 :            :                         ENUEdge &outputEdge,
     161                 :            :                         const bool revertOrder)
     162                 :            : {
     163         [ +  - ]:         24 :   outputEdge = point::getParametricRange(getCachedENUEdge(geometry), geometry.length, trange);
     164         [ +  + ]:         24 :   if (revertOrder)
     165                 :            :   {
     166                 :          9 :     std::reverse(outputEdge.begin(), outputEdge.end());
     167                 :            :   }
     168                 :         24 : }
     169                 :            : 
     170                 :          1 : ECEFEdge getMiddleEdge(Geometry const &geometry, Geometry const &other)
     171                 :            : {
     172                 :            :   return point::getLateralAlignmentEdge(
     173         [ +  - ]:          1 :     geometry.ecefEdge, geometry.length, other.ecefEdge, other.length, physics::ParametricValue(0.5));
     174                 :            : }
     175                 :            : 
     176                 :     952387 : physics::ParametricValue findNearestPointOnEdge(Geometry const &geometry, const point::ECEFPoint &pt)
     177                 :            : {
     178                 :     952387 :   return findNearestPointOnEdge(geometry.ecefEdge, geometry.length, pt);
     179                 :            : }
     180                 :            : 
     181                 :            : } // namespace point
     182                 :            : } // namespace map
     183                 :            : } // namespace ad

Generated by: LCOV version 1.14