From 8b1052dee9e9a3626eef19ecec2793679479f042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Sun, 20 Apr 2025 15:02:08 +0200 Subject: [PATCH] Add Delaunay and Delaunay_with_circumcenter_2 face bases --- .../CGAL/Delaunay_triangulation_face_base_2.h | 78 +++++++++ ...angulation_face_base_with_circumcenter_2.h | 149 ++++++++++++++++++ 2 files changed, 227 insertions(+) create mode 100644 Triangulation_2/include/CGAL/Delaunay_triangulation_face_base_2.h create mode 100644 Triangulation_2/include/CGAL/Delaunay_triangulation_face_base_with_circumcenter_2.h diff --git a/Triangulation_2/include/CGAL/Delaunay_triangulation_face_base_2.h b/Triangulation_2/include/CGAL/Delaunay_triangulation_face_base_2.h new file mode 100644 index 00000000000..1a9493b236c --- /dev/null +++ b/Triangulation_2/include/CGAL/Delaunay_triangulation_face_base_2.h @@ -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 + +#include +#include +#include + +namespace CGAL { + +template < typename Gt, typename Fb = Triangulation_face_base_2 > +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::Other Fb2; + typedef Delaunay_triangulation_face_base_2 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 + 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 diff --git a/Triangulation_2/include/CGAL/Delaunay_triangulation_face_base_with_circumcenter_2.h b/Triangulation_2/include/CGAL/Delaunay_triangulation_face_base_with_circumcenter_2.h new file mode 100644 index 00000000000..a86acc55985 --- /dev/null +++ b/Triangulation_2/include/CGAL/Delaunay_triangulation_face_base_with_circumcenter_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 +// 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 + +#include +#include +#include + +namespace CGAL { + +template < typename GT, typename Fb = Delaunay_triangulation_face_base_2 > +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::Other Fb2; + typedef Delaunay_triangulation_face_base_with_circumcenter_2 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