LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/dxf - ogrdxf_polyline_smooth.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 41 41 100.0 %
Date: 2024-11-21 22:18:42 Functions: 12 12 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  * File:   ogrdxf_polyline_smooth.h
       3             :  *
       4             :  * Project:  Interpolation support for smooth POLYLINE and LWPOLYLINE entities.
       5             :  * Purpose:  Definition of classes for OGR .dxf driver.
       6             :  * Author:   TJ Snider, timsn@thtree.com
       7             :  *           Ray Gardener, Daylon Graphics Ltd.
       8             :  *
       9             :  ******************************************************************************
      10             :  * Copyright (c) 2010 Daylon Graphics Ltd.
      11             :  *
      12             :  * SPDX-License-Identifier: MIT
      13             :  ****************************************************************************/
      14             : 
      15             : #ifndef OGRDXF_SMOOTH_POLYLINE_H_INCLUDED
      16             : #define OGRDXF_SMOOTH_POLYLINE_H_INCLUDED
      17             : 
      18             : #include "ogrsf_frmts.h"
      19             : #include "cpl_conv.h"
      20             : #include <vector>
      21             : #include "assert.h"
      22             : 
      23             : class DXFSmoothPolylineVertex
      24             : {
      25             :   public:
      26             :     double x;
      27             :     double y;
      28             :     double z;
      29             :     double bulge;
      30             : 
      31          72 :     DXFSmoothPolylineVertex()
      32          72 :     {
      33          72 :         x = y = z = bulge = 0.0;
      34          72 :     }
      35             : 
      36         279 :     DXFSmoothPolylineVertex(double dfX, double dfY, double dfZ, double dfBulge)
      37         279 :     {
      38         279 :         set(dfX, dfY, dfZ, dfBulge);
      39         279 :     }
      40             : 
      41         279 :     void set(double dfX, double dfY, double dfZ, double dfBulge)
      42             :     {
      43         279 :         x = dfX;
      44         279 :         y = dfY;
      45         279 :         z = dfZ;
      46         279 :         bulge = dfBulge;
      47         279 :     }
      48             : 
      49             :     void scale(double s)
      50             :     {
      51             :         x *= s;
      52             :         y *= s;
      53             :     }
      54             : 
      55          18 :     double length() const
      56             :     {
      57          18 :         return (sqrt(x * x + y * y));
      58             :     }
      59             : 
      60          18 :     void normalize()
      61             :     {
      62          18 :         const double len = length();
      63          18 :         assert(len != 0.0);
      64             : 
      65          18 :         x /= len;
      66          18 :         y /= len;
      67          18 :     }
      68             : 
      69          43 :     bool shares_2D_pos(const DXFSmoothPolylineVertex &v) const
      70             :     {
      71          43 :         return (x == v.x && y == v.y);
      72             :     }
      73             : };
      74             : 
      75             : // Quiet warning from gcc (possibly https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112370)
      76             : #if defined(__GNUC__) && __GNUC__ >= 13
      77             : #pragma GCC diagnostic push
      78             : #pragma GCC diagnostic ignored "-Wfree-nonheap-object"
      79             : #endif
      80             : class DXFSmoothPolyline
      81             : {
      82             :     // A DXF polyline that includes vertex bulge information.
      83             :     // Call Tessellate() to convert to an OGRGeometry.
      84             :     // We treat Z as constant over the entire string; this may
      85             :     // change in the future.
      86             : 
      87             :   private:
      88             :     std::vector<DXFSmoothPolylineVertex> m_vertices;
      89             :     mutable bool m_blinestringstarted;
      90             :     bool m_bClosed;
      91             :     int m_dim;
      92             :     bool m_bUseMaxGapWhenTessellatingArcs;
      93             : 
      94             :   public:
      95          73 :     DXFSmoothPolyline()
      96          73 :         : m_blinestringstarted(false), m_bClosed(false), m_dim(2),
      97          73 :           m_bUseMaxGapWhenTessellatingArcs(false)
      98             :     {
      99          73 :     }
     100             : 
     101             :     OGRGeometry *Tessellate(bool bAsPolygon) const;
     102             : 
     103         170 :     size_t size() const
     104             :     {
     105         170 :         return m_vertices.size();
     106             :     }
     107             : 
     108             :     void SetSize(int n)
     109             :     {
     110             :         m_vertices.reserve(n);
     111             :     }
     112             : 
     113         279 :     void AddPoint(double dfX, double dfY, double dfZ, double dfBulge)
     114             :     {
     115         279 :         m_vertices.push_back(DXFSmoothPolylineVertex(dfX, dfY, dfZ, dfBulge));
     116         279 :     }
     117             : 
     118             :     void Close();
     119             : 
     120          73 :     bool IsEmpty() const
     121             :     {
     122          73 :         return m_vertices.empty();
     123             :     }
     124             : 
     125         139 :     void setCoordinateDimension(int n)
     126             :     {
     127         139 :         m_dim = n;
     128         139 :     }
     129             : 
     130          72 :     void SetUseMaxGapWhenTessellatingArcs(bool bVal)
     131             :     {
     132          72 :         m_bUseMaxGapWhenTessellatingArcs = bVal;
     133          72 :     }
     134             : 
     135             :   private:
     136             :     void EmitArc(const DXFSmoothPolylineVertex &,
     137             :                  const DXFSmoothPolylineVertex &, double radius, double len,
     138             :                  double saggita, OGRLineString *, double dfZ = 0.0) const;
     139             : 
     140             :     void EmitLine(const DXFSmoothPolylineVertex &,
     141             :                   const DXFSmoothPolylineVertex &, OGRLineString *) const;
     142             : };
     143             : #if defined(__GNUC__) && __GNUC__ >= 13
     144             : #pragma GCC diagnostic pop
     145             : #endif
     146             : 
     147             : #endif /* OGRDXF_SMOOTH_POLYLINE_H_INCLUDED */

Generated by: LCOV version 1.14