mirror of https://github.com/CGAL/cgal
Add Delaunay and Delaunay_with_circumcenter_2 face bases
This commit is contained in:
parent
52842e68d1
commit
8b1052dee9
|
|
@ -0,0 +1,78 @@
|
|||
// Copyright (c) 2025 GeometryFactory (France)
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org).
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
//
|
||||
// Author(s) : Mael Rouxel-Labbé
|
||||
|
||||
#ifndef CGAL_DELAUNAY_TRIANGULATION_FACE_BASE_2_H
|
||||
#define CGAL_DELAUNAY_TRIANGULATION_FACE_BASE_2_H
|
||||
|
||||
#include <CGAL/license/Triangulation_2.h>
|
||||
|
||||
#include <CGAL/config.h>
|
||||
#include <CGAL/assertions.h>
|
||||
#include <CGAL/Triangulation_face_base_2.h>
|
||||
|
||||
namespace CGAL {
|
||||
|
||||
template < typename Gt, typename Fb = Triangulation_face_base_2<Gt> >
|
||||
class Delaunay_triangulation_face_base_2
|
||||
: public Fb
|
||||
{
|
||||
public:
|
||||
typedef Gt Geom_traits;
|
||||
typedef typename Fb::Vertex_handle Vertex_handle;
|
||||
typedef typename Fb::Face_handle Face_handle;
|
||||
|
||||
typedef typename Geom_traits::Point_2 Point_2;
|
||||
typedef typename Geom_traits::Point_2 Point;
|
||||
|
||||
template < typename TDS2 >
|
||||
struct Rebind_TDS {
|
||||
typedef typename Fb::template Rebind_TDS<TDS2>::Other Fb2;
|
||||
typedef Delaunay_triangulation_face_base_2<Gt, Fb2> Other;
|
||||
};
|
||||
|
||||
public:
|
||||
Delaunay_triangulation_face_base_2()
|
||||
: Fb() {}
|
||||
|
||||
Delaunay_triangulation_face_base_2(Vertex_handle v0,
|
||||
Vertex_handle v1,
|
||||
Vertex_handle v2)
|
||||
: Fb(v0,v1,v2) {}
|
||||
|
||||
Delaunay_triangulation_face_base_2(Vertex_handle v0,
|
||||
Vertex_handle v1,
|
||||
Vertex_handle v2,
|
||||
Face_handle n0,
|
||||
Face_handle n1,
|
||||
Face_handle n2)
|
||||
: Fb(v0,v1,v2,n0,n1,n2) {}
|
||||
|
||||
static int ccw(int i) {return Triangulation_cw_ccw_2::ccw(i);}
|
||||
static int cw(int i) {return Triangulation_cw_ccw_2::cw(i);}
|
||||
|
||||
template <typename GT_>
|
||||
Point_2 circumcenter(const GT_& gt) const
|
||||
{
|
||||
return gt.construct_circumcenter_2_object()(this->vertex(0)->point(),
|
||||
this->vertex(1)->point(),
|
||||
this->vertex(2)->point());
|
||||
}
|
||||
|
||||
Point_2 circumcenter() const
|
||||
{
|
||||
return circumcenter(Geom_traits());
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace CGAL
|
||||
|
||||
#endif // CGAL_DELAUNAY_TRIANGULATION_FACE_BASE_2_H
|
||||
|
|
@ -0,0 +1,149 @@
|
|||
// Copyright (c) 1999-2006 INRIA Sophia-Antipolis (France).
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org).
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
// Author(s) : Monique Teillaud <Monique.Teillaud@sophia.inria.fr>
|
||||
// Sylvain Pion
|
||||
|
||||
// face of a triangulation of any dimension <=2,
|
||||
// storing its circumcenter lazily.
|
||||
|
||||
#ifndef CGAL_DELAUNAY_TRIANGULATION_FACE_BASE_WITH_CIRCUMCENTER_2_H
|
||||
#define CGAL_DELAUNAY_TRIANGULATION_FACE_BASE_WITH_CIRCUMCENTER_2_H
|
||||
|
||||
#include <CGAL/license/Triangulation_2.h>
|
||||
|
||||
#include <CGAL/basic.h>
|
||||
#include <CGAL/assertions.h>
|
||||
#include <CGAL/Delaunay_triangulation_face_base_2.h>
|
||||
|
||||
namespace CGAL {
|
||||
|
||||
template < typename GT, typename Fb = Delaunay_triangulation_face_base_2<GT> >
|
||||
class Delaunay_triangulation_face_base_with_circumcenter_2
|
||||
: public Fb
|
||||
{
|
||||
typedef typename GT::Point_2 Point;
|
||||
|
||||
mutable Point * circumcenter_;
|
||||
|
||||
public:
|
||||
void invalidate_circumcenter()
|
||||
{
|
||||
if (circumcenter_) {
|
||||
delete circumcenter_;
|
||||
circumcenter_ = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
typedef typename Fb::Vertex_handle Vertex_handle;
|
||||
typedef typename Fb::Face_handle Face_handle;
|
||||
|
||||
typedef GT Geom_traits;
|
||||
|
||||
template < typename TDS2 >
|
||||
struct Rebind_TDS {
|
||||
typedef typename Fb::template Rebind_TDS<TDS2>::Other Fb2;
|
||||
typedef Delaunay_triangulation_face_base_with_circumcenter_2<GT, Fb2> Other;
|
||||
};
|
||||
|
||||
Delaunay_triangulation_face_base_with_circumcenter_2()
|
||||
: Fb(), circumcenter_(nullptr) {}
|
||||
|
||||
Delaunay_triangulation_face_base_with_circumcenter_2
|
||||
(const Delaunay_triangulation_face_base_with_circumcenter_2 &c)
|
||||
: Fb(c), circumcenter_(c.circumcenter_ != nullptr ? new Point(*(c.circumcenter_)) : nullptr)
|
||||
{}
|
||||
|
||||
Delaunay_triangulation_face_base_with_circumcenter_2
|
||||
(Delaunay_triangulation_face_base_with_circumcenter_2 &&c)
|
||||
: Fb(std::move(c)), circumcenter_(std::exchange(c.circumcenter_, nullptr))
|
||||
{
|
||||
}
|
||||
|
||||
Delaunay_triangulation_face_base_with_circumcenter_2&
|
||||
operator=(const Delaunay_triangulation_face_base_with_circumcenter_2 &c)
|
||||
{
|
||||
Delaunay_triangulation_face_base_with_circumcenter_2 tmp=c;
|
||||
std::swap(tmp, *this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Delaunay_triangulation_face_base_with_circumcenter_2&
|
||||
operator=(Delaunay_triangulation_face_base_with_circumcenter_2 &&c)
|
||||
{
|
||||
Fb::operator=(std::move(c));
|
||||
circumcenter_ = std::exchange(c.circumcenter_, nullptr);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Delaunay_triangulation_face_base_with_circumcenter_2(
|
||||
Vertex_handle v0, Vertex_handle v1,
|
||||
Vertex_handle v2)
|
||||
: Fb(v0, v1, v2), circumcenter_(nullptr) {}
|
||||
|
||||
Delaunay_triangulation_face_base_with_circumcenter_2(
|
||||
Vertex_handle v0, Vertex_handle v1,
|
||||
Vertex_handle v2,
|
||||
Face_handle n0, Face_handle n1,
|
||||
Face_handle n2)
|
||||
: Fb(v0, v1, v2, n0, n1, n2), circumcenter_(nullptr) {}
|
||||
|
||||
~Delaunay_triangulation_face_base_with_circumcenter_2()
|
||||
{
|
||||
delete circumcenter_;
|
||||
}
|
||||
|
||||
// We must override the functions that modify the vertices.
|
||||
// And if the point inside a vertex is modified, we fail,
|
||||
// but there's not much we can do for this now.
|
||||
void set_vertex(int i, Vertex_handle v)
|
||||
{
|
||||
invalidate_circumcenter();
|
||||
Fb::set_vertex(i, v);
|
||||
}
|
||||
|
||||
void set_vertices()
|
||||
{
|
||||
invalidate_circumcenter();
|
||||
Fb::set_vertices();
|
||||
}
|
||||
|
||||
void set_vertices(Vertex_handle v0, Vertex_handle v1,
|
||||
Vertex_handle v2)
|
||||
{
|
||||
invalidate_circumcenter();
|
||||
Fb::set_vertices(v0, v1, v2);
|
||||
}
|
||||
|
||||
void set_circumcenter(const Point& p) const
|
||||
{
|
||||
if (circumcenter_ == nullptr) {
|
||||
circumcenter_ = new Point(p);
|
||||
} else {
|
||||
*circumcenter_ = p;
|
||||
}
|
||||
}
|
||||
|
||||
const Point& circumcenter(const Geom_traits& gt = Geom_traits()) const
|
||||
{
|
||||
if (circumcenter_ == nullptr) {
|
||||
circumcenter_ = new Point(this->Fb::circumcenter(gt));
|
||||
} else {
|
||||
CGAL_expensive_assertion(
|
||||
this->Fb::circumcenter(gt) == *circumcenter_);
|
||||
}
|
||||
|
||||
return *circumcenter_;
|
||||
}
|
||||
};
|
||||
|
||||
} //namespace CGAL
|
||||
|
||||
#endif // CGAL_DELAUNAY_TRIANGULATION_FACE_BASE_WITH_CIRCUMCENTER_2_H
|
||||
Loading…
Reference in New Issue