1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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
|