Skip to content

File connection.h

File List > algorithm > connection.h

Go to the documentation of this file

// Copyright (c) 2012-2013, IGN France.
// Copyright (c) 2012-2022, Oslandia.
// SPDX-License-Identifier: LGPL-2.0-or-later

#ifndef _SFCGAL_GRAPH_ISCONNECTED_H_
#define _SFCGAL_GRAPH_ISCONNECTED_H_

#include "SFCGAL/Coordinate.h"
#include "SFCGAL/Geometry.h"
#include "SFCGAL/Validity.h"
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/connected_components.hpp>
#include <boost/noncopyable.hpp>
#include <map>

namespace SFCGAL {
namespace algorithm {

class SFCGAL_API SurfaceGraph : boost::noncopyable {
public:
  typedef size_t                            VertexIndex;
  typedef size_t                            FaceIndex;
  typedef std::map<Coordinate, VertexIndex> CoordinateMap;
  static const size_t                       INVALID_INDEX;
  // an edge is inserted with vtx ordered by the first polygon we treat,
  // we search the edge with reverse ordered vtx indexes.
  // as a result, an inconsistent orientation between polygons can be spotted by
  // finding the edge in the same order
  // note that this situation may be caused if a face is duplicated
  typedef std::map<std::pair<VertexIndex, VertexIndex>,
                   std::pair<FaceIndex, FaceIndex>>
      EdgeMap;
  typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS>
      FaceGraph;
  /*
   * Construct from PolyHedralSurface
   * @throw Exception if surface is not connected
   */
  SurfaceGraph(const PolyhedralSurface &s);

  /*
   * Construct from TriangulatedSurface
   * @throw Exception if surface is not connected
   */
  SurfaceGraph(const TriangulatedSurface &tin);

  const EdgeMap &
  edgeMap() const
  {
    return _edgeMap;
  }
  const FaceGraph &
  faceGraph() const
  {
    return _graph;
  }
  // const CoordinateMap & coordMap() const { return _coordinateMap ; }
  const Validity
  isValid() const
  {
    return _isValid;
  }

private:
  CoordinateMap _coordinateMap;
  EdgeMap       _edgeMap;
  FaceGraph     _graph;
  VertexIndex   _numVertices;

  Validity _isValid;

  void
  addRing(const LineString &ring, FaceIndex faceIndex); // helper for ctor
};

SFCGAL_API bool
isConnected(const SurfaceGraph &graph);

SFCGAL_API bool
isClosed(const SurfaceGraph &graph);

} // namespace algorithm
} // namespace SFCGAL
#endif