CGAL库学习系列之一
核心必看部分
2D Convex Hulls and Extreme Points
2 2D Polygons
2.1 The Polygon Class
The following example creates a polygon and illustrates the usage of some member functions.
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polygon_2.h>
#include <iostream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point;
typedef CGAL::Polygon_2<K> Polygon_2;
using std::cout; using std::endl;
int main()
{
Point points[] = { Point(0,0), Point(5.1,0), Point(1,1), Point(0.5,6)};
Polygon_2 pgn(points, points+4);
// check if the polygon is simple.
cout << "The polygon is " <<
(pgn.is_simple() ? "" : "not ") << "simple." << endl;
// check if the polygon is convex
cout << "The polygon is " <<
(pgn.is_convex() ? "" : "not ") << "convex." << endl;
return 0;
}
# output
The polygon is simple.
The polygon is not convex.
2.2 Algorithms Operating on Sequences of Points
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polygon_2_algorithms.h>
#include <iostream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point;
using std::cout; using std::endl;
void check_inside(Point pt, Point *pgn_begin, Point *pgn_end, K traits)
{
cout << "The point " << pt;
switch(CGAL::bounded_side_2(pgn_begin, pgn_end,pt, traits)) {
case CGAL::ON_BOUNDED_SIDE :
cout << " is inside the polygon.\n";
break;
case CGAL::ON_BOUNDARY:
cout << " is on the polygon boundary.\n";
break;
case CGAL::ON_UNBOUNDED_SIDE:
cout << " is outside the polygon.\n";
break;
}
}
int main()
{
Point points[] = { Point(0,0), Point(5.1,0), Point(1,1), Point(0.5,6)};
// check if the polygon is simple.
cout << "The polygon is "
<< (CGAL::is_simple_2(points, points+4, K()) ? "" : "not ")
<< "simple." << endl;
check_inside(Point(0.5, 0.5), points, points+4, K());
check_inside(Point(1.5, 2.5), points, points+4, K());
check_inside(Point(2.5, 0), points, points+4, K());
return 0;
}
# output
The polygon is simple.
The point 0.5 0.5 is inside the polygon.
The point 1.5 2.5 is outside the polygon.
The point 2.5 0 is on the polygon boundary.
2.3 Polygons in 3D Space
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Projection_traits_yz_3.h>
#include <CGAL/Polygon_2_algorithms.h>
#include <iostream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_3 Point_3;
int main()
{
Point_3 points[4] = { Point_3(0,1,1), Point_3(0,2,1), Point_3(0,2,2), Point_3(0,1,2) };
bool b = CGAL::is_simple_2(points,
points+4,
CGAL::Projection_traits_yz_3<K>());
if (!b){
std::cerr << "Error polygon is not simple" << std::endl;
return 1;
}
std::cout << "yes" << std::endl;
return 0;
}
# output
yes
3D Polyhedral Surface
3.1 First Example Using Defaults
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Polyhedron_3.h>
typedef CGAL::Simple_cartesian<double> Kernel;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
typedef Polyhedron::Halfedge_handle Halfedge_handle;
int main() {
Polyhedron P;
Halfedge_handle h = P.make_tetrahedron();
if ( P.is_tetrahedron(h)){
std::cout << 0 << std::endl;
return 0;
}
std::cout << 1 << std::endl;
return 1;
}
# output
0
3.2 Example with Geometry in Vertices
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Polyhedron_3.h>
#include <iostream>
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_3 Point_3;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
typedef Polyhedron::Vertex_iterator Vertex_iterator;
int main() {
Point_3 p( 1.0, 0.0, 0.0);
Point_3 q( 0.0, 1.0, 0.0);
Point_3 r( 0.0, 0.0, 1.0);
Point_3 s( 0.0, 0.0, 0.0);
Polyhedron P;
P.make_tetrahedron( p, q, r, s);
CGAL::set_ascii_mode( std::cout);
for ( Vertex_iterator v = P.vertices_begin(); v != P.vertices_end(); ++v)
std::cout << v->point() << std::endl;
return 0;
}
# output
0 0 0
0 0 1
0 1 0
1 0 0
Halfedge Data Structures
Surface Mesh
样例1解析
#include <iostream>
#include <CGAL/Simple_cartesian.h>
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Segment_2 Segment_2;
int main()
{
Point_2 p(1,1), q(10,10);
std::cout << "p = " << p << std::endl;
std::cout << "q = " << q.x() << " " << q.y() << std::endl;
std::cout << "sqdist(p,q) = "
<< CGAL::squared_distance(p,q) << std::endl;
Segment_2 s(p,q);
Point_2 m(5, 9);
std::cout << "m = " << m << std::endl;
std::cout << "sqdist(Segment_2(p,q), m) = "
<< CGAL::squared_distance(s,m) << std::endl;
std::cout << "p, q, and m ";
switch (CGAL::orientation(p,q,m)){
case CGAL::COLLINEAR:
std::cout << "are collinear\n";
break;
case CGAL::LEFT_TURN:
std::cout << "make a left turn\n";
break;
case CGAL::RIGHT_TURN:
std::cout << "make a right turn\n";
break;
}
std::cout << " midpoint(p,q) = " << CGAL::midpoint(p,q) << std::endl;
return 0;
}
p = 1 1
q = 10 10
sqdist(p,q) = 162
m = 5 9
sqdist(Segment_2(p,q), m) = 8
p, q, and m make a left turn
midpoint(p,q) = 5.5 5.5