Skip to content

File Triangle.h

File List > src > Triangle.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_TRIANGLE_H_
#define _SFCGAL_TRIANGLE_H_

#include <boost/shared_ptr.hpp>

#include <boost/serialization/base_object.hpp>

#include "SFCGAL/Point.h"
#include "SFCGAL/Surface.h"
#include "SFCGAL/detail/TypeForDimension.h"

#include <CGAL/Triangle_2.h>
#include <CGAL/Triangle_3.h>

namespace SFCGAL {

class SFCGAL_API Triangle : public Surface {
public:
  Triangle();
  Triangle(const Kernel::Triangle_2 &triangle);
  Triangle(const Kernel::Triangle_3 &triangle);
  Triangle(const Point &p, const Point &q, const Point &r);
  Triangle(const Triangle &other);
  Triangle &
  operator=(const Triangle &other);
  ~Triangle();

  //-- SFCGAL::Geometry
  virtual Triangle *
  clone() const;

  //-- SFCGAL::Geometry
  virtual std::string
  geometryType() const;
  //-- SFCGAL::Geometry
  virtual GeometryType
  geometryTypeId() const;
  //-- SFCGAL::Geometry
  virtual int
  coordinateDimension() const;
  //-- SFCGAL::Geometry
  virtual bool
  isEmpty() const;
  //-- SFCGAL::Geometry
  virtual bool
  is3D() const;
  //-- SFCGAL::Geometry
  virtual bool
  isMeasured() const;

  void
  reverse();

  Polygon
  toPolygon() const;

  inline const Point &
  vertex(const int &i) const
  {
    return _vertices[i % 3];
  }
  inline Point &
  vertex(const int &i)
  {
    return _vertices[i % 3];
  }

  inline Kernel::Triangle_2
  toTriangle_2() const
  {
    return Kernel::Triangle_2(vertex(0).toPoint_2(), vertex(1).toPoint_2(),
                              vertex(2).toPoint_2());
  }

  inline Kernel::Triangle_3
  toTriangle_3() const
  {
    return Kernel::Triangle_3(vertex(0).toPoint_3(), vertex(1).toPoint_3(),
                              vertex(2).toPoint_3());
  }

  template <int D>
  inline typename detail::TypeForDimension<D>::Triangle
  toTriangle_d() const
  {
    return typename detail::TypeForDimension<D>::Triangle(
        vertex(0).toPoint_d<D>(), vertex(1).toPoint_d<D>(),
        vertex(2).toPoint_d<D>());
  }

  //-- visitors

  //-- SFCGAL::Geometry
  virtual void
  accept(GeometryVisitor &visitor);
  //-- SFCGAL::Geometry
  virtual void
  accept(ConstGeometryVisitor &visitor) const;

  template <class Archive>
  void
  serialize(Archive &ar, const unsigned int /*version*/)
  {
    ar &boost::serialization::base_object<Geometry>(*this);
    ar &_vertices[0] & _vertices[1] & _vertices[2];
  }

private:
  Point _vertices[3];
};

} // namespace SFCGAL

#endif