106 qInfo(
"\tCompleting triangulation info...");
115 for (qint32 i = 0; i < this->
ntri; ++i)
117 for ( qint32 j = 0; j < 3; ++j)
119 k = this->
itris(i, j);
121 r(j,0) = this->
rr(k, 0);
122 r(j,1) = this->
rr(k, 1);
123 r(j,2) = this->
rr(k, 2);
132 a = (r.row(1) - r.row(0 )).transpose();
133 b = (r.row(2) - r.row(0)).transpose();
134 this->
tri_nn(i,0) = a(1)*b(2)-a(2)*b(1);
135 this->
tri_nn(i,1) = a(2)*b(0)-a(0)*b(2);
136 this->
tri_nn(i,2) = a(0)*b(1)-a(1)*b(0);
139 size = this->
tri_nn.row(i)*this->
tri_nn.row(i).transpose();
140 size = std::pow(size, 0.5f );
143 this->
tri_nn.row(i) /= size;
146 std::fstream doc(
"./Output/tri_area.dat", std::ofstream::out | std::ofstream::trunc);
154 qInfo(
"Adding additional geometry info\n");
171 std::vector<std::vector<int>> temp_ntri(this->
itris.rows());
172 for (p = 0; p < this->
itris.rows(); p++) {
173 for (k = 0; k < 3; k++) {
174 temp_ntri[this->
itris(p,k)].push_back(p);
178 for (k = 0; k < static_cast<int>(temp_ntri.size()); k++) {
179 neighbor_tri[k] = Eigen::Map<Eigen::VectorXi>(temp_ntri[k].data(), temp_ntri[k].size());
185 std::vector<std::vector<int>> temp_nvert(this->
np);
186 for (k = 0; k < this->
np; k++) {
189 for (c = 0; c < 3; c++) {
195 for (q = 0; q < static_cast<int>(temp_nvert[k].size()); q++) {
196 if (temp_nvert[k][q] == vert) {
203 temp_nvert[k].push_back(vert);
210 for (k = 0; k < this->np; k++) {
211 neighbor_vert[k] = Eigen::Map<Eigen::VectorXi>(temp_nvert[k].data(), temp_nvert[k].size());
298 const QList<int>& targetVertices)
300 QList<MNEBemSurface> results;
302 if (outerSkin.
np <= 0 || outerSkin.
ntri <= 0) {
303 qWarning(
"MNEBemSurface::makeScalpSurfaces - Input surface is empty.");
307 for (
int target : targetVertices) {
308 if (target >= outerSkin.
np) {
319 Eigen::MatrixX3d
rr = surf.
rr.cast<
double>();
320 Eigen::MatrixX3d
nn = surf.
nn.cast<
double>();
323 int nTri = surf.
ntri;
324 std::vector<std::array<int,3>>
tris(nTri);
325 for (
int i = 0; i < nTri; ++i) {
330 int currentNp = surf.
np;
331 std::vector<bool> vertAlive(currentNp,
true);
333 std::vector<int> redirect(currentNp);
334 for (
int i = 0; i < currentNp; ++i)
337 auto resolve = [&](
int v) ->
int {
338 while (redirect[v] != v)
343 while (currentNp > target) {
345 double bestLen = std::numeric_limits<double>::max();
349 for (
int t = 0; t < static_cast<int>(
tris.size()); ++t) {
350 int v0 = resolve(
tris[t][0]);
351 int v1 = resolve(
tris[t][1]);
352 int v2 = resolve(
tris[t][2]);
354 if (v0 == v1 || v1 == v2 || v0 == v2)
357 double d01 = edgeLenSq(
rr, v0, v1);
358 double d12 = edgeLenSq(
rr, v1, v2);
359 double d20 = edgeLenSq(
rr, v2, v0);
361 if (d01 < bestLen) { bestLen = d01; bestTri = t; bestEdge = 0; }
362 if (d12 < bestLen) { bestLen = d12; bestTri = t; bestEdge = 1; }
363 if (d20 < bestLen) { bestLen = d20; bestTri = t; bestEdge = 2; }
370 int va = resolve(
tris[bestTri][bestEdge]);
371 int vb = resolve(
tris[bestTri][(bestEdge + 1) % 3]);
374 rr.row(va) = (
rr.row(va) +
rr.row(vb)) * 0.5;
375 nn.row(va) = (
nn.row(va) +
nn.row(vb)).normalized();
379 vertAlive[vb] =
false;
384 std::vector<int> oldToNew(surf.
np, -1);
386 for (
int i = 0; i < surf.
np; ++i) {
387 if (vertAlive[i] && resolve(i) == i) {
388 oldToNew[i] = newNp++;
393 decimated.
id = surf.
id;
396 decimated.
np = newNp;
400 Eigen::MatrixX3f newNn(newNp, 3);
401 for (
int i = 0; i < surf.
np; ++i) {
402 if (oldToNew[i] >= 0) {
403 newRr.row(oldToNew[i]) =
rr.row(i).cast<
float>();
404 newNn.row(oldToNew[i]) =
nn.row(i).cast<
float>();
407 decimated.
rr = newRr;
408 decimated.
nn = newNn;
411 std::vector<std::array<int,3>> newTris;
412 for (
const auto& tri :
tris) {
413 int a = oldToNew[resolve(tri[0])];
414 int b = oldToNew[resolve(tri[1])];
415 int c = oldToNew[resolve(tri[2])];
416 if (a >= 0 && b >= 0 && c >= 0 && a != b && b != c && a != c) {
417 newTris.push_back({a, b, c});
421 decimated.
ntri =
static_cast<int>(newTris.size());
423 for (
int i = 0; i < decimated.
ntri; ++i) {
424 newItris(i, 0) = newTris[i][0];
425 newItris(i, 1) = newTris[i][1];
426 newItris(i, 2) = newTris[i][2];
428 decimated.
itris = newItris;
433 results.append(decimated);