123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440 |
- diff -r e82d852e4fb0 lib/csg_collector.cpp
- --- a/lib/csg_collector.cpp Wed Jan 15 13:16:14 2014 +1100
- +++ b/lib/csg_collector.cpp Mon Jan 27 17:01:46 2014 +0600
- @@ -21,6 +21,7 @@
-
- #include <carve/csg.hpp>
- #include <iostream>
- +#include "csg_collector.hpp"
- #include "intersect_debug.hpp"
-
- #if defined(CARVE_DEBUG_WRITE_PLY_DATA)
- diff -r e82d852e4fb0 lib/face.cpp
- --- a/lib/face.cpp Wed Jan 15 13:16:14 2014 +1100
- +++ b/lib/face.cpp Mon Jan 27 17:01:46 2014 +0600
- @@ -21,61 +21,69 @@
-
- #include <carve/poly.hpp>
-
- -double CALC_X(const carve::geom::plane<3> &p, double y, double z) { return -(p.d + p.N.y * y + p.N.z * z) / p.N.x; }
- -double CALC_Y(const carve::geom::plane<3> &p, double x, double z) { return -(p.d + p.N.x * x + p.N.z * z) / p.N.y; }
- -double CALC_Z(const carve::geom::plane<3> &p, double x, double y) { return -(p.d + p.N.x * x + p.N.y * y) / p.N.z; }
- +namespace {
- +
- + double CALC_X(const carve::geom::plane<3> &p, double y, double z) { return -(p.d + p.N.y * y + p.N.z * z) / p.N.x; }
- + double CALC_Y(const carve::geom::plane<3> &p, double x, double z) { return -(p.d + p.N.x * x + p.N.z * z) / p.N.y; }
- + double CALC_Z(const carve::geom::plane<3> &p, double x, double y) { return -(p.d + p.N.x * x + p.N.y * y) / p.N.z; }
- +
- +} // namespace
-
- namespace carve {
- namespace poly {
-
- - carve::geom2d::P2 _project_1(const carve::geom3d::Vector &v) {
- - return carve::geom::VECTOR(v.z, v.y);
- - }
- + namespace {
-
- - carve::geom2d::P2 _project_2(const carve::geom3d::Vector &v) {
- - return carve::geom::VECTOR(v.x, v.z);
- - }
- + carve::geom2d::P2 _project_1(const carve::geom3d::Vector &v) {
- + return carve::geom::VECTOR(v.z, v.y);
- + }
-
- - carve::geom2d::P2 _project_3(const carve::geom3d::Vector &v) {
- - return carve::geom::VECTOR(v.y, v.x);
- - }
- + carve::geom2d::P2 _project_2(const carve::geom3d::Vector &v) {
- + return carve::geom::VECTOR(v.x, v.z);
- + }
-
- - carve::geom2d::P2 _project_4(const carve::geom3d::Vector &v) {
- - return carve::geom::VECTOR(v.y, v.z);
- - }
- + carve::geom2d::P2 _project_3(const carve::geom3d::Vector &v) {
- + return carve::geom::VECTOR(v.y, v.x);
- + }
-
- - carve::geom2d::P2 _project_5(const carve::geom3d::Vector &v) {
- - return carve::geom::VECTOR(v.z, v.x);
- - }
- + carve::geom2d::P2 _project_4(const carve::geom3d::Vector &v) {
- + return carve::geom::VECTOR(v.y, v.z);
- + }
-
- - carve::geom2d::P2 _project_6(const carve::geom3d::Vector &v) {
- - return carve::geom::VECTOR(v.x, v.y);
- - }
- + carve::geom2d::P2 _project_5(const carve::geom3d::Vector &v) {
- + return carve::geom::VECTOR(v.z, v.x);
- + }
-
- + carve::geom2d::P2 _project_6(const carve::geom3d::Vector &v) {
- + return carve::geom::VECTOR(v.x, v.y);
- + }
-
- - carve::geom3d::Vector _unproject_1(const carve::geom2d::P2 &p, const carve::geom3d::Plane &plane_eqn) {
- - return carve::geom::VECTOR(CALC_X(plane_eqn, p.y, p.x), p.y, p.x);
- - }
-
- - carve::geom3d::Vector _unproject_2(const carve::geom2d::P2 &p, const carve::geom3d::Plane &plane_eqn) {
- - return carve::geom::VECTOR(p.x, CALC_Y(plane_eqn, p.x, p.y), p.y);
- - }
- + carve::geom3d::Vector _unproject_1(const carve::geom2d::P2 &p, const carve::geom3d::Plane &plane_eqn) {
- + return carve::geom::VECTOR(CALC_X(plane_eqn, p.y, p.x), p.y, p.x);
- + }
-
- - carve::geom3d::Vector _unproject_3(const carve::geom2d::P2 &p, const carve::geom3d::Plane &plane_eqn) {
- - return carve::geom::VECTOR(p.y, p.x, CALC_Z(plane_eqn, p.y, p.x));
- - }
- + carve::geom3d::Vector _unproject_2(const carve::geom2d::P2 &p, const carve::geom3d::Plane &plane_eqn) {
- + return carve::geom::VECTOR(p.x, CALC_Y(plane_eqn, p.x, p.y), p.y);
- + }
-
- - carve::geom3d::Vector _unproject_4(const carve::geom2d::P2 &p, const carve::geom3d::Plane &plane_eqn) {
- - return carve::geom::VECTOR(CALC_X(plane_eqn, p.x, p.y), p.x, p.y);
- - }
- + carve::geom3d::Vector _unproject_3(const carve::geom2d::P2 &p, const carve::geom3d::Plane &plane_eqn) {
- + return carve::geom::VECTOR(p.y, p.x, CALC_Z(plane_eqn, p.y, p.x));
- + }
-
- - carve::geom3d::Vector _unproject_5(const carve::geom2d::P2 &p, const carve::geom3d::Plane &plane_eqn) {
- - return carve::geom::VECTOR(p.y, CALC_Y(plane_eqn, p.y, p.x), p.x);
- - }
- + carve::geom3d::Vector _unproject_4(const carve::geom2d::P2 &p, const carve::geom3d::Plane &plane_eqn) {
- + return carve::geom::VECTOR(CALC_X(plane_eqn, p.x, p.y), p.x, p.y);
- + }
-
- - carve::geom3d::Vector _unproject_6(const carve::geom2d::P2 &p, const carve::geom3d::Plane &plane_eqn) {
- - return carve::geom::VECTOR(p.x, p.y, CALC_Z(plane_eqn, p.x, p.y));
- - }
- + carve::geom3d::Vector _unproject_5(const carve::geom2d::P2 &p, const carve::geom3d::Plane &plane_eqn) {
- + return carve::geom::VECTOR(p.y, CALC_Y(plane_eqn, p.y, p.x), p.x);
- + }
- +
- + carve::geom3d::Vector _unproject_6(const carve::geom2d::P2 &p, const carve::geom3d::Plane &plane_eqn) {
- + return carve::geom::VECTOR(p.x, p.y, CALC_Z(plane_eqn, p.x, p.y));
- + }
- +
- + } // namespace
-
- static carve::geom2d::P2 (*project_tab[2][3])(const carve::geom3d::Vector &) = {
- { &_project_1, &_project_2, &_project_3 },
- diff -r e82d852e4fb0 lib/geom2d.cpp
- --- a/lib/geom2d.cpp Wed Jan 15 13:16:14 2014 +1100
- +++ b/lib/geom2d.cpp Mon Jan 27 17:01:46 2014 +0600
- @@ -157,9 +157,9 @@
- return pointInPoly(points, p2_adapt_ident(), p);
- }
-
- - int lineSegmentPolyIntersections(const P2Vector &points,
- - LineSegment2 line,
- - std::vector<PolyIntersectionInfo> &out) {
- + static int lineSegmentPolyIntersections(const P2Vector &points,
- + LineSegment2 line,
- + std::vector<PolyIntersectionInfo> &out) {
- int count = 0;
-
- if (line.v2 < line.v1) { line.flip(); }
- @@ -239,9 +239,9 @@
- }
- };
-
- - int sortedLineSegmentPolyIntersections(const P2Vector &points,
- - LineSegment2 line,
- - std::vector<PolyIntersectionInfo> &out) {
- + static int sortedLineSegmentPolyIntersections(const P2Vector &points,
- + LineSegment2 line,
- + std::vector<PolyIntersectionInfo> &out) {
-
- bool swapped = line.v2 < line.v1;
-
- diff -r e82d852e4fb0 lib/intersect.cpp
- --- a/lib/intersect.cpp Wed Jan 15 13:16:14 2014 +1100
- +++ b/lib/intersect.cpp Mon Jan 27 17:01:46 2014 +0600
- @@ -1378,9 +1378,9 @@
- * @param result_list
- * @param shared_edge_ptr
- */
- -void returnSharedEdges(carve::csg::V2Set &shared_edges,
- - std::list<carve::mesh::MeshSet<3> *> &result_list,
- - carve::csg::V2Set *shared_edge_ptr) {
- +static void returnSharedEdges(carve::csg::V2Set &shared_edges,
- + std::list<carve::mesh::MeshSet<3> *> &result_list,
- + carve::csg::V2Set *shared_edge_ptr) {
- // need to convert shared edges to point into result
- typedef std::map<carve::geom3d::Vector, carve::mesh::MeshSet<3>::vertex_t *> remap_type;
- remap_type remap;
- diff -r e82d852e4fb0 lib/intersect_face_division.cpp
- --- a/lib/intersect_face_division.cpp Wed Jan 15 13:16:14 2014 +1100
- +++ b/lib/intersect_face_division.cpp Mon Jan 27 17:01:46 2014 +0600
- @@ -1455,7 +1455,7 @@
- std::vector<carve::mesh::MeshSet<3>::vertex_t *> base_loop;
- std::list<std::vector<carve::mesh::MeshSet<3>::vertex_t *> > hole_loops;
-
- - bool face_edge_intersected = assembleBaseLoop(face, data, base_loop, hooks);
- + /*bool face_edge_intersected = */assembleBaseLoop(face, data, base_loop, hooks);
-
- detail::FV2SMap::const_iterator fse_iter = data.face_split_edges.find(face);
-
- diff -r e82d852e4fb0 lib/math.cpp
- --- a/lib/math.cpp Wed Jan 15 13:16:14 2014 +1100
- +++ b/lib/math.cpp Mon Jan 27 17:01:46 2014 +0600
- @@ -42,20 +42,21 @@
- Root(double r, int m) : root(r), multiplicity(m) {}
- };
-
- - void cplx_sqrt(double re, double im,
- - double &re_1, double &im_1,
- - double &re_2, double &im_2) {
- - if (re == 0.0 && im == 0.0) {
- - re_1 = re_2 = re;
- - im_1 = im_2 = im;
- - } else {
- - double d = sqrt(re * re + im * im);
- - re_1 = sqrt((d + re) / 2.0);
- - re_2 = re_1;
- - im_1 = fabs(sqrt((d - re) / 2.0));
- - im_2 = -im_1;
- + namespace {
- + void cplx_sqrt(double re, double im,
- + double &re_1, double &im_1,
- + double &re_2, double &im_2) {
- + if (re == 0.0 && im == 0.0) {
- + re_1 = re_2 = re;
- + im_1 = im_2 = im;
- + } else {
- + double d = sqrt(re * re + im * im);
- + re_1 = sqrt((d + re) / 2.0);
- + re_2 = re_1;
- + im_1 = fabs(sqrt((d - re) / 2.0));
- + im_2 = -im_1;
- + }
- }
- - }
-
- void cplx_cbrt(double re, double im,
- double &re_1, double &im_1,
- @@ -76,109 +77,110 @@
- }
- }
-
- - void add_root(std::vector<Root> &roots, double root) {
- - for (size_t i = 0; i < roots.size(); ++i) {
- - if (roots[i].root == root) {
- - roots[i].multiplicity++;
- + void add_root(std::vector<Root> &roots, double root) {
- + for (size_t i = 0; i < roots.size(); ++i) {
- + if (roots[i].root == root) {
- + roots[i].multiplicity++;
- + return;
- + }
- + }
- + roots.push_back(Root(root));
- + }
- +
- + void linear_roots(double c1, double c0, std::vector<Root> &roots) {
- + roots.push_back(Root(c0 / c1));
- + }
- +
- + void quadratic_roots(double c2, double c1, double c0, std::vector<Root> &roots) {
- + if (fabs(c2) < EPS) {
- + linear_roots(c1, c0, roots);
- return;
- }
- - }
- - roots.push_back(Root(root));
- - }
-
- - void linear_roots(double c1, double c0, std::vector<Root> &roots) {
- - roots.push_back(Root(c0 / c1));
- - }
- + double p = 0.5 * c1 / c2;
- + double dis = p * p - c0 / c2;
-
- - void quadratic_roots(double c2, double c1, double c0, std::vector<Root> &roots) {
- - if (fabs(c2) < EPS) {
- - linear_roots(c1, c0, roots);
- - return;
- + if (dis > 0.0) {
- + dis = sqrt(dis);
- + if (-p - dis != -p + dis) {
- + roots.push_back(Root(-p - dis));
- + roots.push_back(Root(-p + dis));
- + } else {
- + roots.push_back(Root(-p, 2));
- + }
- + }
- }
-
- - double p = 0.5 * c1 / c2;
- - double dis = p * p - c0 / c2;
- + void cubic_roots(double c3, double c2, double c1, double c0, std::vector<Root> &roots) {
- + int n_sol = 0;
- + double _r[3];
-
- - if (dis > 0.0) {
- - dis = sqrt(dis);
- - if (-p - dis != -p + dis) {
- - roots.push_back(Root(-p - dis));
- - roots.push_back(Root(-p + dis));
- + if (fabs(c3) < EPS) {
- + quadratic_roots(c2, c1, c0, roots);
- + return;
- + }
- +
- + if (fabs(c0) < EPS) {
- + quadratic_roots(c3, c2, c1, roots);
- + add_root(roots, 0.0);
- + return;
- + }
- +
- + double xN = -c2 / (3.0 * c3);
- + double yN = c0 + xN * (c1 + xN * (c2 + c3 * xN));
- +
- + double delta_sq = (c2 * c2 - 3.0 * c3 * c1) / (9.0 * c3 * c3);
- + double h_sq = 4.0 / 9.0 * (c2 * c2 - 3.0 * c3 * c1) * (delta_sq * delta_sq);
- + double dis = yN * yN - h_sq;
- +
- + if (dis > EPS) {
- + // One real root, two complex roots.
- +
- + double dis_sqrt = sqrt(dis);
- + double r_p = yN - dis_sqrt;
- + double r_q = yN + dis_sqrt;
- + double p = cbrt(fabs(r_p)/(2.0 * c3));
- + double q = cbrt(fabs(r_q)/(2.0 * c3));
- +
- + if (r_p > 0.0) p = -p;
- + if (r_q > 0.0) q = -q;
- +
- + _r[0] = xN + p + q;
- + n_sol = 1;
- +
- + double re = xN - p * .5 - q * .5;
- + double im = p * M_SQRT_3_4 - q * M_SQRT_3_4;
- +
- + // root 2: xN + p * exp(M_2PI_3.i) + q * exp(-M_2PI_3.i);
- + // root 3: complex conjugate of root 2
- +
- + if (im < EPS) {
- + _r[1] = _r[2] = re;
- + n_sol += 2;
- + }
- + } else if (dis < -EPS) {
- + // Three distinct real roots.
- + double theta = acos(-yN / sqrt(h_sq)) / 3.0;
- + double delta = sqrt(c2 * c2 - 3.0 * c3 * c1) / (3.0 * c3);
- +
- + _r[0] = xN + (2.0 * delta) * cos(theta);
- + _r[1] = xN + (2.0 * delta) * cos(M_2PI_3 - theta);
- + _r[2] = xN + (2.0 * delta) * cos(M_2PI_3 + theta);
- + n_sol = 3;
- } else {
- - roots.push_back(Root(-p, 2));
- + // Three real roots (two or three equal).
- + double r = yN / (2.0 * c3);
- + double delta = cbrt(r);
- +
- + _r[0] = xN + delta;
- + _r[1] = xN + delta;
- + _r[2] = xN - 2.0 * delta;
- + n_sol = 3;
- }
- - }
- - }
-
- - void cubic_roots(double c3, double c2, double c1, double c0, std::vector<Root> &roots) {
- - int n_sol = 0;
- - double _r[3];
- -
- - if (fabs(c3) < EPS) {
- - quadratic_roots(c2, c1, c0, roots);
- - return;
- - }
- -
- - if (fabs(c0) < EPS) {
- - quadratic_roots(c3, c2, c1, roots);
- - add_root(roots, 0.0);
- - return;
- - }
- -
- - double xN = -c2 / (3.0 * c3);
- - double yN = c0 + xN * (c1 + xN * (c2 + c3 * xN));
- -
- - double delta_sq = (c2 * c2 - 3.0 * c3 * c1) / (9.0 * c3 * c3);
- - double h_sq = 4.0 / 9.0 * (c2 * c2 - 3.0 * c3 * c1) * (delta_sq * delta_sq);
- - double dis = yN * yN - h_sq;
- -
- - if (dis > EPS) {
- - // One real root, two complex roots.
- -
- - double dis_sqrt = sqrt(dis);
- - double r_p = yN - dis_sqrt;
- - double r_q = yN + dis_sqrt;
- - double p = cbrt(fabs(r_p)/(2.0 * c3));
- - double q = cbrt(fabs(r_q)/(2.0 * c3));
- -
- - if (r_p > 0.0) p = -p;
- - if (r_q > 0.0) q = -q;
- -
- - _r[0] = xN + p + q;
- - n_sol = 1;
- -
- - double re = xN - p * .5 - q * .5;
- - double im = p * M_SQRT_3_4 - q * M_SQRT_3_4;
- -
- - // root 2: xN + p * exp(M_2PI_3.i) + q * exp(-M_2PI_3.i);
- - // root 3: complex conjugate of root 2
- -
- - if (im < EPS) {
- - _r[1] = _r[2] = re;
- - n_sol += 2;
- + for (int i=0; i < n_sol; i++) {
- + add_root(roots, _r[i]);
- }
- - } else if (dis < -EPS) {
- - // Three distinct real roots.
- - double theta = acos(-yN / sqrt(h_sq)) / 3.0;
- - double delta = sqrt(c2 * c2 - 3.0 * c3 * c1) / (3.0 * c3);
- -
- - _r[0] = xN + (2.0 * delta) * cos(theta);
- - _r[1] = xN + (2.0 * delta) * cos(M_2PI_3 - theta);
- - _r[2] = xN + (2.0 * delta) * cos(M_2PI_3 + theta);
- - n_sol = 3;
- - } else {
- - // Three real roots (two or three equal).
- - double r = yN / (2.0 * c3);
- - double delta = cbrt(r);
- -
- - _r[0] = xN + delta;
- - _r[1] = xN + delta;
- - _r[2] = xN - 2.0 * delta;
- - n_sol = 3;
- - }
- -
- - for (int i=0; i < n_sol; i++) {
- - add_root(roots, _r[i]);
- }
- }
-
- diff -r e82d852e4fb0 lib/triangulator.cpp
- --- a/lib/triangulator.cpp Wed Jan 15 13:16:14 2014 +1100
- +++ b/lib/triangulator.cpp Mon Jan 27 17:01:46 2014 +0600
- @@ -718,10 +718,10 @@
-
-
-
- -bool testCandidateAttachment(const std::vector<std::vector<carve::geom2d::P2> > &poly,
- - std::vector<std::pair<size_t, size_t> > ¤t_f_loop,
- - size_t curr,
- - carve::geom2d::P2 hole_min) {
- +static bool testCandidateAttachment(const std::vector<std::vector<carve::geom2d::P2> > &poly,
- + std::vector<std::pair<size_t, size_t> > ¤t_f_loop,
- + size_t curr,
- + carve::geom2d::P2 hole_min) {
- const size_t SZ = current_f_loop.size();
-
- if (!carve::geom2d::internalToAngle(pvert(poly, current_f_loop[(curr+1) % SZ]),
|