#include <iostream>
#include <vector>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Arrangement_on_curve_1/Circle_traits_1.h>
#include <CGAL/Arrangement_on_curve_1/Identified_topology_traits.h>
#include <CGAL/Arrangement_on_curve_1/Arrangement_on_curve_1.h>
#include <CGAL/Arrangement_on_curve_1/insert.h>
#include <CGAL/Arrangement_on_curve_1/locate.h>
#include <CGAL/Arrangement_on_curve_1/overlay.h>
#include <CGAL/Arrangement_on_curve_1/Default_overlay_visitor.h>
using Point_1 = Traits_1::Point_1;
static std::ostream& print_dir(std::ostream& os,
const Direction_2& d)
{ return os << "(" << d.dx() << ", " << d.dy() << ")"; }
static void print_circle_arr(const Arr& arr, const std::string& name) {
std::cout << "Arrangement on circle: " << name << "\n";
std::cout << " vertices = " << arr.number_of_vertices() << ", edges = " << arr.number_of_edges() << "\n";
if (arr.empty()) { std::cout << " (empty)\n\n"; return; }
auto& topo = arr.topology_traits();
auto pmap = arr.vertex_point_map();
auto boundary_e = topo.left_boundary_edge();
auto cur_e = boundary_e;
std::cout << " cyclic vertex sequence (direction dx, dy):\n";
std::size_t count = 0;
do {
auto v = topo.right_vertex(cur_e);
std::cout << " ";
print_dir(std::cout, get(pmap, v));
std::cout << "\n";
cur_e = topo.right_edge(v);
++count;
} while (cur_e != boundary_e && count <= arr.number_of_vertices());
std::cout << "\n";
}
int main() {
auto traits = std::make_shared<const Traits_1>();
std::vector<Direction_2> normals_A = {
};
Arr arr_a(traits);
for (const auto& d : normals_A) Aoc::insert(arr_a, d);
print_circle_arr(arr_a, "square normals (A)");
std::vector<Direction_2> normals_B = {
};
Arr arr_b(traits);
for (const auto& d : normals_B) Aoc::insert(arr_b, d);
print_circle_arr(arr_b, "hexagon normals (B)");
Arr arr_res(traits);
using DefaultVisitor = Aoc::Default_overlay_visitor<Arr, Arr, Arr>;
DefaultVisitor visitor(arr_a, arr_b, arr_res);
Aoc::overlay(arr_a, arr_b, arr_res, visitor);
print_circle_arr(arr_res, "overlay A and B");
auto loc = Aoc::locate(arr_res, query);
std::cout << "locate";
print_dir(std::cout, query);
std::cout << " in arr_res:\n";
if (loc.index() == 0) {
auto v = std::get<0>(loc);
std::cout << " -> coincides with vertex at ";
print_dir(std::cout, get(arr_res.vertex_point_map(), v));
std::cout << "\n";
}
else std::cout << " -> falls inside an edge\n";
auto is_on_id = traits->is_on_x_identification_1_object();
std::cout << "\nIs_on_x_identification_1 checks:\n";
std::cout << " (1,0) -> " << (is_on_id(id_dir) ? "true (identification point)" : "false") << "\n";
std::cout << " (0,1) -> " << (is_on_id(other_dir) ? "true (identification point)" : "false") << "\n";
std::cout <<
" (2,0) -> " << (is_on_id(
Direction_2(2, 0)) ?
"true (identification point)" :
"false")
<< " (same direction as (1,0), so also the identification point)\n";
return 0;
}
Arrangement_on_curve_1 represents a subdivision of a continuous 1D curve, referred to as the master c...
Definition Arrangement_on_curve_1.h:77
Circle_traits_1 is a geometry traits model of the AocIdentifiedBoundaryTraits_1 concept for 1D arrang...
Definition Circle_traits_1.h:68
Identified_topology_traits is a topology traits model of AocTopologyTraits for 1D arrangements on a c...
Definition Identified_topology_traits.h:57
Definition Arrangement_on_curve_1.txt:2