diff options
author | Sebastian Parborg <darkdefende@gmail.com> | 2019-08-26 19:34:11 +0300 |
---|---|---|
committer | Sebastian Parborg <darkdefende@gmail.com> | 2019-09-13 11:36:05 +0300 |
commit | 57e55906f04a48a951fbbcfd7c197eef35ad4387 (patch) | |
tree | a4246ffdd501027a37d7329dca05de4d9ed19b15 /extern/quadriflow/src/merge-vertex.cpp | |
parent | 1c44d08a69eb3e66c7f942d748f549d6b8ca138f (diff) |
Add QuadriFlow remesher
Diffstat (limited to 'extern/quadriflow/src/merge-vertex.cpp')
-rw-r--r-- | extern/quadriflow/src/merge-vertex.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/extern/quadriflow/src/merge-vertex.cpp b/extern/quadriflow/src/merge-vertex.cpp new file mode 100644 index 00000000000..4c7b0a2bb9b --- /dev/null +++ b/extern/quadriflow/src/merge-vertex.cpp @@ -0,0 +1,44 @@ +#include "merge-vertex.hpp" + +#include "compare-key.hpp" + +#include <map> +#include <vector> + +namespace qflow { + +void merge_close(MatrixXd& V, MatrixXi& F, double threshold) +{ + std::map<Key3f, int> vid_maps; + std::vector<int> vid_compress(V.cols()); + for (int i = 0; i < V.cols(); ++i) { + Key3f key(V(0, i), V(1, i), V(2, i), threshold); + if (vid_maps.count(key)) { + vid_compress[i] = vid_maps[key]; + } + else { + V.col(vid_maps.size()) = V.col(i); + vid_compress[i] = vid_maps.size(); + vid_maps[key] = vid_compress[i]; + } + } + printf("Compress Vertex from %d to %d...\n", (int)V.cols(), (int)vid_maps.size()); + MatrixXd newV(3, vid_maps.size()); + memcpy(newV.data(), V.data(), sizeof(double) * 3 * vid_maps.size()); + V = std::move(newV); + int f_num = 0; + for (int i = 0; i < F.cols(); ++i) { + for (int j = 0; j < 3; ++j) { + F(j, f_num) = vid_compress[F(j, i)]; + } + if (F(0, f_num) != F(1, f_num) && F(0, f_num) != F(2, f_num) && F(1, f_num) != F(2, f_num)) { + f_num++; + } + } + printf("Compress Face from %d to %d...\n", (int)F.cols(), f_num); + MatrixXi newF(3, f_num); + memcpy(newF.data(), F.data(), sizeof(int) * 3 * f_num); + F = std::move(newF); +} + +} // namespace qflow |