Added dual_segment_exact

This commit is contained in:
Mael Rouxel-Labbé 2017-11-21 16:09:08 +01:00
parent c89ae64e31
commit c1a4fe3d65
3 changed files with 107 additions and 15 deletions

View File

@ -35,10 +35,13 @@
// vertex and cell bases
#include <CGAL/Mesh_vertex_base_3.h>
#include <CGAL/Mesh_cell_base_3.h>
#include <CGAL/Mesh_3/io_signature.h>
#include <CGAL/assertions.h>
#include <CGAL/array.h>
#include <CGAL/assertions.h>
#include <CGAL/Cartesian_converter.h>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Kernel_traits.h>
#include <CGAL/Mesh_3/io_signature.h>
#include <CGAL/tags.h>
#include <iostream>
@ -917,17 +920,105 @@ public:
return make_object(s);
}
void dual_segment(const Facet& facet, Bare_point& p, Bare_point& q) const {
Segment s = construct_segment(Base::dual(facet));
p = s.source();
q = s.target();
return;
void dual_segment(const Facet& facet, Bare_point& p, Bare_point& q) const
{
typename Base::Periodic_segment_3 ps = Base::dual(facet);
p = construct_point(ps[0]);
q = construct_point(ps[1]);
}
void dual_segment_exact(const Facet& facet, Bare_point& p, Bare_point& q) const
{
// @fixme (below is not exact)
return dual_segment(facet, p, q);
typedef typename Kernel_traits<Bare_point>::Kernel K;
typedef Exact_predicates_exact_constructions_kernel EK;
typedef Cartesian_converter<K, EK> To_exact;
typedef Cartesian_converter<EK,K> Back_from_exact;
typedef CGAL::Periodic_3_regular_triangulation_traits_3<EK> Exact_Rt;
typedef typename Exact_Rt::Point_3 EPoint_3;
To_exact to_exact;
Back_from_exact back_from_exact;
Exact_Rt etraits(to_exact(domain()));
const typename EK::Iso_cuboid_3& dom = etraits.get_domain();
Exact_Rt::Construct_weighted_circumcenter_3 exact_weighted_circumcenter =
etraits.construct_weighted_circumcenter_3_object();
Exact_Rt::Construct_point_3 exact_construct_point =
etraits.construct_point_3_object();
Cell_handle c = facet.first;
const int i = facet.second;
Cell_handle n = c->neighbor(i);
EPoint_3 exact_wc1 = exact_weighted_circumcenter(
to_exact(c->vertex(0)->point()), to_exact(c->vertex(1)->point()),
to_exact(c->vertex(2)->point()), to_exact(c->vertex(3)->point()),
get_offset(c, 0), get_offset(c, 1),
get_offset(c, 2), get_offset(c, 3));
EPoint_3 exact_wc2 = exact_weighted_circumcenter(
to_exact(n->vertex(0)->point()), to_exact(n->vertex(1)->point()),
to_exact(n->vertex(2)->point()), to_exact(n->vertex(3)->point()),
get_offset(n, 0), get_offset(n, 1),
get_offset(n, 2), get_offset(n, 3));
typename EK::Point_3 dp;
// get the offset of the first weighted circumcenter
Offset transl_wc1;
while(true) /* while not in */
{
dp = etraits.construct_point_3_object()(exact_wc1, transl_wc1);
if(dp.x() < dom.xmin())
transl_wc1.x() += 1;
else if(dp.y() < dom.ymin())
transl_wc1.y() += 1;
else if(dp.z() < dom.zmin())
transl_wc1.z() += 1;
else if(!(dp.x() < dom.xmax()))
transl_wc1.x() -= 1;
else if(!(dp.y() < dom.ymax()))
transl_wc1.y() -= 1;
else if(!(dp.z() < dom.zmax()))
transl_wc1.z() -= 1;
else
break;
}
// get the offset of the second weighted circumcenter
Offset transl_wc2;
while(true) /* while not in */
{
dp = etraits.construct_point_3_object()(exact_wc2, transl_wc2);
if(dp.x() < dom.xmin())
transl_wc2.x() += 1;
else if(dp.y() < dom.ymin())
transl_wc2.y() += 1;
else if(dp.z() < dom.zmin())
transl_wc2.z() += 1;
else if(!(dp.x() < dom.xmax()))
transl_wc2.x() -= 1;
else if(!(dp.y() < dom.ymax()))
transl_wc2.y() -= 1;
else if(!(dp.z() < dom.zmax()))
transl_wc2.z() -= 1;
else
break;
}
Offset off = this->neighbor_offset(c, i, n);
Offset o1 = -transl_wc1;
Offset o2 = this->combine_offsets(-transl_wc2, -off);
Offset cumm_off((std::min)(o1.x(), o2.x()),
(std::min)(o1.y(), o2.y()),
(std::min)(o1.z(), o2.z()));
EPoint_3 ewc1 = exact_construct_point(exact_wc1, transl_wc1);
EPoint_3 ewc2 = exact_construct_point(exact_wc2, transl_wc2);
p = back_from_exact(exact_construct_point(ewc1, o1 - cumm_off));
q = back_from_exact(exact_construct_point(ewc2, o2 - cumm_off));
}
// dual rays are impossible in a periodic triangulation since there are no

View File

@ -25,15 +25,17 @@
#include <CGAL/internal/Periodic_3_regular_triangulation_remove_traits_3.h>
#include <CGAL/Periodic_3_triangulation_3.h>
#include <CGAL/Periodic_3_triangulation_ds_vertex_base_3.h>
#include <CGAL/Periodic_3_triangulation_ds_cell_base_3.h>
#include <CGAL/Regular_triangulation_3.h>
#include <CGAL/Regular_triangulation_vertex_base_3.h>
#include <CGAL/Regular_triangulation_cell_base_3.h>
#include <CGAL/internal/Has_nested_type_Bare_point.h>
#include <CGAL/enum.h>
#include <CGAL/Regular_triangulation_3.h>
#include <CGAL/internal/boost/function_property_map.hpp>
#include <CGAL/internal/Has_nested_type_Bare_point.h>
#include <CGAL/spatial_sort.h>
#include <CGAL/utility.h>
#include <CGAL/internal/boost/function_property_map.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/identity.hpp>

View File

@ -42,7 +42,6 @@
#include <CGAL/triangulation_assertions.h>
#include <CGAL/array.h>
#include <CGAL/internal/Exact_type_selector.h>
#include <CGAL/NT_converter.h>
#include <CGAL/Unique_hash_map.h>
#include <CGAL/use.h>
@ -611,7 +610,7 @@ public:
return construct_point(pp.first, pp.second);
}
Periodic_point_3 exact_construct_periodic_point(const Point_3& p) const
Periodic_point_3 construct_periodic_point_exact(const Point_3& p) const
{
typedef typename Geometric_traits::Kernel K;
typedef typename Exact_kernel_selector<K>::Exact_kernel EK;
@ -742,7 +741,7 @@ public:
{
// approximate construction does not manage
had_to_use_exact = true;
pp = exact_construct_periodic_point(p);
pp = construct_periodic_point_exact(p);
}
return pp;