From c825e63762b09b492e383ce1f32b9ac5fd1e25c6 Mon Sep 17 00:00:00 2001 From: djairoh Date: Thu, 30 May 2024 12:32:11 +0200 Subject: [PATCH] feat: date legend --- particle-track-and-trace/src/CMakeLists.txt | 2 + .../src/QT/MainWindow.cpp | 6 ++ .../src/commands/SpawnPointCallback.cpp | 7 --- .../src/layers/TimeLayer.cpp | 40 +++++++++++++ .../src/layers/TimeLayer.h | 21 +++++++ particle-track-and-trace/src/layers/luts.cpp | 58 +++++++++---------- particle-track-and-trace/src/main.cpp | 4 +- 7 files changed, 99 insertions(+), 39 deletions(-) create mode 100644 particle-track-and-trace/src/layers/TimeLayer.cpp create mode 100644 particle-track-and-trace/src/layers/TimeLayer.h diff --git a/particle-track-and-trace/src/CMakeLists.txt b/particle-track-and-trace/src/CMakeLists.txt index 11767a0..2ae525f 100644 --- a/particle-track-and-trace/src/CMakeLists.txt +++ b/particle-track-and-trace/src/CMakeLists.txt @@ -61,6 +61,8 @@ add_executable(ParticleTrackTrace MACOSX_BUNDLE main.cpp layers/enums.h layers/LegendLayer.h layers/LegendLayer.cpp + layers/TimeLayer.h + layers/TimeLayer.cpp layers/luts.cpp layers/luts.h Program.cpp diff --git a/particle-track-and-trace/src/QT/MainWindow.cpp b/particle-track-and-trace/src/QT/MainWindow.cpp index 8935353..fb0217a 100644 --- a/particle-track-and-trace/src/QT/MainWindow.cpp +++ b/particle-track-and-trace/src/QT/MainWindow.cpp @@ -20,6 +20,7 @@ #include "../layers/LGlyphLayer.h" #include "../layers/enums.h" #include "../layers/LegendLayer.h" +#include "../layers/TimeLayer.h" using namespace std; @@ -57,6 +58,11 @@ void MainWindow::setupTechniques() { technique1->addLayer(new LegendLayer(dataPath + "/legends", "COLGLYPH")); technique2->addLayer(new LegendLayer(dataPath + "/legends", "GLYPHCOL")); + // add date/time layer + auto tm = new TimeLayer(); + technique1->addLayer(tm); + technique1->addLayer(tm); + // add Euler layers technique1->addLayer(new EColLayer(uvGrid)); technique2->addLayer(new EGlyphLayer(uvGrid)); diff --git a/particle-track-and-trace/src/commands/SpawnPointCallback.cpp b/particle-track-and-trace/src/commands/SpawnPointCallback.cpp index aa85257..92beb51 100644 --- a/particle-track-and-trace/src/commands/SpawnPointCallback.cpp +++ b/particle-track-and-trace/src/commands/SpawnPointCallback.cpp @@ -9,13 +9,6 @@ #include "../CartographicTransformation.h" -void convertDisplayToWorld(vtkRenderer *renderer, int x, int y, double *worldPos) { - double displayPos[3] = {static_cast(x), static_cast(y), 0.0}; - renderer->SetDisplayPoint(displayPos); - renderer->DisplayToWorld(); - renderer->GetWorldPoint(worldPos); -} - void SpawnPointCallback::Execute(vtkObject *caller, unsigned long evId, void *callData) { // Note the use of reinterpret_cast to cast the caller to the expected type. auto interactor = reinterpret_cast(caller); diff --git a/particle-track-and-trace/src/layers/TimeLayer.cpp b/particle-track-and-trace/src/layers/TimeLayer.cpp new file mode 100644 index 0000000..af3f990 --- /dev/null +++ b/particle-track-and-trace/src/layers/TimeLayer.cpp @@ -0,0 +1,40 @@ +#include "TimeLayer.h" +#include + +using std::string; + +TimeLayer::TimeLayer() { + this->ren = vtkSmartPointer::New(); + this->ren->SetLayer(4); + + this->years = 0; + this->lastT = 0; + + this->textActor = vtkSmartPointer::New(); + this->textActor->SetDisplayPosition(10, 10); + vtkSmartPointer textProp = this->textActor->GetTextProperty(); + textProp->SetFontFamilyToArial(); + textProp->BoldOn(); + textProp->SetFontSize(16); + textProp->ShadowOff(); + textProp->SetColor(0,0,0); + + ren->AddActor(this->textActor); +} + +string TimeLayer::secondsToDate(int t) { + if (t < lastT) this->years++; + + int hours = t /3600; + int days = hours / 24; + + this->lastT = t; + return string("year " + std::to_string(years) + ", day " + std::to_string(days)); + // return string("seconds " + std::to_string(t)); +} + + +void TimeLayer::updateData(int t) { + this->textActor->SetInput(secondsToDate(t).c_str()); + this->textActor->Modified(); +} diff --git a/particle-track-and-trace/src/layers/TimeLayer.h b/particle-track-and-trace/src/layers/TimeLayer.h new file mode 100644 index 0000000..1660dfb --- /dev/null +++ b/particle-track-and-trace/src/layers/TimeLayer.h @@ -0,0 +1,21 @@ +#ifndef TIMELAYER_H +#define TIMELAYER_H + +#include "Layer.h" +#include + +class TimeLayer : public Layer { +private: + std::string secondsToDate(int t); + int years; + int lastT; + vtkSmartPointer textActor; + +public: + TimeLayer(); + void updateData(int t) override; + +}; + + +#endif diff --git a/particle-track-and-trace/src/layers/luts.cpp b/particle-track-and-trace/src/layers/luts.cpp index 855228b..144cdaf 100644 --- a/particle-track-and-trace/src/layers/luts.cpp +++ b/particle-track-and-trace/src/layers/luts.cpp @@ -196,16 +196,16 @@ vtkSmartPointer buildDensityComplementary() { int idx=0; for (double opacity=0.5; opacity <= 1.0; opacity+=0.05) { - lut->SetTableValue(idx++, 0.0, 0.27058823529411763, 0.1607843137254902, opacity); - lut->SetTableValue(idx++, 0.0, 0.3911572472126105, 0.20901191849288736, opacity); - lut->SetTableValue(idx++, 0.10388312187620147, 0.4909496347558632, 0.2513033448673587, opacity); - lut->SetTableValue(idx++, 0.21568627450980393, 0.6196078431372549, 0.330718954248366, opacity); - lut->SetTableValue(idx++, 0.3724721261053441, 0.7283044982698962, 0.424559784698193, opacity); - lut->SetTableValue(idx++, 0.5651364859669358, 0.8175009611687812, 0.5119723183391004, opacity); - lut->SetTableValue(idx++, 0.7359477124183007, 0.8915032679738563, 0.5843137254901961, opacity); - lut->SetTableValue(idx++, 0.8795847750865051, 0.9526182237600923, 0.6601922337562476, opacity); - lut->SetTableValue(idx++, 0.9724413687043445, 0.9896655132641292, 0.7464667435601692, opacity); lut->SetTableValue(idx++, 1.0, 1.0, 0.8980392156862745, opacity); + lut->SetTableValue(idx++, 0.9724413687043445, 0.9896655132641292, 0.7464667435601692, opacity); + lut->SetTableValue(idx++, 0.8795847750865051, 0.9526182237600923, 0.6601922337562476, opacity); + lut->SetTableValue(idx++, 0.7359477124183007, 0.8915032679738563, 0.5843137254901961, opacity); + lut->SetTableValue(idx++, 0.5651364859669358, 0.8175009611687812, 0.5119723183391004, opacity); + lut->SetTableValue(idx++, 0.3724721261053441, 0.7283044982698962, 0.424559784698193, opacity); + lut->SetTableValue(idx++, 0.21568627450980393, 0.6196078431372549, 0.330718954248366, opacity); + lut->SetTableValue(idx++, 0.10388312187620147, 0.4909496347558632, 0.2513033448673587, opacity); + lut->SetTableValue(idx++, 0.0, 0.3911572472126105, 0.20901191849288736, opacity); + lut->SetTableValue(idx++, 0.0, 0.27058823529411763, 0.1607843137254902, opacity); } lut->UseBelowRangeColorOn(); @@ -225,16 +225,16 @@ vtkSmartPointer buildDensityContrasting() { int idx=0; for (double opacity=0.5; opacity <= 1.0; opacity+=0.05) { - lut->SetTableValue(idx++, 0.267004, 0.004874, 0.329415, opacity); - lut->SetTableValue(idx++, 0.281412, 0.155834, 0.469201, opacity); - lut->SetTableValue(idx++, 0.244972, 0.287675, 0.53726, opacity); - lut->SetTableValue(idx++, 0.190631, 0.407061, 0.556089, opacity); - lut->SetTableValue(idx++, 0.147607, 0.511733, 0.557049, opacity); - lut->SetTableValue(idx++, 0.119699, 0.61849, 0.536347, opacity); - lut->SetTableValue(idx++, 0.20803, 0.718701, 0.472873, opacity); - lut->SetTableValue(idx++, 0.430983, 0.808473, 0.346476, opacity); - lut->SetTableValue(idx++, 0.709898, 0.868751, 0.169257, opacity); lut->SetTableValue(idx++, 0.993248, 0.906157, 0.143936, opacity); + lut->SetTableValue(idx++, 0.709898, 0.868751, 0.169257, opacity); + lut->SetTableValue(idx++, 0.430983, 0.808473, 0.346476, opacity); + lut->SetTableValue(idx++, 0.20803, 0.718701, 0.472873, opacity); + lut->SetTableValue(idx++, 0.119699, 0.61849, 0.536347, opacity); + lut->SetTableValue(idx++, 0.147607, 0.511733, 0.557049, opacity); + lut->SetTableValue(idx++, 0.190631, 0.407061, 0.556089, opacity); + lut->SetTableValue(idx++, 0.244972, 0.287675, 0.53726, opacity); + lut->SetTableValue(idx++, 0.281412, 0.155834, 0.469201, opacity); + lut->SetTableValue(idx++, 0.267004, 0.004874, 0.329415, opacity); } lut->UseBelowRangeColorOn(); @@ -254,16 +254,16 @@ vtkSmartPointer buildDensityMonochromatic() { int idx=0; for (double opacity=0.5; opacity <= 1.0; opacity+=0.05) { - lut->SetTableValue(idx++, 0.0, 0.26666666666666666, 0.10588235294117647, opacity); - lut->SetTableValue(idx++, 0.0, 0.4079046520569012, 0.16444444444444445, opacity); - lut->SetTableValue(idx++, 0.10388312187620147, 0.5164936562860438, 0.2467512495194156, opacity); - lut->SetTableValue(idx++, 0.21568627450980393, 0.6287581699346405, 0.3333333333333333, opacity); - lut->SetTableValue(idx++, 0.36392156862745095, 0.7240292195309497, 0.4181468665897732, opacity); - lut->SetTableValue(idx++, 0.5351787773933102, 0.8060899653979239, 0.5287504805843906, opacity); - lut->SetTableValue(idx++, 0.681045751633987, 0.8718954248366013, 0.6562091503267974, opacity); - lut->SetTableValue(idx++, 0.8089965397923875, 0.9251672433679354, 0.7834525182622069, opacity); - lut->SetTableValue(idx++, 0.9066205305651672, 0.9641214917339485, 0.8884429065743944, opacity); lut->SetTableValue(idx++, 0.9686274509803922, 0.9882352941176471, 0.9607843137254902, opacity); + lut->SetTableValue(idx++, 0.9066205305651672, 0.9641214917339485, 0.8884429065743944, opacity); + lut->SetTableValue(idx++, 0.8089965397923875, 0.9251672433679354, 0.7834525182622069, opacity); + lut->SetTableValue(idx++, 0.681045751633987, 0.8718954248366013, 0.6562091503267974, opacity); + lut->SetTableValue(idx++, 0.5351787773933102, 0.8060899653979239, 0.5287504805843906, opacity); + lut->SetTableValue(idx++, 0.36392156862745095, 0.7240292195309497, 0.4181468665897732, opacity); + lut->SetTableValue(idx++, 0.21568627450980393, 0.6287581699346405, 0.3333333333333333, opacity); + lut->SetTableValue(idx++, 0.10388312187620147, 0.5164936562860438, 0.2467512495194156, opacity); + lut->SetTableValue(idx++, 0.0, 0.4079046520569012, 0.16444444444444445, opacity); + lut->SetTableValue(idx++, 0.0, 0.26666666666666666, 0.10588235294117647, opacity); } lut->UseBelowRangeColorOn(); @@ -283,8 +283,8 @@ vtkSmartPointer buildDensityDesaturated() { lut->Build(); vtkNew colorTransferFunction; - colorTransferFunction->AddRGBPoint(0, 0.313725, 0.313725, 0.313725); - colorTransferFunction->AddRGBPoint(9, 0.909804, 0.909804, 0.909804); + colorTransferFunction->AddRGBPoint(0, 0.909804, 0.909804, 0.909804); + colorTransferFunction->AddRGBPoint(9, 0.313725, 0.313725, 0.313725); double c[3]; int idx=0; diff --git a/particle-track-and-trace/src/main.cpp b/particle-track-and-trace/src/main.cpp index 67cd558..c958410 100644 --- a/particle-track-and-trace/src/main.cpp +++ b/particle-track-and-trace/src/main.cpp @@ -2,10 +2,8 @@ #include #include "QT/MainWindow.h" -// TODO: add a widget to act as legend. This is fourfold: LCol-density, Lcol-age, ECol-strength? -// TODO: add text widget showing simulation time (in days/weeks/months from 0). -// TODO: make Lagrangian Layers share one vtkPoints for seemless technique switching // TODO: make LColLayer use a modified spawnpointCallback to spawn multiple particles per interaction +// TODO: make Lagrangian Layers share one vtkPoints for seemless technique swiching // TODO: add text gui explaining the above? // TODO: yoink Robin's isNearestNeighbourZero function to improve beaching // TODO: add a button to reset the simulation - set time=0 and reset points array of particles.