Added trully random colors. Fixed face handling.

This commit is contained in:
Efi Fogel 2022-06-07 20:31:50 +03:00
parent c7ddd44274
commit 4083266a4d
1 changed files with 32 additions and 15 deletions

View File

@ -3,6 +3,7 @@
#include <unordered_map> #include <unordered_map>
#include <cstdlib> #include <cstdlib>
#include <random>
#include <CGAL/Qt/Basic_viewer_qt.h> #include <CGAL/Qt/Basic_viewer_qt.h>
#include <CGAL/Qt/init_ogl_context.h> #include <CGAL/Qt/init_ogl_context.h>
@ -39,10 +40,16 @@ public:
//! //!
void add_elements() { void add_elements() {
clear(); clear();
m_visited.clear();
std::random_device rd;
m_rng.seed(rd());
m_uni = std::uniform_int_distribution<size_t>(0, 255);
if (m_arr.is_empty()) return; if (m_arr.is_empty()) return;
for (auto it = m_arr.unbounded_faces_begin(); for (auto it = m_arr.unbounded_faces_begin();
it != m_arr.unbounded_faces_end(); ++it) it != m_arr.unbounded_faces_end(); ++it)
add_face(it, Face_const_handle()); add_face(it);
// Add edges that do not separe faces. // Add edges that do not separe faces.
for (auto it = m_arr.edges_begin(); it != m_arr.edges_end(); ++it) for (auto it = m_arr.edges_begin(); it != m_arr.edges_end(); ++it)
@ -51,6 +58,8 @@ public:
// Add all points // Add all points
for (auto it = m_arr.vertices_begin(); it != m_arr.vertices_end(); ++it) for (auto it = m_arr.vertices_begin(); it != m_arr.vertices_end(); ++it)
draw_point(it->point()); draw_point(it->point());
m_visited.clear();
} }
protected: protected:
@ -98,7 +107,7 @@ protected:
//! //!
virtual void draw_region(Ccb_halfedge_const_circulator circ) { virtual void draw_region(Ccb_halfedge_const_circulator circ) {
CGAL::IO::Color color(std::rand()%256, std::rand()%256, std::rand()%256); CGAL::IO::Color color(m_uni(m_rng), m_uni(m_rng), m_uni(m_rng));
this->face_begin(color); this->face_begin(color);
auto ext = find_smallest(circ); auto ext = find_smallest(circ);
@ -128,27 +137,25 @@ protected:
virtual void draw_point(const Point& p) { this->add_point(p); } virtual void draw_point(const Point& p) { this->add_point(p); }
//! //!
void add_ccb(Ccb_halfedge_const_circulator circ, Face_const_handle parent) { void add_ccb(Ccb_halfedge_const_circulator circ) {
std::unordered_map<Face_const_handle, bool> visited;
auto face = circ->face(); auto face = circ->face();
auto curr = circ; auto curr = circ;
do { do {
auto new_face = curr->twin()->face(); auto new_face = curr->twin()->face();
if ((new_face == face) || (new_face == parent)) continue; if (m_visited.find(new_face) != m_visited.end()) continue;
if (visited.find(new_face) != visited.end()) continue; m_visited[new_face] = true;
visited[new_face] = true; add_face(new_face);
add_face(new_face, face);
} while (++curr != circ); } while (++curr != circ);
} }
//! //!
void add_face(Face_const_handle face, Face_const_handle parent) { void add_face(Face_const_handle face) {
for (auto it = face->inner_ccbs_begin(); it != face->inner_ccbs_end(); ++it) for (auto it = face->inner_ccbs_begin(); it != face->inner_ccbs_end(); ++it)
add_ccb(*it, parent); add_ccb(*it);
for (auto it = face->outer_ccbs_begin(); it != face->outer_ccbs_end(); ++it) for (auto it = face->outer_ccbs_begin(); it != face->outer_ccbs_end(); ++it)
{ {
add_ccb(*it, parent); add_ccb(*it);
draw_region(*it); draw_region(*it);
} }
} }
@ -172,6 +179,12 @@ protected:
protected: protected:
//! The arrangement to draw //! The arrangement to draw
const Arr& m_arr; const Arr& m_arr;
std::unordered_map<Face_const_handle, bool> m_visited;
std::mt19937 m_rng;
std::uniform_int_distribution<size_t> m_uni; // guaranteed unbiased
}; };
//! Basic viewer of a 2D arrangement. //! Basic viewer of a 2D arrangement.
@ -225,7 +238,9 @@ public:
//! //!
virtual void draw_region(Ccb_halfedge_const_circulator circ) { virtual void draw_region(Ccb_halfedge_const_circulator circ) {
CGAL::IO::Color color(std::rand()%256, std::rand()%256, std::rand()%256); auto& uni = this->m_uni;
auto& rng = this->m_rng;
CGAL::IO::Color color(uni(rng), uni(rng), uni(rng));
this->face_begin(color); this->face_begin(color);
const auto* traits = this->m_arr.geometry_traits(); const auto* traits = this->m_arr.geometry_traits();
@ -242,7 +257,9 @@ public:
curr = curr->twin()->next(); curr = curr->twin()->next();
std::vector<typename Gt::Approximate_point_2> polyline; std::vector<typename Gt::Approximate_point_2> polyline;
approx(curr->curve(), std::back_inserter(polyline), 10); double density(10);
bool l2r = curr->direction() == ARR_LEFT_TO_RIGHT;
approx(std::back_inserter(polyline), density, curr->curve(), l2r);
auto it = polyline.begin(); auto it = polyline.begin();
auto prev = it++; auto prev = it++;
for (; it != polyline.end(); prev = it++) { for (; it != polyline.end(); prev = it++) {
@ -260,8 +277,8 @@ public:
const auto* traits = this->m_arr.geometry_traits(); const auto* traits = this->m_arr.geometry_traits();
auto approx = traits->approximate_2_object(); auto approx = traits->approximate_2_object();
std::vector<typename Gt::Approximate_point_2> polyline; std::vector<typename Gt::Approximate_point_2> polyline;
approx(curve, std::back_inserter(polyline), 10); double density(10);
approx(std::back_inserter(polyline), density, curve);
auto it = polyline.begin(); auto it = polyline.begin();
auto prev = it++; auto prev = it++;
for (; it != polyline.end(); prev = it++) this->add_segment(*prev, *it); for (; it != polyline.end(); prev = it++) this->add_segment(*prev, *it);