diff --git a/IsotropicRemesher.cc b/IsotropicRemesher.cc index b2d481d11c25c37a10682791c814e19d32beb146..62d01f1052417e70ad32f18b58bacfa1298b5f22 100644 --- a/IsotropicRemesher.cc +++ b/IsotropicRemesher.cc @@ -29,11 +29,21 @@ void IsotropicRemesher::Remesh(Embedding* embedding, std::function<void (QString, QString, double, double)> screenshot, bool limitflips, StraighteningType strtype, - CollapsingOrder corder) { + CollapsingOrder corder, + bool dataoutput) { debug_hard_stop_ = false; using namespace PluginFunctions; qDebug() << "Running the Isotropic Remeshing algorithm"; auto base_mesh = embedding->GetBaseMesh(); + if (screenshot || dataoutput) { + QDir dir(QString(SCREENSHOT_PATH) + "/target" + QString::number(target_length) + + "-iterations" + QString::number(iterations)); + if (!dir.exists()) { + dir.mkpath("."); + } + } + QFile output_file(QString(SCREENSHOT_PATH) + "/target" + QString::number(target_length) + + "-iterations" + QString::number(iterations) + "/data.txt"); const double inf = std::numeric_limits<double>::infinity(); ACG::Vec3d minCorner = {+inf, +inf, +inf}; @@ -48,12 +58,11 @@ void IsotropicRemesher::Remesh(Embedding* embedding, double high = target_length * alpha * scale; double low = high * beta / alpha; + if (dataoutput) { + output_file.resize(0); + DataOutput(embedding, &output_file, 0.0, 0); + } if (screenshot) { - QDir dir(QString(SCREENSHOT_PATH) + "/target" + QString::number(target_length) - + "-iterations" + QString::number(iterations)); - if (!dir.exists()) { - dir.mkpath("."); - } screenshot(QString("IsoRemesh0_Start"), QString(SCREENSHOT_PATH) + "/target" + QString::number(target_length) + "-iterations" + QString::number(iterations) , @@ -123,8 +132,9 @@ void IsotropicRemesher::Remesh(Embedding* embedding, if (debug_hard_stop_) return; embedding->CleanUpBaseMesh(); qDebug() << "Time elapsed: " << swatchlocal->Delta() << "ms."; + double iteration_time = swatchit->Delta(); qDebug() << "Iteration" << i+1 << " finished, time elapsed: " - << swatchit->Delta() << "ms."; + << iteration_time << "ms."; if (screenshot) { qDebug() << "Iteration" << i+1 << "Screenshot"; screenshot(QString("IsoRemeshIt_") + QString::number(i) + QString(".4Straightening"), @@ -132,6 +142,9 @@ void IsotropicRemesher::Remesh(Embedding* embedding, + "-iterations" + QString::number(iterations) , 0, 0); } + if (dataoutput) { + DataOutput(embedding, &output_file, iteration_time, i+1); + } } qDebug() << "Finished " << iterations << " iterations of Isotropic Remeshing" " with target edge length " << target_length * scale; @@ -1000,3 +1013,75 @@ void IsotropicRemesher::Straightening(Embedding *embedding, StraighteningType st } } } + +/*! + * \brief IsotropicRemesher::DataOutput + * write data about the current iteration into the file + * \param embedding + * \param file + * \param time_elapsed + * \param iteration + */ +void IsotropicRemesher::DataOutput(Embedding *embedding, + QFile* file, + double time_elapsed, + uint iteration) { + if(file->open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) { + auto meta_mesh = embedding->GetMetaMesh(); + auto base_mesh = embedding->GetBaseMesh(); + + unsigned long baseeuler = base_mesh->n_vertices() - base_mesh->n_edges() + + base_mesh->n_faces(); + unsigned long metaeuler = meta_mesh->n_vertices() - meta_mesh->n_edges() + + meta_mesh->n_faces(); + double basegenus = (2-baseeuler)/2.0; + double metagenus = (2-metaeuler)/2.0; + double avgmetaedgelength = 0.0; + for (auto meh : meta_mesh->edges()) { + avgmetaedgelength += embedding->CalculateEdgeLength(meh); + } + avgmetaedgelength /= meta_mesh->n_edges(); + double metaedgelengthdeviation = 0.0; + for (auto meh : meta_mesh->edges()) { + metaedgelengthdeviation += (avgmetaedgelength-embedding->CalculateEdgeLength(meh)) + *(avgmetaedgelength-embedding->CalculateEdgeLength(meh)); + } + metaedgelengthdeviation /= meta_mesh->n_edges(); + double avgvalence = 0.0; + double valencedeviation = 0.0; + for (auto mvh : meta_mesh->vertices()) { + avgvalence += meta_mesh->valence(mvh); + valencedeviation += (6-meta_mesh->valence(mvh))*(6-meta_mesh->valence(mvh)); + } + avgvalence /= meta_mesh->n_vertices(); + valencedeviation /= meta_mesh->n_vertices(); + /* + qDebug() << "Base Mesh- V: " << base_mesh->n_vertices() + << "E: " << base_mesh->n_edges() + << "F: " << base_mesh->n_faces() + << "Eul: " << baseeuler + << "Gen: " << basegenus; + qDebug() << "Meta Mesh- V: " << meta_mesh->n_vertices() + << "E: " << meta_mesh->n_edges() + << "F: " << meta_mesh->n_faces() + << "Eul: " << metaeuler + << "Gen: " << metagenus; + qDebug() << "Embedding- Avg. Edge Length: " << avgmetaedgelength + << " deviation: " << metaedgelengthdeviation + << " avg valence: " << avgvalence + << " deviation from 6: " << valencedeviation; + */ + + QTextStream tstream(file); + tstream << "It-" << iteration + << "|t-" << time_elapsed + << "|bnf-" << base_mesh->n_faces() + << "|mnf-" << meta_mesh->n_faces() + << "|av-" << avgvalence + << "|vsd-" << valencedeviation + << "|ael" << avgmetaedgelength + << "|elsd-" << metaedgelengthdeviation; + tstream << endl; + file->close(); + } +} diff --git a/IsotropicRemesher.hh b/IsotropicRemesher.hh index 2c531f45bfe6374414132f0a4542ae14e2246d12..dc7f0f388ba50e63892a4d5520d9aaf4496f9358 100644 --- a/IsotropicRemesher.hh +++ b/IsotropicRemesher.hh @@ -31,7 +31,8 @@ public: std::function<void (QString, QString, double, double)> screenshot = {}, bool limitflips = false, StraighteningType strtype = PATCHWISE, - CollapsingOrder corder = SPLITWEIGHT); + CollapsingOrder corder = SPLITWEIGHT, + bool dataoutput = true); bool DebugStopStatus() {return debug_hard_stop_;} private: @@ -62,6 +63,8 @@ private: std::list<OpenMesh::HalfedgeHandle> mih_list); void Straightening(Embedding* embedding, StraighteningType strtype = PATCHWISE); + void DataOutput(Embedding* embedding, QFile* file, double time_elapsed, + uint iteration); bool debug_hard_stop_ = false; };