121 qInfo(
"\tCompleting triangulation info...");
130 for (qint32 i = 0; i < this->
ntri; ++i)
132 for ( qint32 j = 0; j < 3; ++j)
134 k = this->
itris(i, j);
136 r(j,0) = this->
rr(k, 0);
137 r(j,1) = this->
rr(k, 1);
138 r(j,2) = this->
rr(k, 2);
147 a = (r.row(1) - r.row(0 )).transpose();
148 b = (r.row(2) - r.row(0)).transpose();
149 this->
tri_nn(i,0) = a(1)*b(2)-a(2)*b(1);
150 this->
tri_nn(i,1) = a(2)*b(0)-a(0)*b(2);
151 this->
tri_nn(i,2) = a(0)*b(1)-a(1)*b(0);
154 size = this->
tri_nn.row(i)*this->
tri_nn.row(i).transpose();
155 size = std::pow(size, 0.5f );
158 this->
tri_nn.row(i) /= size;
161 std::fstream doc(
"./Output/tri_area.dat", std::ofstream::out | std::ofstream::trunc);
169 qInfo(
"Adding additional geometry info\n");
186 std::vector<std::vector<int>> temp_ntri(this->
itris.rows());
187 for (p = 0; p < this->
itris.rows(); p++) {
188 for (k = 0; k < 3; k++) {
189 temp_ntri[this->
itris(p,k)].push_back(p);
193 for (k = 0; k < static_cast<int>(temp_ntri.size()); k++) {
194 neighbor_tri[k] = Eigen::Map<Eigen::VectorXi>(temp_ntri[k].data(), temp_ntri[k].size());
200 std::vector<std::vector<int>> temp_nvert(this->
np);
201 for (k = 0; k < this->
np; k++) {
204 for (c = 0; c < 3; c++) {
210 for (q = 0; q < static_cast<int>(temp_nvert[k].size()); q++) {
211 if (temp_nvert[k][q] == vert) {
218 temp_nvert[k].push_back(vert);
225 for (k = 0; k < this->np; k++) {
226 neighbor_vert[k] = Eigen::Map<Eigen::VectorXi>(temp_nvert[k].data(), temp_nvert[k].size());
313 const QList<int>& targetVertices)
315 QList<MNEBemSurface> results;
317 if (outerSkin.
np <= 0 || outerSkin.
ntri <= 0) {
318 qWarning(
"MNEBemSurface::makeScalpSurfaces - Input surface is empty.");
322 for (
int target : targetVertices) {
323 if (target >= outerSkin.
np) {
334 Eigen::MatrixX3d
rr = surf.
rr.cast<
double>();
335 Eigen::MatrixX3d
nn = surf.
nn.cast<
double>();
338 int nTri = surf.
ntri;
339 std::vector<std::array<int,3>>
tris(nTri);
340 for (
int i = 0; i < nTri; ++i) {
345 int currentNp = surf.
np;
346 std::vector<bool> vertAlive(currentNp,
true);
348 std::vector<int> redirect(currentNp);
349 for (
int i = 0; i < currentNp; ++i)
352 auto resolve = [&](
int v) ->
int {
353 while (redirect[v] != v)
358 while (currentNp > target) {
360 double bestLen = std::numeric_limits<double>::max();
364 for (
int t = 0; t < static_cast<int>(
tris.size()); ++t) {
365 int v0 = resolve(
tris[t][0]);
366 int v1 = resolve(
tris[t][1]);
367 int v2 = resolve(
tris[t][2]);
369 if (v0 == v1 || v1 == v2 || v0 == v2)
372 double d01 = edgeLenSq(
rr, v0, v1);
373 double d12 = edgeLenSq(
rr, v1, v2);
374 double d20 = edgeLenSq(
rr, v2, v0);
376 if (d01 < bestLen) { bestLen = d01; bestTri = t; bestEdge = 0; }
377 if (d12 < bestLen) { bestLen = d12; bestTri = t; bestEdge = 1; }
378 if (d20 < bestLen) { bestLen = d20; bestTri = t; bestEdge = 2; }
385 int va = resolve(
tris[bestTri][bestEdge]);
386 int vb = resolve(
tris[bestTri][(bestEdge + 1) % 3]);
389 rr.row(va) = (
rr.row(va) +
rr.row(vb)) * 0.5;
390 nn.row(va) = (
nn.row(va) +
nn.row(vb)).normalized();
394 vertAlive[vb] =
false;
399 std::vector<int> oldToNew(surf.
np, -1);
401 for (
int i = 0; i < surf.
np; ++i) {
402 if (vertAlive[i] && resolve(i) == i) {
403 oldToNew[i] = newNp++;
408 decimated.
id = surf.
id;
411 decimated.
np = newNp;
415 Eigen::MatrixX3f newNn(newNp, 3);
416 for (
int i = 0; i < surf.
np; ++i) {
417 if (oldToNew[i] >= 0) {
418 newRr.row(oldToNew[i]) =
rr.row(i).cast<
float>();
419 newNn.row(oldToNew[i]) =
nn.row(i).cast<
float>();
422 decimated.
rr = newRr;
423 decimated.
nn = newNn;
426 std::vector<std::array<int,3>> newTris;
427 for (
const auto& tri :
tris) {
428 int a = oldToNew[resolve(tri[0])];
429 int b = oldToNew[resolve(tri[1])];
430 int c = oldToNew[resolve(tri[2])];
431 if (a >= 0 && b >= 0 && c >= 0 && a != b && b != c && a != c) {
432 newTris.push_back({a, b, c});
436 decimated.
ntri =
static_cast<int>(newTris.size());
438 for (
int i = 0; i < decimated.
ntri; ++i) {
439 newItris(i, 0) = newTris[i][0];
440 newItris(i, 1) = newTris[i][1];
441 newItris(i, 2) = newTris[i][2];
443 decimated.
itris = newItris;
448 results.append(decimated);