mirror of https://github.com/CGAL/cgal
288 lines
8.5 KiB
C++
288 lines
8.5 KiB
C++
// Copyright (c) 2005 Tel-Aviv University (Israel).
|
|
// All rights reserved.
|
|
//
|
|
// This file is part of CGAL (www.cgal.org); you may redistribute it under
|
|
// the terms of the Q Public License version 1.0.
|
|
// See the file LICENSE.QPL distributed with CGAL.
|
|
//
|
|
// Licensees holding a valid commercial license may use this file in
|
|
// accordance with the commercial license agreement provided with the software.
|
|
//
|
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
//
|
|
// $URL$
|
|
// $Id$
|
|
//
|
|
//
|
|
// Author(s) : Michal Meyerovitch <gorgymic@post.tau.ac.il>
|
|
|
|
#ifndef ENVELOPE_OVERLAY_2_H
|
|
#define ENVELOPE_OVERLAY_2_H
|
|
|
|
#include <CGAL/Arr_overlay.h>
|
|
#include <CGAL/Envelope_overlay_functor.h>
|
|
|
|
#include <iostream>
|
|
|
|
//#define CGAL_DEBUG_ENVELOPE_OVERLAY_2
|
|
|
|
CGAL_BEGIN_NAMESPACE
|
|
|
|
template <class MinimizationDiagram_2,
|
|
class OverlayFunctor = Envelope_overlay_functor<MinimizationDiagram_2> >
|
|
class Envelope_overlay_2
|
|
{
|
|
public:
|
|
typedef MinimizationDiagram_2 Minimization_diagram_2;
|
|
|
|
typedef typename Minimization_diagram_2::Face_handle Face_handle;
|
|
typedef typename Minimization_diagram_2::Face_iterator Face_iterator;
|
|
|
|
typedef typename Minimization_diagram_2::Vertex_handle Vertex_handle;
|
|
typedef typename Minimization_diagram_2::Vertex_iterator Vertex_iterator;
|
|
|
|
typedef typename Minimization_diagram_2::Halfedge_handle Halfedge_handle;
|
|
typedef typename Minimization_diagram_2::Halfedge_iterator Halfedge_iterator;
|
|
|
|
typedef OverlayFunctor Overlay_functor;
|
|
protected:
|
|
typedef typename Minimization_diagram_2::Traits_2 Traits;
|
|
typedef typename Traits::Xy_monotone_surface_3 Xy_monotone_surface_3;
|
|
|
|
public:
|
|
|
|
void operator()(Minimization_diagram_2& md1,
|
|
Minimization_diagram_2& md2,
|
|
Minimization_diagram_2& result)
|
|
{
|
|
#ifdef CGAL_DEBUG_ENVELOPE_OVERLAY_2
|
|
cout << "In overlay: print edges of md1" << endl;
|
|
for(Halfedge_iterator hi = md1.halfedges_begin();
|
|
hi != md1.halfedges_end(); ++hi, ++hi)
|
|
cout << hi->curve() << endl;
|
|
cout << "In overlay: print isolated vertices of md1" << endl;
|
|
for(Vertex_iterator vi = md1.vertices_begin();
|
|
vi != md1.vertices_end(); ++vi)
|
|
if (vi->is_isolated())
|
|
cout << vi->point() << endl;
|
|
cout << "In overlay: print edges of md2" << endl;
|
|
for(Halfedge_iterator hi = md2.halfedges_begin();
|
|
hi != md2.halfedges_end(); ++hi, ++hi)
|
|
cout << hi->curve() << endl;
|
|
cout << "In overlay: print isolated vertices of md2" << endl;
|
|
for(Vertex_iterator vi = md2.vertices_begin();
|
|
vi != md2.vertices_end(); ++vi)
|
|
if (vi->is_isolated())
|
|
cout << vi->point() << endl;
|
|
cout << "In overlay: print faces of md1" << endl;
|
|
print_faces(md1);
|
|
cout << "In overlay: print faces of md2" << endl;
|
|
print_faces(md2);
|
|
|
|
#endif
|
|
|
|
Overlay_functor overlay_func(md1, md2, result);
|
|
overlay(md1, md2, result, overlay_func);
|
|
|
|
#ifdef CGAL_DEBUG_ENVELOPE_OVERLAY_2
|
|
cout << endl;
|
|
cout << "In overlay: print faces at the end" << endl;
|
|
print_faces(result);
|
|
#endif
|
|
|
|
#ifdef CGAL_DEBUG_ENVELOPE_OVERLAY_2
|
|
cout << "In overlay: print vertices at the end" << endl;
|
|
print_vertices(result);
|
|
|
|
cout << "In overlay: print edges at the end" << endl;
|
|
print_edges(result);
|
|
#endif
|
|
|
|
post_test_assertions(result);
|
|
}
|
|
|
|
|
|
public:
|
|
void print_face(Face_handle fh)
|
|
{
|
|
std::cout << (fh->is_unbounded() ? "unbounded" : "bounded");
|
|
|
|
if (fh->get_is_set())
|
|
{
|
|
std::cout << " #data= " << fh->number_of_data_objects();
|
|
if (fh->number_of_data_objects() > 0)
|
|
std::cout << " data= " << fh->get_data();
|
|
}
|
|
|
|
if (fh->get_aux_is_set(0))
|
|
{
|
|
std::cout << " #data1= " << get_number_of_aux_data_objects(fh, 0);
|
|
if (get_number_of_aux_data_objects(fh, 0)>0)
|
|
std::cout << " data#1= " << get_aux_data(fh, 0);
|
|
}
|
|
if (fh->get_aux_is_set(1))
|
|
{
|
|
std::cout << " #data2= " << get_number_of_aux_data_objects(fh, 1);
|
|
if (get_number_of_aux_data_objects(fh, 1)>0)
|
|
std::cout << " data#2= " << get_aux_data(fh, 1);
|
|
}
|
|
std::cout << std::endl;
|
|
}
|
|
|
|
// print the aux data in the faces of md
|
|
void print_faces(Minimization_diagram_2& md)
|
|
{
|
|
Face_iterator fit = md.faces_begin();
|
|
for(; fit != md.faces_end(); ++fit)
|
|
{
|
|
Face_handle fh = fit;
|
|
print_face(fh);
|
|
}
|
|
std::cout << std::endl;
|
|
}
|
|
|
|
void print_vertices(Minimization_diagram_2& md)
|
|
{
|
|
Vertex_iterator vit = md.vertices_begin();
|
|
for(; vit != md.vertices_end(); ++vit)
|
|
{
|
|
Vertex_handle vh = vit;
|
|
std::cout << vh->point();
|
|
|
|
if (vh->get_is_set())
|
|
{
|
|
std::cout << " #data= " << vh->number_of_data_objects();
|
|
if (vh->number_of_data_objects() > 0)
|
|
std::cout << " data= " << vh->get_data();
|
|
}
|
|
|
|
if (vh->get_aux_is_set(0))
|
|
{
|
|
std::cout << " #data1= " << get_number_of_aux_data_objects(vh, 0);
|
|
if (get_number_of_aux_data_objects(vh, 0)>0)
|
|
std::cout << " data#1= " << get_aux_data(vh, 0);
|
|
}
|
|
if (vh->get_aux_is_set(1))
|
|
{
|
|
std::cout << " #data2= " << get_number_of_aux_data_objects(vh, 1);
|
|
if (get_number_of_aux_data_objects(vh, 1)>0)
|
|
std::cout << " data#2= " << get_aux_data(vh, 1);
|
|
}
|
|
std::cout << std::endl;
|
|
}
|
|
std::cout << std::endl;
|
|
}
|
|
|
|
void print_edges(Minimization_diagram_2& md)
|
|
{
|
|
Halfedge_iterator hit = md.halfedges_begin();
|
|
for(; hit != md.halfedges_end(); ++hit, ++hit)
|
|
{
|
|
Halfedge_handle hh = hit;
|
|
std::cout << hh->curve();
|
|
|
|
if (hh->get_is_set())
|
|
{
|
|
std::cout << " #data= " << hh->number_of_data_objects();
|
|
if (hh->number_of_data_objects() > 0)
|
|
std::cout << " data= " << hh->get_data();
|
|
}
|
|
|
|
|
|
if (hh->get_aux_is_set(0))
|
|
{
|
|
std::cout << " #data1= " << get_number_of_aux_data_objects(hh, 0);
|
|
if (get_number_of_aux_data_objects(hh, 0)>0)
|
|
std::cout << " data#1= " << get_aux_data(hh, 0);
|
|
}
|
|
if (hh->get_aux_is_set(1))
|
|
{
|
|
std::cout << " #data2= " << get_number_of_aux_data_objects(hh, 1);
|
|
|
|
if (get_number_of_aux_data_objects(hh, 1)>0)
|
|
std::cout << " data#2= " << get_aux_data(hh, 1);
|
|
}
|
|
std::cout << std::endl;
|
|
}
|
|
std::cout << std::endl;
|
|
}
|
|
|
|
void post_test_assertions(Minimization_diagram_2& md)
|
|
{
|
|
// check that all data is filled in result
|
|
Face_iterator fi = md.faces_begin();
|
|
for(; fi != md.faces_end(); ++fi)
|
|
{
|
|
Face_handle fh = fi;
|
|
CGAL_assertion_msg(fh->get_aux_is_set(0), "data from md1 on face is not set");
|
|
CGAL_assertion_msg(fh->get_aux_is_set(1), "data from md2 on face is not set");
|
|
}
|
|
|
|
Halfedge_iterator hi = md.halfedges_begin();
|
|
for(; hi != md.halfedges_end(); ++hi)
|
|
{
|
|
Halfedge_handle hh = hi;
|
|
CGAL_assertion_msg(hh->get_aux_is_set(0), "data from md1 on halfedge is not set");
|
|
CGAL_assertion_msg(hh->get_aux_is_set(1), "data from md2 on halfedge is not set");
|
|
}
|
|
|
|
Vertex_iterator vi = md.vertices_begin();
|
|
for(; vi != md.vertices_end(); ++vi)
|
|
{
|
|
Vertex_handle vh = vi;
|
|
CGAL_assertion_msg(vh->get_aux_is_set(0), "data from md1 on vertex is not set");
|
|
CGAL_assertion_msg(vh->get_aux_is_set(1), "data from md2 on vertex is not set");
|
|
}
|
|
}
|
|
protected:
|
|
// helper methods
|
|
template <class FeatureHandle>
|
|
Xy_monotone_surface_3 get_aux_data(FeatureHandle fh, unsigned int id)
|
|
{
|
|
Object o = fh->get_aux_source(id);
|
|
Xy_monotone_surface_3 data;
|
|
|
|
Halfedge_handle h;
|
|
Vertex_handle v;
|
|
Face_handle f;
|
|
if (assign(v, o))
|
|
data = v->get_data();
|
|
else if (assign(h, o))
|
|
data = h->get_data();
|
|
else
|
|
{
|
|
CGAL_assertion(assign(f, o));
|
|
assign(f, o);
|
|
data = f->get_data();
|
|
}
|
|
return data;
|
|
}
|
|
template <class FeatureHandle>
|
|
int get_number_of_aux_data_objects(FeatureHandle fh, unsigned int id)
|
|
{
|
|
Object o = fh->get_aux_source(id);
|
|
int data;
|
|
|
|
Halfedge_handle h;
|
|
Vertex_handle v;
|
|
Face_handle f;
|
|
if (assign(v, o))
|
|
data = v->number_of_data_objects();
|
|
else if (assign(h, o))
|
|
data = h->number_of_data_objects();
|
|
else
|
|
{
|
|
CGAL_assertion(assign(f, o));
|
|
assign(f, o);
|
|
data = f->number_of_data_objects();
|
|
}
|
|
return data;
|
|
}
|
|
|
|
};
|
|
|
|
CGAL_END_NAMESPACE
|
|
|
|
#endif
|