Stefan commited on 2013-07-13 21:04:24
Showing 2 changed files, with 33 additions and 19 deletions.
| ... | ... |
@@ -8,8 +8,8 @@ |
| 8 | 8 |
#include <vector> |
| 9 | 9 |
|
| 10 | 10 |
#include <CGAL/Exact_predicates_exact_constructions_kernel.h> |
| 11 |
+#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> |
|
| 11 | 12 |
#include <CGAL/Gmpq.h> |
| 12 |
-#include <CGAL/number_utils.h> |
|
| 13 | 13 |
#include <CGAL/Polygon_2.h> |
| 14 | 14 |
#include <CGAL/Polygon_with_holes_2.h> |
| 15 | 15 |
#include <CGAL/Boolean_set_operations_2.h> |
| ... | ... |
@@ -38,6 +38,9 @@ void Polygons::clear() |
| 38 | 38 |
bool Polygons::addLayer(const Layer &layer, double eqDist) |
| 39 | 39 |
{
|
| 40 | 40 |
// convert all paths to simple polygons |
| 41 |
+ // once using exact construction kernel (needed by intersection, difference) |
|
| 42 |
+ // once using inexact construction kernel (faster offsetting) |
|
| 43 |
+ CgExPolyVec simplesEx; |
|
| 41 | 44 |
CgPolyVec simples; |
| 42 | 45 |
Layer::Paths::const_iterator path; |
| 43 | 46 |
for (path = layer.mPaths.begin(); path != layer.mPaths.end(); ++path) {
|
| ... | ... |
@@ -54,12 +57,15 @@ bool Polygons::addLayer(const Layer &layer, double eqDist) |
| 54 | 57 |
} |
| 55 | 58 |
// create simple polygon from path |
| 56 | 59 |
// - do not add last point to polygon, as it is the same as the first one |
| 60 |
+ CgExPoly simpleEx; |
|
| 57 | 61 |
CgPoly simple; |
| 58 | 62 |
Path::Points::const_iterator pt; |
| 59 |
- for (pt = path->mPoints.begin(); pt + 1 != path->mPoints.end(); ++pt) |
|
| 63 |
+ for (pt = path->mPoints.begin(); pt + 1 != path->mPoints.end(); ++pt) {
|
|
| 64 |
+ simpleEx.push_back(CgExPoint(pt->mX, pt->mY)); |
|
| 60 | 65 |
simple.push_back(CgPoint(pt->mX, pt->mY)); |
| 66 |
+ } |
|
| 61 | 67 |
// check that polygon is simple |
| 62 |
- if (!simple.is_simple()) {
|
|
| 68 |
+ if (!simpleEx.is_simple()) {
|
|
| 63 | 69 |
std::cerr << "path is not simple (maybe self-itersecting?)" << std::endl; |
| 64 | 70 |
Path::Points::const_iterator pt; |
| 65 | 71 |
for (pt = path->mPoints.begin(); pt != path->mPoints.end(); ++pt) |
| ... | ... |
@@ -67,9 +73,12 @@ bool Polygons::addLayer(const Layer &layer, double eqDist) |
| 67 | 73 |
return false; |
| 68 | 74 |
} |
| 69 | 75 |
// ensure orientation is clockwise (must be the same for all polygons) |
| 70 |
- if (simple.is_clockwise_oriented()) |
|
| 76 |
+ if (simpleEx.is_clockwise_oriented()) {
|
|
| 77 |
+ simpleEx.reverse_orientation(); |
|
| 71 | 78 |
simple.reverse_orientation(); |
| 79 |
+ } |
|
| 72 | 80 |
// collect polygons |
| 81 |
+ simplesEx.push_back(simpleEx); |
|
| 73 | 82 |
simples.push_back(simple); |
| 74 | 83 |
} // for path |
| 75 | 84 |
|
| ... | ... |
@@ -77,17 +86,17 @@ bool Polygons::addLayer(const Layer &layer, double eqDist) |
| 77 | 86 |
// deterine which polygon is contained in which one |
| 78 | 87 |
std::vector<ssize_t> contained_in; // idx: contained poly, val: containing poly |
| 79 | 88 |
ssize_t ia, ib; |
| 80 |
- CgPolyVec::const_iterator a, b; |
|
| 81 |
- for (a = simples.begin(); a != simples.end(); ++a) |
|
| 89 |
+ CgExPolyVec::const_iterator a, b; |
|
| 90 |
+ for (a = simplesEx.begin(); a != simplesEx.end(); ++a) |
|
| 82 | 91 |
contained_in.push_back(-1); // not contained in any polygon |
| 83 |
- for (a = simples.begin(), ia = 0; a != simples.end(); ++a, ++ia) {
|
|
| 92 |
+ for (a = simplesEx.begin(), ia = 0; a != simplesEx.end(); ++a, ++ia) {
|
|
| 84 | 93 |
b = a; |
| 85 | 94 |
ib = ia; |
| 86 |
- for (++b, ++ib; b != simples.end(); ++b, ++ib) {
|
|
| 95 |
+ for (++b, ++ib; b != simplesEx.end(); ++b, ++ib) {
|
|
| 87 | 96 |
// A and B intersect each other |
| 88 | 97 |
if (CGAL::do_intersect(*a, *b)) {
|
| 89 | 98 |
// compute differences A - B and B - A |
| 90 |
- CgPolyHolesVec a_b, b_a; |
|
| 99 |
+ CgExPolyHolesVec a_b, b_a; |
|
| 91 | 100 |
CGAL::difference(*a, *b, std::back_inserter(a_b)); |
| 92 | 101 |
CGAL::difference(*b, *a, std::back_inserter(b_a)); |
| 93 | 102 |
if (a_b.empty()) {
|
| ... | ... |
@@ -181,10 +190,9 @@ bool Polygons::createInnerOffset(double offset, Polygons &offsetPolys) const |
| 181 | 190 |
for (poly = mPolys.begin(); poly != mPolys.end(); ++poly) {
|
| 182 | 191 |
|
| 183 | 192 |
// create inner offset polygons |
| 184 |
- CGAL::Lazy_exact_nt<CGAL::Gmpq> offs(offset); |
|
| 185 | 193 |
CgPolyHolesPtrVec offPolys = |
| 186 | 194 |
CGAL::create_interior_skeleton_and_offset_polygons_with_holes_2( |
| 187 |
- offs, *poly); |
|
| 195 |
+ offset, *poly); |
|
| 188 | 196 |
|
| 189 | 197 |
// add offset polygons to output polygons |
| 190 | 198 |
CgPolyHolesPtrVec::const_iterator offPoly; |
| ... | ... |
@@ -250,9 +258,8 @@ bool Polygons::fillInnerOffset(double offset, Polygons &offsetPolys) const |
| 250 | 258 |
for (i = 1; ; ++i) {
|
| 251 | 259 |
|
| 252 | 260 |
// create inner offset polygons |
| 253 |
- CGAL::Lazy_exact_nt<CGAL::Gmpq> offs_i(offset * i); |
|
| 254 | 261 |
CgPolyPtrVec offPolys = |
| 255 |
- CGAL::create_offset_polygons_2<CgPoly>(offs_i, *skel); |
|
| 262 |
+ CGAL::create_offset_polygons_2<CgPoly>(offset * i, *skel); |
|
| 256 | 263 |
|
| 257 | 264 |
// no offset polygons -> done |
| 258 | 265 |
if (offPolys.empty()) |
| ... | ... |
@@ -302,12 +309,10 @@ bool Polygons::createOuterOffsetPoly(const CgPolyHoles &poly, double offset, |
| 302 | 309 |
CgPolyHoles &offsetPoly) |
| 303 | 310 |
{
|
| 304 | 311 |
// calculate outer offset of outer bondary |
| 305 |
- CGAL::Lazy_exact_nt<CGAL::Gmpq> offs(offset); |
|
| 306 | 312 |
const CgPoly &outer = poly.outer_boundary(); |
| 307 |
- CgKern kern; |
|
| 308 | 313 |
CgPolyPtrVec outOffPolys = |
| 309 | 314 |
CGAL::create_exterior_skeleton_and_offset_polygons_2( |
| 310 |
- offs, outer, kern, kern); |
|
| 315 |
+ offset, outer); |
|
| 311 | 316 |
/* outer Offset should now contain 2 polygons, |
| 312 | 317 |
the artificially added very outer boundary and the offset polygon */ |
| 313 | 318 |
if (outOffPolys.size() != 2) {
|
| ... | ... |
@@ -323,7 +328,7 @@ bool Polygons::createOuterOffsetPoly(const CgPolyHoles &poly, double offset, |
| 323 | 328 |
holeRev.reverse_orientation(); |
| 324 | 329 |
CgPolyPtrVec inOffPolys = |
| 325 | 330 |
CGAL::create_interior_skeleton_and_offset_polygons_2( |
| 326 |
- offs, holeRev, kern, kern); |
|
| 331 |
+ offset, holeRev); |
|
| 327 | 332 |
CgPolyPtrVec::iterator inOff; // add inner offset polys as new holes |
| 328 | 333 |
for (inOff = inOffPolys.begin(); inOff != inOffPolys.end(); ++inOff) {
|
| 329 | 334 |
(*inOff)->reverse_orientation(); // re-reverse (make poly a hole again) |
| ... | ... |
@@ -10,6 +10,7 @@ |
| 10 | 10 |
#include <vector> |
| 11 | 11 |
|
| 12 | 12 |
#include <CGAL/Exact_predicates_exact_constructions_kernel.h> |
| 13 |
+#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> |
|
| 13 | 14 |
#include <CGAL/Polygon_2.h> |
| 14 | 15 |
#include <CGAL/Polygon_with_holes_2.h> |
| 15 | 16 |
#include <CGAL/create_straight_skeleton_from_polygon_with_holes_2.h> |
| ... | ... |
@@ -19,16 +20,24 @@ |
| 19 | 20 |
/// a set of polygons |
| 20 | 21 |
class Polygons {
|
| 21 | 22 |
public: |
| 22 |
- typedef CGAL::Exact_predicates_exact_constructions_kernel CgKern; |
|
| 23 |
+ typedef CGAL::Exact_predicates_exact_constructions_kernel CgExKern; |
|
| 24 |
+ |
|
| 25 |
+ typedef CgExKern::Point_2 CgExPoint; |
|
| 26 |
+ typedef CGAL::Polygon_2<CgExKern> CgExPoly; |
|
| 27 |
+ typedef std::vector<CgExPoly> CgExPolyVec; |
|
| 28 |
+ typedef CGAL::Polygon_with_holes_2<CgExKern> CgExPolyHoles; |
|
| 29 |
+ typedef std::vector<CgExPolyHoles> CgExPolyHolesVec; |
|
| 30 |
+ |
|
| 31 |
+ typedef CGAL::Exact_predicates_inexact_constructions_kernel CgKern; |
|
| 23 | 32 |
|
| 24 | 33 |
typedef CgKern::Point_2 CgPoint; |
| 25 | 34 |
typedef CGAL::Polygon_2<CgKern> CgPoly; |
| 26 | 35 |
typedef CGAL::Polygon_with_holes_2<CgKern> CgPolyHoles; |
| 27 |
- typedef CGAL::Straight_skeleton_2<CgKern> CgSs; |
|
| 28 | 36 |
typedef std::vector<CgPoly> CgPolyVec; |
| 29 | 37 |
typedef std::vector<CgPolyHoles> CgPolyHolesVec; |
| 30 | 38 |
typedef boost::shared_ptr<CgPoly> CgPolyPtr; |
| 31 | 39 |
typedef boost::shared_ptr<CgPolyHoles> CgPolyHolesPtr; |
| 40 |
+ typedef CGAL::Straight_skeleton_2<CgKern> CgSs; |
|
| 32 | 41 |
typedef boost::shared_ptr<CgSs> CgSsPtr; |
| 33 | 42 |
typedef std::vector<CgPolyPtr> CgPolyPtrVec; |
| 34 | 43 |
typedef std::vector<CgPolyHolesPtr> CgPolyHolesPtrVec; |
| 35 | 44 |