Repository navigation
Expand file tree
/
Copy pathscript.h
More file actions
104 lines (82 loc) · 2.03 KB
/
Copy pathscript.h
File metadata and controls
104 lines (82 loc) · 2.03 KB
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#pragma once
#include <GLFW/glfw3.h>
#include <imgui.h>
// Salamesh core
#include <app_interface.h>
#include <script.h>
#include <input_states.h>
#include <models/model.h>
#include <models/surface_model.h>
#include <element.h>
// Ultimaille
#include <ultimaille/all.h>
// ImGui
#include "imgui.h"
#include "imgui_internal.h"
// Std
#include <iostream>
// Return nring of a facet for a given model
std::vector<int> n_ring(Model &model, int fi, int n) {
// Get mesh from model
auto &m = model.as<PolyModel>().getMesh();
m.connect();
std::vector<int> ring;
std::queue<std::tuple<int, int>> q;
q.push({fi, 0});
FacetAttribute<bool> processed(m);
while (!q.empty()) {
auto [fi, d] = q.front();
auto f = m.facet(fi);
q.pop();
if (processed[fi])
continue;
processed[fi] = true;
if (d >= n)
continue;
for (auto &h : f.iter_halfedges()) {
if (!h.opposite().active())
continue;
auto o = h.opposite().facet();
ring.push_back(o);
q.push({o, d + 1});
}
}
return ring;
}
std::tuple<glm::vec3, glm::vec3> getFacetBBox(Model &model, int fi) {
// Get mesh from model
auto &m = model.as<PolyModel>().getMesh();
// auto f = m.facet(fi);
auto facets = n_ring(model, fi, 4);
vec3 b{0.};
for (auto fi : facets) {
auto f = m.facet(fi);
vec3 cur_b{0.};
for (int lv = 0; lv < f.size(); ++lv)
cur_b += f.vertex(lv).pos();
cur_b /= f.size();
b += cur_b;
}
b /= facets.size();
// Compute highest dist from barycenter
double d = 0.;
for (auto fi : facets) {
auto f = m.facet(fi);
for (int lv = 0; lv < f.size(); ++lv) {
double cur_d = (f.vertex(lv).pos() - b).norm();
if (cur_d > d) {
d = cur_d;
}
}
}
vec3 min = b - vec3(d, d, d);
vec3 max = b + vec3(d, d, d);
return std::make_tuple(glm::vec3(min.x, min.y, min.z), glm::vec3(max.x, max.y, max.z));
}
void jacobian_scaled(Model &model) {
// Get mesh from model
auto &poly_model = model.as<PolyModel>();
auto &m = poly_model.getMesh();
FacetAttribute<double> scaled;
scaled.bind("scaled", poly_model.getSurfaceAttributes(), m);
}