mesh_simplify_dissolve_edges.patch 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. diff -r e82d852e4fb0 include/carve/mesh_simplify.hpp
  2. --- a/include/carve/mesh_simplify.hpp Wed Jan 15 13:16:14 2014 +1100
  3. +++ b/include/carve/mesh_simplify.hpp Fri Feb 28 19:09:02 2014 +0600
  4. @@ -32,8 +32,6 @@
  5. #include <algorithm>
  6. #include <vector>
  7. -#include "write_ply.hpp"
  8. -
  9. namespace carve {
  10. namespace mesh {
  11. @@ -1184,6 +1182,33 @@
  12. return modifications;
  13. }
  14. + void dissolveMeshEdges(mesh_t *mesh, std::unordered_set<edge_t *> dissolve_edges) {
  15. + while (dissolve_edges.size()) {
  16. + MeshSet<3>::edge_t *edge = *dissolve_edges.begin();
  17. + if (edge->face == edge->rev->face) {
  18. + dissolve_edges.erase(edge);
  19. + continue;
  20. + }
  21. +
  22. + MeshSet<3>::edge_t *removed = edge->mergeFaces();
  23. + if (removed == NULL) {
  24. + dissolve_edges.erase(edge);
  25. + } else {
  26. + MeshSet<3>::edge_t *e = removed;
  27. + do {
  28. + MeshSet<3>::edge_t *n = e->next;
  29. + dissolve_edges.erase(std::min(e, e->rev));
  30. + delete e->rev;
  31. + delete e;
  32. + e = n;
  33. + } while (e != removed);
  34. + }
  35. + }
  36. +
  37. + removeRemnantFaces(mesh);
  38. + cleanFaceEdges(mesh);
  39. + mesh->cacheEdges();
  40. + }
  41. size_t improveMesh(meshset_t *meshset,
  42. @@ -1445,7 +1470,7 @@
  43. heapval_t last;
  44. std::vector<heapval_t> heap;
  45. - point_enumerator_t(vector_t _origin, int _base, int _n_dp) : origin(_origin), rounding_fac(pow(_base, _n_dp)), last(-1.0, _origin), heap() {
  46. + point_enumerator_t(vector_t _origin, int _base, int _n_dp) : origin(_origin), rounding_fac(pow((double)_base, _n_dp)), last(-1.0, _origin), heap() {
  47. for (size_t i = 0; i < (1 << 3); ++i) {
  48. vector_t t = origin;
  49. for (size_t j = 0; j < 3; ++j) {
  50. @@ -1502,7 +1527,7 @@
  51. }
  52. aabb_t getAABB() const {
  53. - std::set<face_t *>::iterator i = faces.begin();
  54. + std::set<face_t *>::const_iterator i = faces.begin();
  55. aabb_t aabb = (*i)->getAABB();
  56. while (++i != faces.end()) {
  57. aabb.unionAABB((*i)->getAABB());