mirror of https://github.com/CGAL/cgal
cleanup - mainly by a patch provided by Shriramana Sharma
This commit is contained in:
parent
09ca243173
commit
c9f1fa974b
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
#ifndef CGAL_USE_CORE
|
#ifndef CGAL_USE_CORE
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
int main ()
|
int main()
|
||||||
{
|
{
|
||||||
std::cout << "Sorry, this example needs CORE ..." << std::endl;
|
std::cout << "Sorry, this example needs CORE ..." << std::endl;
|
||||||
return (0);
|
return (0);
|
||||||
|
|
@ -16,7 +16,6 @@ int main ()
|
||||||
#include <CGAL/Cartesian.h>
|
#include <CGAL/Cartesian.h>
|
||||||
#include <CGAL/CORE_algebraic_number_traits.h>
|
#include <CGAL/CORE_algebraic_number_traits.h>
|
||||||
#include <CGAL/Arr_Bezier_curve_traits_2.h>
|
#include <CGAL/Arr_Bezier_curve_traits_2.h>
|
||||||
#include <CGAL/Arrangement_2.h>
|
|
||||||
#include <CGAL/Gps_traits_2.h>
|
#include <CGAL/Gps_traits_2.h>
|
||||||
#include <CGAL/Boolean_set_operations_2.h>
|
#include <CGAL/Boolean_set_operations_2.h>
|
||||||
#include <CGAL/General_polygon_set_2.h>
|
#include <CGAL/General_polygon_set_2.h>
|
||||||
|
|
@ -24,25 +23,25 @@ int main ()
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
typedef CGAL::CORE_algebraic_number_traits Nt_traits;
|
typedef CGAL::CORE_algebraic_number_traits Nt_traits;
|
||||||
typedef Nt_traits::Rational Rational;
|
typedef Nt_traits::Rational Rational;
|
||||||
typedef Nt_traits::Algebraic Algebraic;
|
typedef Nt_traits::Algebraic Algebraic;
|
||||||
|
|
||||||
typedef CGAL::Cartesian<Rational> Rat_kernel;
|
typedef CGAL::Cartesian<Rational> Rat_kernel;
|
||||||
typedef CGAL::Cartesian<Algebraic> Alg_kernel;
|
typedef CGAL::Cartesian<Algebraic> Alg_kernel;
|
||||||
typedef CGAL::Arr_Bezier_curve_traits_2<Rat_kernel, Alg_kernel, Nt_traits>
|
typedef CGAL::Arr_Bezier_curve_traits_2<Rat_kernel, Alg_kernel, Nt_traits>
|
||||||
Traits_2;
|
Traits_2;
|
||||||
|
|
||||||
typedef Rat_kernel::Point_2 Bezier_rat_point;
|
typedef Rat_kernel::Point_2 Bezier_rat_point;
|
||||||
typedef Traits_2::Curve_2 Bezier_curve;
|
typedef Traits_2::Curve_2 Bezier_curve;
|
||||||
typedef Traits_2::X_monotone_curve_2 Bezier_X_monotone_curve;
|
typedef Traits_2::X_monotone_curve_2 Bezier_X_monotone_curve;
|
||||||
typedef CGAL::Gps_traits_2<Traits_2> Bezier_traits;
|
typedef CGAL::Gps_traits_2<Traits_2> Bezier_traits;
|
||||||
typedef Bezier_traits::General_polygon_2 Bezier_polygon;
|
typedef Bezier_traits::General_polygon_2 Bezier_polygon;
|
||||||
typedef Bezier_traits::General_polygon_with_holes_2 Bezier_polygon_with_holes;
|
typedef Bezier_traits::General_polygon_with_holes_2 Bezier_polygon_with_holes;
|
||||||
typedef CGAL::General_polygon_set_2<Bezier_traits> Bezier_polygon_set;
|
typedef CGAL::General_polygon_set_2<Bezier_traits> Bezier_polygon_set;
|
||||||
typedef std::vector<Bezier_polygon> Bezier_polygon_vector;
|
typedef std::vector<Bezier_polygon> Bezier_polygon_vector;
|
||||||
|
|
||||||
Bezier_curve read_bezier_curve ( std::istream& is, bool aDoubleFormat )
|
Bezier_curve read_bezier_curve(std::istream& is, bool aDoubleFormat)
|
||||||
{
|
{
|
||||||
// Read the number of control points.
|
// Read the number of control points.
|
||||||
unsigned int n;
|
unsigned int n;
|
||||||
|
|
@ -51,63 +50,52 @@ Bezier_curve read_bezier_curve ( std::istream& is, bool aDoubleFormat )
|
||||||
|
|
||||||
// Read the control points.
|
// Read the control points.
|
||||||
std::vector<Bezier_rat_point> ctrl_pts;
|
std::vector<Bezier_rat_point> ctrl_pts;
|
||||||
|
for (unsigned int k = 0; k < n; ++k) {
|
||||||
for ( unsigned int k = 0; k < n; k++)
|
Bezier_rat_point p;
|
||||||
{
|
if (aDoubleFormat) {
|
||||||
Bezier_rat_point p ;
|
double x, y;
|
||||||
if ( aDoubleFormat )
|
is >> x >> y;
|
||||||
{
|
|
||||||
double x,y ;
|
|
||||||
is >> x >> y ;
|
|
||||||
p = Bezier_rat_point(x,y);
|
p = Bezier_rat_point(x,y);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
is >> p;
|
||||||
is >> p ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( k == 0 || ctrl_pts[k-1] != p )
|
if ((k == 0) || (ctrl_pts[k-1] != p))
|
||||||
{
|
ctrl_pts.push_back(p);
|
||||||
ctrl_pts.push_back(p) ;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Bezier_curve(ctrl_pts.begin(),ctrl_pts.end());
|
return Bezier_curve(ctrl_pts.begin(), ctrl_pts.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool read_bezier ( char const* aFileName, Bezier_polygon_set& rSet )
|
bool read_bezier(char const* aFileName, Bezier_polygon_set& rSet)
|
||||||
{
|
{
|
||||||
|
|
||||||
bool rOK = false ;
|
bool rOK = false;
|
||||||
|
|
||||||
std::ifstream in_file (aFileName);
|
std::ifstream in_file(aFileName);
|
||||||
|
|
||||||
if ( in_file )
|
if (in_file) {
|
||||||
{
|
try {
|
||||||
try
|
std::cout << "Reading " << aFileName << std::endl;
|
||||||
{
|
|
||||||
std::cout << "Reading " << aFileName << std::endl ;
|
|
||||||
|
|
||||||
std::string format ;
|
std::string format;
|
||||||
std::getline(in_file,format);
|
std::getline(in_file, format);
|
||||||
|
|
||||||
bool lDoubleFormat = ( format.length() >= 6 &&
|
bool lDoubleFormat =
|
||||||
format.substr(0,6) == "DOUBLE") ;
|
((format.length() >= 6) && (format.substr(0,6) == "DOUBLE"));
|
||||||
|
|
||||||
// Red the number of bezier polygon with holes
|
// Red the number of bezier polygon with holes
|
||||||
unsigned int n_regions ;
|
unsigned int n_regions;
|
||||||
in_file >> n_regions;
|
in_file >> n_regions;
|
||||||
|
|
||||||
for ( unsigned int r = 0 ; r < n_regions ; ++ r )
|
for (unsigned int r = 0; r < n_regions; ++r) {
|
||||||
{
|
Bezier_polygon_vector polygons;
|
||||||
Bezier_polygon_vector polygons ;
|
|
||||||
|
|
||||||
// Read the number of bezier curves.
|
// Read the number of bezier curves.
|
||||||
unsigned int n_boundaries;
|
unsigned int n_boundaries;
|
||||||
in_file >> n_boundaries;
|
in_file >> n_boundaries;
|
||||||
|
|
||||||
for ( unsigned int b = 0 ; b < n_boundaries ; ++ b )
|
for (unsigned int b = 0; b < n_boundaries; ++b) {
|
||||||
{
|
|
||||||
// Read the number of bezier curves.
|
// Read the number of bezier curves.
|
||||||
unsigned int n_curves;
|
unsigned int n_curves;
|
||||||
in_file >> n_curves;
|
in_file >> n_curves;
|
||||||
|
|
@ -117,8 +105,7 @@ bool read_bezier ( char const* aFileName, Bezier_polygon_set& rSet )
|
||||||
|
|
||||||
std::list<Bezier_X_monotone_curve> xcvs;
|
std::list<Bezier_X_monotone_curve> xcvs;
|
||||||
|
|
||||||
for ( unsigned int k = 0; k < n_curves; ++ k )
|
for (unsigned int k = 0; k < n_curves; ++k) {
|
||||||
{
|
|
||||||
// Read the current curve and subdivide it into x-monotone subcurves.
|
// Read the current curve and subdivide it into x-monotone subcurves.
|
||||||
|
|
||||||
std::list<CGAL::Object> x_objs;
|
std::list<CGAL::Object> x_objs;
|
||||||
|
|
@ -129,101 +116,90 @@ bool read_bezier ( char const* aFileName, Bezier_polygon_set& rSet )
|
||||||
traits.make_x_monotone_2_object();
|
traits.make_x_monotone_2_object();
|
||||||
|
|
||||||
Bezier_curve B = read_bezier_curve(in_file, lDoubleFormat);
|
Bezier_curve B = read_bezier_curve(in_file, lDoubleFormat);
|
||||||
if ( B.number_of_control_points() >= 2 )
|
if (B.number_of_control_points() >= 2) {
|
||||||
{
|
|
||||||
|
|
||||||
make_x_monotone (B, std::back_inserter (x_objs));
|
make_x_monotone(B, std::back_inserter(x_objs));
|
||||||
|
|
||||||
for (xoit = x_objs.begin(); xoit != x_objs.end(); ++xoit)
|
for (xoit = x_objs.begin(); xoit != x_objs.end(); ++xoit) {
|
||||||
{
|
if (CGAL::assign(xcv, *xoit))
|
||||||
if (CGAL::assign (xcv, *xoit))
|
xcvs.push_back(xcv);
|
||||||
{
|
|
||||||
xcvs.push_back (xcv);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Bezier_polygon pgn (xcvs.begin(), xcvs.end());
|
Bezier_polygon pgn(xcvs.begin(), xcvs.end());
|
||||||
|
|
||||||
CGAL::Orientation orient = pgn.orientation();
|
CGAL::Orientation orient = pgn.orientation();
|
||||||
std::cout << " Orientation: " << orient << std::endl ;
|
std::cout << " Orientation: " << orient << std::endl;
|
||||||
|
|
||||||
if (( b == 0 && orient == CGAL::CLOCKWISE) ||
|
if (((b == 0) && (orient == CGAL::CLOCKWISE)) ||
|
||||||
( b > 0 && orient == CGAL::COUNTERCLOCKWISE))
|
((b > 0) && (orient == CGAL::COUNTERCLOCKWISE)))
|
||||||
{
|
{
|
||||||
std::cout << " Reversing orientation: " << std::endl ;
|
std::cout << " Reversing orientation: " << std::endl;
|
||||||
pgn.reverse_orientation();
|
pgn.reverse_orientation();
|
||||||
}
|
}
|
||||||
|
|
||||||
polygons.push_back (pgn);
|
polygons.push_back(pgn);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( polygons.size() > 0 )
|
if (polygons.size() > 0) {
|
||||||
{
|
|
||||||
Bezier_polygon_with_holes pwh(polygons.front());
|
Bezier_polygon_with_holes pwh(polygons.front());
|
||||||
|
|
||||||
if ( polygons.size() > 1 )
|
if (polygons.size() > 1) {
|
||||||
{
|
|
||||||
Bezier_polygon_vector::const_iterator it;
|
Bezier_polygon_vector::const_iterator it;
|
||||||
for ( it = CGAL::cpp11::next(polygons.begin()); it != polygons.end();
|
for (it = CGAL::cpp11::next(polygons.begin());
|
||||||
++ it )
|
it != polygons.end(); ++it)
|
||||||
pwh.add_hole(*it);
|
pwh.add_hole(*it);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( is_valid_polygon_with_holes(pwh, rSet.traits() ) )
|
if (is_valid_polygon_with_holes(pwh, rSet.traits())) {
|
||||||
{
|
std::cout << " Inserting Bezier polygon with holes comprising "
|
||||||
std::cout << " Inserting bezier polygon with holes made of "
|
<< polygons.size() << " boundaries in total into set."
|
||||||
<< polygons.size() << " boundaries into Set."
|
<< std::endl;
|
||||||
<< std::endl ;
|
rSet.join(pwh);
|
||||||
rSet.join(pwh) ;
|
std::cout << " Done." << std::endl;
|
||||||
std::cout << " Done." << std::endl ;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
std::cout << " **** Bezier polygon with holes is NOT VALID ****"
|
||||||
std::cout << " **** Bezier polygon wiht holes IS NOT VALID ****"
|
<< std::endl;
|
||||||
<< std::endl ;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rOK = true ;
|
rOK = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch( std::exception const& x )
|
catch(std::exception const& x) {
|
||||||
{
|
std::cout << "An exception ocurred during reading of Bezier polygon set:"
|
||||||
std::cout << "Exception ocurred during reading of bezier polygon set:"
|
<< x.what() << std::endl;
|
||||||
<< x.what() << std::endl ;
|
|
||||||
}
|
}
|
||||||
catch(...)
|
catch(...) {
|
||||||
{
|
std::cout << "An exception ocurred during reading of Bezier polygon set."
|
||||||
std::cout << "Exception ocurred during reading of bezier polygon set."
|
<< std::endl;
|
||||||
<< std::endl ;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rOK ;
|
return rOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The main program.
|
// The main program.
|
||||||
int main (int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
const char* filename1 = (argc > 1) ? argv[1] : "char_g.bps";
|
const char* filename1 = (argc > 1) ? argv[1] : "char_g.bps";
|
||||||
const char* filename2 = (argc > 2) ? argv[2] : "char_m.bps";
|
const char* filename2 = (argc > 2) ? argv[2] : "char_m.bps";
|
||||||
const char* bop = (argc > 3) ? argv[3] : "i";
|
const char* bop = (argc > 3) ? argv[3] : "i";
|
||||||
|
|
||||||
// Read the general polygons from the input files.
|
// Read the general polygons from the input files.
|
||||||
CGAL::Timer timer;
|
CGAL::Timer timer;
|
||||||
Bezier_polygon_set S1, S2 ;
|
Bezier_polygon_set S1, S2;
|
||||||
|
|
||||||
timer.start();
|
timer.start();
|
||||||
|
|
||||||
|
|
||||||
if (! read_bezier (filename1, S1)) {
|
if (! read_bezier(filename1, S1)) {
|
||||||
std::cerr << "Failed to read " << filename1 << " ..." << std::endl;
|
std::cerr << "Failed to read " << filename1 << " ..." << std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! read_bezier (filename2, S2)) {
|
if (! read_bezier(filename2, S2)) {
|
||||||
std::cerr << "Failed to read " << filename2 << " ..." << std::endl;
|
std::cerr << "Failed to read " << filename2 << " ..." << std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -232,29 +208,27 @@ int main (int argc, char* argv[])
|
||||||
std::cout << "Constructed the input polygons in " << timer.time()
|
std::cout << "Constructed the input polygons in " << timer.time()
|
||||||
<< " seconds." << std::endl << std::endl;
|
<< " seconds." << std::endl << std::endl;
|
||||||
|
|
||||||
std::cout << "Starting boolean operation..." << std::endl ;
|
std::cout << "Starting boolean operation..." << std::endl;
|
||||||
timer.reset();
|
timer.reset();
|
||||||
timer.start();
|
timer.start();
|
||||||
try
|
try {
|
||||||
{
|
switch (bop[0]) {
|
||||||
switch ( bop[0] )
|
case 'i': S1.intersection(S2); break;
|
||||||
{
|
case 'u': S1.join(S2); break;
|
||||||
case 'i': S1.intersection(S2); break ;
|
|
||||||
case 'u': S1.join (S2); break ;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch( std::exception const& x )
|
catch(std::exception const& x) {
|
||||||
{
|
std::cout << "An exception occurred during the Boolean operation:"
|
||||||
std::cout << "Exception ocurred during the boolean operation:" << x.what()
|
<< x.what() << std::endl;
|
||||||
<< std::endl ;
|
|
||||||
}
|
}
|
||||||
catch(...)
|
catch(...) {
|
||||||
{
|
std::cout << "An exception occurred during the Boolean operation."
|
||||||
std::cout << "Exception ocurred during the boolean operation." << std::endl;
|
<< std::endl;
|
||||||
}
|
}
|
||||||
timer.stop();
|
timer.stop();
|
||||||
|
|
||||||
std::cout << "The intersection computation took "
|
std::cout << "The " << ( bop[0] == 'i' ? "intersection" : "union" )
|
||||||
|
<< " computation took "
|
||||||
<< timer.time() << " seconds." << std::endl;
|
<< timer.time() << " seconds." << std::endl;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue